Browse Source

魔盒支持西班牙语以及俄语,OLED依旧只有中英两种语言

felix 1 year ago
parent
commit
af5d480eb6
24 changed files with 842 additions and 89 deletions
  1. 32 8
      Vinno.FIS.Sonopost/Assets/wwwroot/components/NetworkSettingForm.html
  2. 1 1
      Vinno.FIS.Sonopost/Assets/wwwroot/components/WifiConnectionItem.html
  3. 28 2
      Vinno.FIS.Sonopost/Assets/wwwroot/css/index.css
  4. 2 1
      Vinno.FIS.Sonopost/Assets/wwwroot/index.html
  5. 28 12
      Vinno.FIS.Sonopost/Assets/wwwroot/js/index.js
  6. 2 5
      Vinno.FIS.Sonopost/Assets/wwwroot/lang/en-us.json
  7. 250 0
      Vinno.FIS.Sonopost/Assets/wwwroot/lang/es-es.json
  8. 250 0
      Vinno.FIS.Sonopost/Assets/wwwroot/lang/ru-ru.json
  9. 24 27
      Vinno.FIS.Sonopost/Assets/wwwroot/lang/zh-cn.json
  10. 23 3
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/capture.html
  11. 16 0
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/sono.html
  12. 8 0
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/station.html
  13. 43 11
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/camera01.html
  14. 17 1
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/camera02.html
  15. 26 7
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/mic.html
  16. 19 2
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/sono.html
  17. 8 3
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/network/advance.html
  18. 2 2
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/network/wifi.html
  19. 17 1
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/server/login.html
  20. 1 1
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/server/vcloudloginmode.html
  21. 16 0
      Vinno.FIS.Sonopost/Assets/wwwroot/pages/system/oledlang.html
  22. 3 1
      Vinno.FIS.Sonopost/Features/Oled/OledMessages.cs
  23. 2 0
      Vinno.FIS.Sonopost/Vinno.FIS.Sonopost.csproj
  24. 24 1
      Vinno.FIS.Sonopost/WebApi/Controllers/SystemController.cs

+ 32 - 8
Vinno.FIS.Sonopost/Assets/wwwroot/components/NetworkSettingForm.html

@@ -21,17 +21,41 @@
             width: 70px;
         }
 
-        .lang-en .netsetform-com .layui-form-item .layui-form-label {
-            width: 105px;
-        }
-
         .lang-cn .netsetform-com .layui-form-item .layui-input-block {
             margin-left: 105px;
         }
 
+        .lang-en .netsetform-com .layui-form-item .layui-form-label {
+            width: 105px;
+        }
+
         .lang-en .netsetform-com .layui-form-item .layui-input-block {
             margin-left: 140px;
         }
+
+        .lang-ru .netsetform-com .layui-form-item .layui-form-label {
+            width: 115px;
+        }
+
+        .lang-ru .netsetform-com .layui-form-item .layui-input-block {
+            margin-left: 150px;
+        }
+
+        .lang-es .netsetform-com .layui-form-item .layui-form-label {
+            width: 115px;
+        }
+
+        .lang-es .netsetform-com .layui-form-item .layui-input-block {
+            margin-left: 150px;
+        }
+
+        .lang-es .netsetform-com .layui-form-item .needwrapInES {
+            margin-top: -10px;
+        }
+
+        .lang-ru .netsetform-com .layui-form-item .needwrapInRU {
+            margin-top: -10px;
+        }
     </style>
     <script type="text/html" id="tplNetworkSettingForm">
         <div class="netsetform-com sonopost-card layui-form page-form">
@@ -48,7 +72,7 @@
                 <div class="layui-form-item" style="padding-left: 20px;">
                     <div class="layui-inline">
                         <input type="checkbox" name="EnableDHCP" lay-filter="EnableDHCP" lay-skin="switch" />
-                        <label class="layui-form-label" style="float: right;" data-content="EnableDHCP"></label>
+                        <label class="layui-form-label" style="float: right; width:150px" data-content="EnableDHCP"></label>
                     </div>
                 </div>
                 <div class="manual-items layui-anim layui-anim-scale">
@@ -60,21 +84,21 @@
                         </div>
                     </div>
                     <div class="layui-form-item">
-                        <label class="layui-form-label" data-content="SubnetMask"></label>
+                        <label class="layui-form-label needwrapInES" data-content="SubnetMask"></label>
                         <div class="layui-input-block">
                             <input type="text" name="SubnetMask" lay-verify="field_required|ipv4" required-field="SubnetMask" lay-filter="SubnetMask" maxlength="15" autocomplete="off"
                                    class="layui-input">
                         </div>
                     </div>
                     <div class="layui-form-item">
-                        <label class="layui-form-label" data-content="DefaultGateway"></label>
+                        <label class="layui-form-label needwrapInES" data-content="DefaultGateway"></label>
                         <div class="layui-input-block">
                             <input type="text" name="Gateway" lay-verify="field_required|ipv4" required-field="Gateway" lay-filter="Gateway" maxlength="15"
                                    autocomplete="off" class="layui-input">
                         </div>
                     </div>
                     <div class="layui-form-item">
-                        <label class="layui-form-label" data-content="PreferredDNS"></label>
+                        <label class="layui-form-label needwrapInRU" data-content="PreferredDNS"></label>
                         <div class="layui-input-block">
                             <input type="text" name="PreferredDNS" lay-verify="field_required|ipv4" required-field="PreferredDNS" lay-filter="PreferredDNS" maxlength="15"
                                    autocomplete="off" class="layui-input">

+ 1 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/components/WifiConnectionItem.html

@@ -72,7 +72,7 @@
                 <div class="name ftbold"></div>
                 <div class="state">
                     <i class="layui-icon layui-icon-ok color-ft-primary ftbold"></i>
-                    <span>已连接</span>
+                    <span data-content="Connected"></span>
                 </div>
             </div>
             <div class="wifi-connection-item_action layui-anim layui-anim-scaleSpring">

+ 28 - 2
Vinno.FIS.Sonopost/Assets/wwwroot/css/index.css

@@ -149,14 +149,40 @@
     width: calc(300px + 20px);
 }
 
-.layui-nav-tree .layui-nav-item a {
+.lang-cn .layui-nav-tree .layui-nav-item a {
     padding-left: 50px;
 }
 
-.layui-nav-tree .layui-nav-item .layui-nav-child a {
+.lang-cn .layui-nav-tree .layui-nav-item .layui-nav-child a {
     padding-left: 70px;
 }
 
+.lang-en .layui-nav-tree .layui-nav-item a {
+    padding-left: 50px;
+}
+
+.lang-en .layui-nav-tree .layui-nav-item .layui-nav-child a {
+    padding-left: 70px;
+}
+
+.lang-ru .layui-nav-tree .layui-nav-item a {
+    padding-left: 20px;
+}
+
+.lang-ru .layui-nav-tree .layui-nav-item .layui-nav-child a {
+    padding-left: 30px;
+}
+
+.lang-es .layui-nav-tree .layui-nav-item a {
+    padding-left: 20px;
+}
+
+.lang-es .layui-nav-tree .layui-nav-item .layui-nav-child a {
+    padding-left: 30px;
+}
+
+
+
 .layui-input.layui-disabled {
     background-color: #eee !important;
     color: #d2d2d2 !important;

+ 2 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/index.html

@@ -30,6 +30,8 @@
                     <dl class="layui-nav-child lang-selector">
                         <dd><a href="javascript:;" data-lang="zh-cn">中文</a></dd>
                         <dd><a href="javascript:;" data-lang="en-us">English</a></dd>
+                        <dd><a href="javascript:;" data-lang="ru-ru">Русский</a></dd>
+                        <dd><a href="javascript:;" data-lang="es-es">Español</a></dd>
                     </dl>
                 </li>
             </ul>
@@ -52,5 +54,4 @@
     <script src="js/prepare.js?v=202103231659"></script>
     <script src="js/index.js?v=202103231659"></script>
 </body>
-
 </html>

+ 28 - 12
Vinno.FIS.Sonopost/Assets/wwwroot/js/index.js

@@ -136,8 +136,13 @@ $(async function () {
 
         async function checkLanguageClass(app) {
             let isCN = locale.isCurrentChinese();
-            app.el.toggleClass("lang-en", !isCN);
+            let isUS = locale.isCurrentEnglish();
+            let isRU = locale.isCurrentRussian();
+            let isES = locale.isCurrentSpanish();
+            app.el.toggleClass("lang-en", isUS);
             app.el.toggleClass("lang-cn", isCN);
+            app.el.toggleClass("lang-ru", isRU);
+            app.el.toggleClass("lang-es", isES);
         }
         async function afterInitRender(app) {
             let isLogged = await checkIsLogon();
@@ -514,6 +519,8 @@ $(async function () {
         const langKeys = {
             CN: 'zh-cn',
             EN: 'en-us',
+            RU: 'ru-ru',
+            ES: 'es-es',
         };
         const supportLanguages = Object.entries(langKeys)
             .map(x => x[1]);
@@ -524,9 +531,15 @@ $(async function () {
             layer.msg.error($t(res.Code));
             return;
         }
-        let curLang = langKeys.CN;
-        if (res.Data != langKeys.CN) {
-            curLang = langKeys.EN;
+        let curLang = langKeys.EN;
+        if (res.Data == langKeys.CN) {
+            curLang = langKeys.CN;
+        }
+        else if (res.Data == langKeys.RU) {
+            curLang = langKeys.RU;
+        }
+        else if (res.Data == langKeys.ES) {
+            curLang = langKeys.ES;
         }
 
         loadData(curLang)
@@ -557,14 +570,14 @@ $(async function () {
                 el.text(translate(value));
             });
             layui.form.render();
-            $(".layui-select-tips")
-                .text(translate('SelectTips'));
-            $(".layui-select-title input")
-                .attr("placeholder", translate('SelectTips'));
-            $(".layui-unselect")
-                .attr("placeholder", translate('SelectTips'));
-            $(".layui-unselect dd.layui-disabled")
-                .text(translate("HasNotAnyOptions"));
+            //$(".layui-select-tips")
+            //    .text(translate('SelectTips'));
+            //$(".layui-select-title input")
+            //    .attr("placeholder", translate('SelectTips'));
+            //$(".layui-unselect")
+            //    .attr("placeholder", translate('SelectTips'));
+            //$(".layui-unselect dd.layui-disabled")
+            //    .text(translate("HasNotAnyOptions"));
         }
         async function loadData(lang) {
             data = await $.getJSON(`/lang/${lang}.json?t=${sessionId}`) || {};
@@ -595,6 +608,9 @@ $(async function () {
             translatePage: translatePage,
             currentLanguage: () => curLang,
             isCurrentChinese: () => curLang === langKeys.CN,
+            isCurrentEnglish: () => curLang === langKeys.EN,
+            isCurrentRussian: () => curLang === langKeys.RU,
+            isCurrentSpanish: () => curLang === langKeys.ES,
         }
     }
 

+ 2 - 5
Vinno.FIS.Sonopost/Assets/wwwroot/lang/en-us.json

@@ -8,11 +8,11 @@
   "PageTitle4ServerLogin": "Cloud server login",
   "PageTitle4ServerRegister": "Create account",
   "PageTitle4ServerNetCheck": "Network detection",
-  "PageTitle4LiveSono": "Sono live setting",
+  "PageTitle4LiveSono": "US Machine live setting",
   "PageTitle4LiveCamera01": "Camera live setting",
   "PageTitle4LiveCamera02": "Camera02 live setting",
   "PageTitle4LiveMic": "Mic live setting",
-  "PageTitle4DicomSono": "Sono dicom setting",
+  "PageTitle4DicomSono": "US Mahcine dicom setting",
   "PageTitle4DicomStation": "Station dicom setting",
   "PageTitle4DicomFailList": "Transfer failure list",
   "PageTitle4NetworkWire": "Wired network setting",
@@ -28,7 +28,6 @@
   "PageTitle4ServerLoginModeSelection": "Login Mode Selection",
   "PageDesc4ServerLoginModeSelection": "Please select the vCloud service login mode.In default mode, you can login without the account and password.",
   "PageDesc4ServerLogin": "You need to select the vCloud server of sonopost to successfully log in the vCloud service. After the QR code appears in sonopost, indicating that the vCloud service has been logged in successfully",
-  "PageDesc4ServerRegister": "You need to create a new account for sonopost when the first time to install it",
   "PageDesc4ServerNetCheck": "When sonopost fails to log in due to various reasons, the network detection and troubleshooting can be carried out",
   "PageDesc4LiveSono": "Enable the live broadcast of the ultrasonic machine, select the appropriate resolution and save it, then you can watch the real-time live broadcast of the ultrasonic machine",
   "PageDesc4LiveCamera01": "Enable camera live broadcast, select the appropriate resolution and save it, then you can watch the scanning image",
@@ -77,8 +76,6 @@
   "PatientId": "Patient Id",
   "Name": "Name",
   "CreateTime": "Create time",
-  "SonoHDInput": "HD Input",
-  "SonoSDInput": "SD Input",
   "IPAddress": "IP address",
   "SubnetMask": "Subnet mask",
   "Gateway": "Default Gateway",

+ 250 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/lang/es-es.json

@@ -0,0 +1,250 @@
+{
+  "AppName": "Sonopost",
+  "MenuTitle4Server": "Inicio de sesión en el servidor",
+  "MenuTitle4Live": "Configuración En vivo",
+  "MenuTitle4Dicom": "Configuración Diagnóstico",
+  "MenuTitle4Network": "Configuraciones de red",
+  "MenuTitle4System": "Configuración del sistema",
+  "PageTitle4ServerLogin": "Inicio de sesión en el servidor",
+  "PageTitle4ServerRegister": "Crear una cuenta",
+  "PageTitle4ServerNetCheck": "Prueba de red",
+  "PageTitle4LiveSono": "Configuración del ecógrafo",
+  "PageTitle4LiveCamera01": "Configuración de la cámara",
+  "PageTitle4LiveCamera02": "Configuración de la cámara2",
+  "PageTitle4LiveMic": "Configuración del micrófono",
+  "PageTitle4DicomSono": "Ecógrafo DICOM",
+  "PageTitle4DicomStation": "Estaciones de trabajo DICOM",
+  "PageTitle4DicomFailList": "Lista de fallos de transferencia",
+  "PageTitle4NetworkWire": "La conexión de red por cable",
+  "PageTitle4NetworkWifi": "La conexión de red inalámbrica",
+  "PageTitle4NetworkDNS": "Refrescar DNS",
+  "PageTitle4NetworkAdvance": "Configuración avanzada",
+  "PageTitle4SystemReboot": "Reiniciar Sonopost",
+  "PageTitle4SystemRecover": "Restablecer la configuración de fábrica",
+  "PageTitle4SystemOledLang": "Ajustes de idioma de la minipantalla",
+  "PageTitle4SystemLog": "Registro del sistema",
+  "PageTitle4SystemVersion": "información sobre la versión",
+  "PageTitle4RainbowImage": "Configuración de la monitorización del gráfico Rainbow",
+  "PageTitle4ServerLoginModeSelection": "Opciones de inicio de sesión",
+  "PageDesc4ServerLoginModeSelection": "Seleccione el modo de inicio de sesión del servicio en la nube. El modo predeterminado le permite iniciar sesión directamente sin introducir la contraseña de la cuenta.",
+  "PageDesc4ServerLogin": "Por favor, seleccione el servidor en la nube con el fin de iniciar sesión con éxito en el servicio en la nube, después de que aparezca el código QR, significa Sonopost iniciado sesión con éxito en el servicio en la nube.",
+  "PageDesc4ServerNetCheck": "Si Sonopost no inicia sesión por cualquier motivo, puede realizar una prueba de red para investigar la causa.",
+  "PageDesc4LiveSono": "Habilite la emisión en directo del ecógrafo, seleccione la resolución adecuada y guárdela, podrá ver la pantalla en directo del ecógrafo en tiempo real",
+  "PageDesc4LiveCamera01": "Active la cámara, seleccione la resolución adecuada y guarde para ver la pantalla de la cámara",
+  "PageDesc4LiveCamera02": "Active la cámara2, seleccione la resolución adecuada y guarde para ver la pantalla de la cámara",
+  "PageDesc4LiveMic": "Activa el micrófono para capturar audio durante la retransmisión en directo.",
+  "PageDesc4DicomSono": "Habilite DICOM para transferir imágenes o vídeos almacenados en el ecógrafo a la lista de diagnóstico del servicio en la nube.",
+  "PageDesc4DicomFailList": "Los diagnósticos pueden fallar al transmitirse debido a fluctuaciones de la red, seleccione el caso relevante de esta lista y retransmita.",
+  "PageDesc4DicomStation": "Habilitar las conexiones DICOM de la estación de trabajo para reenviar las imágenes o el vídeo cargados por el ecógrafo a la estación de trabajo a través de Sonopost.",
+  "PageDesc4NetworkWifi": "En un entorno Wifi, puedes buscar una red Wifi y conectarte a ella",
+  "PageDesc4NetworkAdvance": "Si Sonopost está conectado tanto a la red externa como a la interna, la red externa al servicio en la nube y la red interna al almacenamiento DICOM del ecógrafo, deberá activar esta configuración",
+  "DeviceBindingQrCodeGuide": "Utilice Flyinsono para escanear el código de barras o ingrese manualmente el código único para vincular el dispositivo.",
+  "Testingsuccessfully": "Prueba superada",
+  "VCloudTestTimeoutError": "La prueba ha fallado o se ha interrumpido la conexión",
+  "NetworkStatusTestError1": "Compruebe si ha enchufado un cable de red o se ha conectado a una red inalámbrica.",
+  "NetworkStatusTestError2": "No se puede acceder a los recursos de la red, compruebe si la velocidad actual de la red cumple los requisitos, si el cortafuegos de la red está configurado con permisos de lista blanca o lista negra.",
+  "NetworkStatusTestError3": "Si no puede resolver el DNS, por favor asegúrese de que la velocidad actual de Internet cumple con los requisitos y compruebe si la dirección del servidor es correcta. Si el DNS sigue sin poder resolverse, ve a la página de configuración de la conexión de red para actualizar la caché de DNS y comprueba la configuración de DNS de tu red.",
+  "vCloudServerConnectionTestError1": "No se puede conectar al servicio en la nube, compruebe si la velocidad actual de la red cumple los requisitos y confirme que la red conectada a esta máquina puede acceder al puerto externo del servicio en la nube.",
+  "vCloudServerConnectionTestError2": "El software Sonopost es demasiado bajo, por favor, compruebe si hay actualizaciones y actualícelo",
+  "RemedicalServiceTestError1": "El servicio de almacenamiento remoto de imágenes no está activado",
+  "RemedicalServiceTestError2": "No se puede obtener el puerto de almacenamiento de imagen remota, por favor, póngase en contacto con los ingenieros de post-venta para tratar con él",
+  "RemedicalServiceTestError3": "No se puede conectar al puerto de almacenamiento remoto de imágenes, compruebe si la velocidad actual de la red cumple los requisitos y asegúrese de que la red a la que está conectada la máquina puede acceder al puerto externo de almacenamiento remoto de imágenes.",
+  "LiveUsServiceTestError1": "El servicio de transmisión de vídeo en directo no está activado",
+  "LiveUsServiceTestError2": "No se puede obtener el puerto de transmisión de vídeo en directo, por favor, póngase en contacto con el ingeniero de post-venta para resolver el problema.",
+  "LiveUsServiceTestError3": "No se puede conectar al servicio de transmisión de vídeo en directo, compruebe si la velocidad actual de la red cumple los requisitos y asegúrese de que la red a la que está conectada la máquina puede acceder al puerto externo del servicio de transmisión de vídeo en directo.",
+  "Account": "nombre de usuario",
+  "Password": "contraseña",
+  "ServerAddress": "dirección del servidor",
+  "ServerPort": "puerto del servidor",
+  "HospitalName": "Nombre del hospital",
+  "DeviceModel": "Modelo de equipo",
+  "SelectServer": "Seleccionar servidor",
+  "Login": "Iniciar sesión",
+  "CreateAndLogin": "Crear e iniciar sesión",
+  "Disconnect": "Desconecte",
+  "FlyinsonoServer": "Servidor Flyinsono",
+  "CloudServerInChina": "Servidor en China",
+  "CloudServerInGermany": "Servidores alemanes",
+  "CloudServerInHongKong": "Servidor de Hong Kong",
+  "CloudServerInIndia": "India Servidores",
+  "CloudServerByCustom": "Servidores personalizados",
+  "Brand": "Marca",
+  "Model": "Número de modelo",
+  "Port": "Puertos",
+  "DeviceBrand": "Marcas de equipos",
+  "VideoType": "Tipo de vídeo",
+  "PatientId": "Paciente ID",
+  "Name": "nombre y apellidos",
+  "CreateTime": "Tiempo de creación",
+  "IPAddress": "Dirección IP",
+  "SubnetMask": "Máscara de Subred",
+  "Gateway": "Puerta de Enlace Predeterminada",
+  "DefaultGateway": "Puerta de Enlace Predeterminada",
+  "PreferredDNS": "DNS Preferido",
+  "StandbyDNS": "DNS de Reserva",
+  "MacAddress": "Dirección MAC",
+  "Property": "Causalidad",
+  "RetentionDays": "Número de días de retención",
+  "ApplicationEntityTitle": "SCP ID",
+  "StationIPAddress": "Dirección IP de la estación de trabajo",
+  "Title": "Título",
+  "NetworkStatus": "Estado de la red",
+  "CloudServerConnection": "Conexión al servidor",
+  "LiveService": "Servicio de retransmisión en directo",
+  "TimeSharedDiagnosisService": "servicio de diagnóstico",
+  "FirmwareVersion": "Versión del firmware",
+  "SaveSetting": "Guardar configuración",
+  "SaveConfig": "Guardar configuración",
+  "Success": "éxitos",
+  "Failed": "fracasar ",
+  "Refresh": "refrescar",
+  "RefreshSuccess": "Actualización exitosa",
+  "RefreshFailed": "Actualización fallida ",
+  "Preview": "Previsualización ",
+  "StartPreview": "Iniciar previsualización",
+  "StopPreview": "Detener previsualización",
+  "Connect": "Conectar",
+  "Connected": "Conectado",
+  "ConnectFailed": "Fallo de conexión",
+  "Disconnected": "Desconectado",
+  "StartCheck": "Iniciar la detección",
+  "Checking": "En proceso de detección",
+  "RestartSonopost": "Reiniciar Sonopost",
+  "RecoverSonopost": "Restablecer los ajustes de fábrica de Sonopost",
+  "RestartSonopostSuccess": "Reiniciando. Por favor, actualice la página más tarde.~",
+  "RecoverSonopostSuccess": "Recuperando, por favor actualice la página más tarde~",
+  "MiniScreenLanguageSelect": "Selección de idioma en minipantalla",
+  "Operation": "Operación ",
+  "Download": "Descargar",
+  "Reupload": "Volver a cargar",
+  "EnableDHCP": "Activar DHCP",
+  "EnableSonoLive": "Iniciar la transmisión en directo",
+  "EnableCamera01Live": "Iniciar la transmisión en directo",
+  "EnableCamera02Live": "Iniciar la transmisión en directo",
+  "EnableMicLive": "Iniciar la transmisión en directo",
+  "EnableDicomConnection": "Habilitación de DICOM",
+  "FailReason": "Razones del fracaso",
+  "Uploaded": "Ya subido",
+  "Retried": "Ya reintentado",
+  "Deleted": "Ya borrado",
+  "Delete": "Eliminar",
+  "NotAnyData": "No hay datos disponibles",
+  "RequestError": "Error de solicitud",
+  "ConnectServerAddressFailed": "No se ha podido conectar con la dirección del servidor",
+  "WifiDeviceNotFound": "Dispositivo Wifi no encontrado",
+  "Logged": "conectado",
+  "SaveSuccess": "Salvar con éxito",
+  "HasNotAnyOptions": "Sin opciones",
+  "DeviceNotFound": "No se han encontrado equipos",
+  "PortFormatError": "Número de puerto no válido (rango de números de puerto: 0-65535)",
+  "DicomPortFormatError": "Número de puerto no válido (rango de números de puerto: 0-65535)",
+  "NetworkException": "anomalía en la red",
+  "CheckFailed": "fallo de inspección",
+  "SaveFailed": "Fallo al guardar",
+  "UploadFailed": "Fallo al subir",
+  "UploadFailBecauseExamIsFinished": "La revisión ha finalizado, fallo al subir.",
+  "ConvertFailed": "fallo de conversión",
+  "RefreshDNS": "Refrescar DNS",
+  "RefreshDNSSuccess": "Refrescar DNS éxito",
+  "RefreshDNSFailed": "Refrescar DNS fallo",
+  "LoadFail": "fallo al cargar...",
+  "SelectTips": "Por favor, seleccione",
+  "FieldIsRequiredTips": "Por favor, introduzca",
+  "InputWifiPasswordLabel": "Introduzca la clave de red",
+  "InputWifiPasswordTips": "Introduzca la clave de seguridad de la red",
+  "InputAccountTips": "Introduzca su número de cuenta",
+  "InputPasswordTips": "Introduzca su contraseña",
+  "InputHospitalNameTips": "Introduzca el nombre del hospital",
+  "InputDeviceModelTips": "Introduzca el número de modelo del dispositivo",
+  "Ipv4FormatError": "Dirección IPv4 no válida",
+  "PasswordFormatError": "Introduzca de 6 a 20 letras o números",
+  "ResolutionSelect": "Selección de resolución",
+  "ResolutionSelectTips": "Seleccione la resolución",
+  "DeviceSelect": "Selección de equipos",
+  "DeviceSelectTips": "Seleccione un dispositivo",
+  "BrandSelectTips": "Seleccione una marca",
+  "ModelSelectTips": "Seleccione un modelo",
+  "ConfirmPassword": "Confirmación de contraseña",
+  "PasswordTwiceInconsistentTips": "Incoherencia entre dos entradas de contraseña",
+  "ServerAddressError": "Error de dirección del servidor",
+  "PreviewRequesting": "Solicitud de vista previa en proceso...",
+  "LoginFailed": "Falló el inicio de sesión! Por favor, vuelva a intentarlo o investigue las causas del fracaso en la detección de red,",
+  "WrongAccount": "Error de cuenta",
+  "WrongPassword": "Contraseña incorrecta",
+  "All": "Completo",
+  "EnableDualNetwork": "Activar la asignación de red interna y externa",
+  "IsOutSideNetwork": "Especificada como red externa",
+  "SetOutSideNetworkError": "Solo se puede configurar una tarjeta de red como red externa",
+  "SetOutSideNetworkError2": "Por favor, elija una tarjeta de red",
+  "NoEnoughNetworkError": "Se necesitan al menos dos tarjetas de red para configurar",
+  "RestartEffect": "Guardado con éxito, reinicio en curso......",
+  "Test": "Prueba ",
+  "TestSuccess": "Prueba superada",
+  "TestFail": "Fallo de la prueba",
+  "Testing": "Bajo prueba...",
+  "Forget": "Olvido",
+  "OrganizationIsMissing": "Introduzca el nombre de su hospital antes de iniciar sesión",
+  "EnableDetectRainbowImage": "Activación de la supervisión del gráfico arco iris",
+  "ScanIntervalTime": "Tiempo de intervalo de exploración (ms)",
+  "BeforeDisableIntervalTime": "Tiempo de espera antes de deshabilitar la unidad (milisegundos)",
+  "BeforeEnableIntervalTime": "Tiempo de espera antes de habilitar la unidad (milisegundos)",
+  "AfterEnableIntervalTime": "Tiempo de espera después de habilitar la unidad (milisegundos)",
+  "NeedPositiveInt": "Número entero positivo en milisegundos.",
+  "PositiveIntFormatError": "Formato incorrecto, por favor ingrese un número entero positivo en milisegundos",
+  "EnableLoginWithAccountAndPassword": "Activar el inicio de sesión con contraseña de cuenta",
+  "EthernetInterface1": "Puerto de red1",
+  "EthernetInterface2": "Puerto de red2",
+  "EthernetInterface3": "Puerto de red3",
+  "EthernetInterface4": "Puerto de red4",
+  "EthernetInterface5": "Puerto de red5",
+  "WifiInterface1": "Puerto de red inalámbrica1",
+  "WifiInterface2": "Puerto de red inalámbrica2",
+  "WifiInterface3": "Puerto de red inalámbrica3",
+  "WifiInterface4": "Puerto de red inalámbrica4",
+  "WifiInterface5": "Puerto de red inalámbrica5",
+  "timeout": "Tiempo agotado",
+  "InputTitle": "Introduzca un título",
+  "InputPort": "Introduzca el número de puerto",
+  "InputStationIP": "Introduzca la dirección IP de la estación de trabajo",
+  "TempFileDaySelect": "Seleccione el número de días que desea conservar",
+  "DeviceIsOccupied": "La cámara está ocupada.",
+  "DisconnectSuccess": "Desconexión correcta",
+  "IPAddressExist": "La dirección IP actual ya está en uso, por favor, introduzca otra dirección IP.",
+  "OperateFailed": "fracaso de una operación",
+  "Unknown": "Error desconocido",
+  "Chinese": "Chino",
+  "English": "Inglés",
+  "LogOffError": "Error al cerrar sesión",
+  "Offline": "estado fuera de línea",
+  "Online": "estado en línea",
+  "Logoning": "Inicio de sesión",
+  "PageTitle4CaptureSetting": "Adquisición de imágenes",
+  "PageDesc4CaptureSetting": "Activa la Captura de Imagen para capturar un único fotograma de gráficos/vídeo accionando el pedal y transferirlo a la lista de diagnóstico del servicio en la nube.",
+  "SingleFrameImageCaptureSwitch": "Tecla rápida para capturar una sola imagen",
+  "VideoCaptureSwitch": "Atajos para la captura de vídeo",
+  "LeftKeySetting": "Los atajos de teclado para la pierna izquierda",
+  "RightKeySetting": "  Los atajos de teclado para la pierna derecha",
+  "EnableCaptureSetting": "Activar la función de captura de imágenes",
+  "FootToggleConflict": "Los botones del pedal de control se están superponiendo, por favor reconfigúralos.",
+  "KeyBoardKeyConflict": "Los teclas del teclado se están superponiendo, por favor reconfigúralas.",
+  "FootToggleLeftKey": "Pedal de control izquierdo",
+  "FootToggleRightKey": "Pedal de control derecho",
+  "ClearRemedicalCache": "Borrar la caché",
+  "ClearRemedicalCacheSuccess": "Borrar caché correctamente",
+  "PageTitle4ClearRemedicalCache": "Caché remoto de imágenes",
+  "PageTitle4DeleteUserDefinedSetting": "Borrar configuraciones personalizadas",
+  "DeleteUserDefinedSetting": "Borrar configuraciones personalizadas",
+  "DeleteUserDefinedSettingSuccess": "El archivo de configuración personalizada se ha eliminado correctamente, el reinicio está en curso, actualice la página después de un rato.~",
+  "Tips": "Consejos cálidos",
+  "ConfirmRestart": "Confirme si desea reiniciar Sonopost.?",
+  "ConfirmReset": "Confirme si desea restaurar la configuración de fábrica?",
+  "ConfirmDeleteSetting": "Confirme si desea eliminar el perfil personalizado? <br> Si decide borrar, el Magic Box se reiniciará automáticamente una vez completada la eliminación.",
+  "Yes": "Sí",
+  "No": "No",
+  "ServerNotSupport": "Los actuales servicios en la nube no admiten la función de captura de imágenes",
+  "Uploading": "En proceso de carga...",
+  "Creating": "En proceso de creación...",
+  "Waiting": "En espera...",
+  "Status": "Situación",
+  "RefreshNetwork": "Refrescar red"
+}

+ 250 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/lang/ru-ru.json

@@ -0,0 +1,250 @@
+{
+  "AppName": "Sonopost",
+  "MenuTitle4Server": "Вход в облачные сервисы",
+  "MenuTitle4Live": "Настройки прямой трансляции",
+  "MenuTitle4Dicom": "Диагностические настройки",
+  "MenuTitle4Network": "Настройки сетевого подключения",
+  "MenuTitle4System": "Системные настройки",
+  "PageTitle4ServerLogin": "Вход в облачные сервисы",
+  "PageTitle4ServerRegister": "Создать новую учетную запись",
+  "PageTitle4ServerNetCheck": "сетевой тест",
+  "PageTitle4LiveSono": "Ультразвуковая машина",
+  "PageTitle4LiveCamera01": "Настройки камеры",
+  "PageTitle4LiveCamera02": "Настройки камеры2",
+  "PageTitle4LiveMic": "Настройки микрофона",
+  "PageTitle4DicomSono": "Ультразвуковая машина DICOM",
+  "PageTitle4DicomStation": " Рабочая станция DICOM",
+  "PageTitle4DicomFailList": "Список неудачных передач",
+  "PageTitle4NetworkWire": "настройка проводной сети",
+  "PageTitle4NetworkWifi": "Конфигурация беспроводной сети",
+  "PageTitle4NetworkDNS": "Обновление DNS",
+  "PageTitle4NetworkAdvance": "Дополнительные настройки",
+  "PageTitle4SystemReboot": "Перезапустите",
+  "PageTitle4SystemRecover": "Восстановление заводских настроек",
+  "PageTitle4SystemOledLang": "Настройки языка мини-экрана",
+  "PageTitle4SystemLog": "Системный журнал",
+  "PageTitle4SystemVersion": "информация о версии",
+  "PageTitle4RainbowImage": "Настройка мониторинга радужной диаграммы",
+  "PageTitle4ServerLoginModeSelection": "Выбор способа входа",
+  "PageDesc4ServerLoginModeSelection": "Пожалуйста, выберите режим входа в облачный сервис. Режим по умолчанию позволяет войти в систему напрямую, без ввода пароля учетной записи.",
+  "PageDesc4ServerLogin": "Пожалуйста, выберите облачный сервер и успешно войдите в облачный сервис. После появления QR-кода это означает, что Sonopost успешно вошел в облачный сервис.",
+  "PageDesc4ServerNetCheck": "Если Sonopost не удается войти в систему по какой-либо причине, вы можете провести сетевой тест, чтобы выяснить причину.",
+  "PageDesc4LiveSono": "Включите прямую трансляцию ультразвукового аппарата, выберите подходящее разрешение и сохраните, вы сможете наблюдать за ультразвуковым аппаратом в реальном времени на живом экране",
+  "PageDesc4LiveCamera01": "Включите камеру, выберите подходящее разрешение и сохраните, вы увидите отсканированное изображение",
+  "PageDesc4LiveCamera02": "Включите камеру 2, выберите подходящее разрешение и сохраните, вы увидите отсканированное изображение",
+  "PageDesc4LiveMic": "Включите микрофон для захвата звука во время прямой трансляции.",
+  "PageDesc4DicomSono": "Подключение к DICOM для передачи изображений или видео, хранящихся в ультразвуковом аппарате, в диагностический список облачного сервиса",
+  "PageDesc4DicomFailList": "Диагностика может не передаваться из-за колебаний сети, поэтому вы можете выбрать соответствующий случай в этом списке и повторно передать его",
+  "PageDesc4DicomStation": "Включите DICOM-соединения рабочей станции для передачи изображений или видео, загруженных ультразвуковым аппаратом на рабочую станцию через Sonopost",
+  "PageDesc4NetworkWifi": "В среде Wifi вы можете найти сеть Wifi и подключиться к ней.",
+  "PageDesc4NetworkAdvance": "Если Sonopost необходимо подключиться к внешней и внутренней сети, внешней сети для подключения к облачному сервису и внутренней сети для подключения к хранилищу DICOM УЗИ-аппарата, необходимо включить эту настройку.",
+  "DeviceBindingQrCodeGuide": "Используйте Flyinsono для сканирования двумерного кода или введите вручную уникальный код для привязки устройства.",
+  "Testingsuccessfully": "Успешный тест",
+  "VCloudTestTimeoutError": "Тест не удался или соединение прервалось",
+  "NetworkStatusTestError1": "Проверьте, подключен ли сетевой кабель или беспроводная сеть.",
+  "NetworkStatusTestError2": "Невозможно получить доступ к сетевым ресурсам, проверьте, соответствует ли текущая скорость сети требованиям, установлен ли сетевой брандмауэр в белый или черный список разрешений.",
+  "NetworkStatusTestError3": "Не удается разрешить DNS, пожалуйста, убедитесь, что текущая скорость интернета соответствует требованиям, и проверьте правильность адреса сервера.",
+  "vCloudServerConnectionTestError1": "Не удается подключиться к облачному сервису, проверьте, соответствует ли текущая скорость сети требованиям, и убедитесь, что сеть, подключенная к этой машине, может получить доступ к порту внешнего облачного сервиса",
+  "vCloudServerConnectionTestError2": "Версия программного обеспечения Sonopost слишком низкая, пожалуйста, проверьте наличие обновлений и обновите его",
+  "RemedicalServiceTestError1": "Служба удаленного хранения изображений не включена",
+  "RemedicalServiceTestError2": "Невозможно получить порт удаленного хранения изображений, пожалуйста, свяжитесь с инженерами послепродажного обслуживания для решения этой проблемы",
+  "RemedicalServiceTestError3": "Не удается подключиться к порту удаленного хранения изображений, проверьте, соответствует ли текущая скорость сети требованиям, и убедитесь, что сеть, к которой подключен аппарат, может получить доступ к внешнему порту удаленного хранения изображений.",
+  "LiveUsServiceTestError1": "Услуга передачи видео в реальном времени не включена",
+  "LiveUsServiceTestError2": "Невозможно получить порт передачи видео в реальном времени, пожалуйста, свяжитесь с инженерами послепродажного обслуживания для решения этой проблемы",
+  "LiveUsServiceTestError3": "Не удается подключиться к сервису передачи живого видео, пожалуйста, проверьте, соответствует ли текущая скорость сети требованиям, и убедитесь, что сеть, к которой подключена машина, может получить доступ к порту внешнего сервиса передачи живого видео",
+  "Account": "имя пользователя",
+  "Password": "пароль",
+  "ServerAddress": "адрес сервера",
+  "ServerPort": "порт сервера",
+  "HospitalName": "Название больницы",
+  "DeviceModel": "Модель оборудования",
+  "SelectServer": "Выберите сервер",
+  "Login": "войти в систему",
+  "CreateAndLogin": "Создание и вход",
+  "Disconnect": "Отключиться",
+  "FlyinsonoServer": "Сервер Flyinsono",
+  "CloudServerInChina": "Китайский сервер",
+  "CloudServerInGermany": "Немецкие серверы",
+  "CloudServerInHongKong": "Гонконгский сервер",
+  "CloudServerInIndia": "Серверы Индии",
+  "CloudServerByCustom": "Пользовательские серверы",
+  "Brand": "название бренда",
+  "Model": "номер модели",
+  "Port": "Порт",
+  "DeviceBrand": "Бренды оборудования",
+  "VideoType": "Тип видео",
+  "PatientId": "больной человек ID",
+  "Name": "имя и фамилия",
+  "CreateTime": "Время создания",
+  "IPAddress": "IP-адрес",
+  "SubnetMask": "Маска подсети",
+  "Gateway": "Основной шлюз",
+  "DefaultGateway": "Основной шлюз",
+  "PreferredDNS": "Предпочтительный DNS",
+  "StandbyDNS": "Резервный DNS",
+  "MacAddress": "Мак-адрес",
+  "Property": "свойств",
+  "RetentionDays": "Количество дней хранения",
+  "ApplicationEntityTitle": "SCP ID",
+  "StationIPAddress": "IP-адрес рабочей станции",
+  "Title": "Заголовок",
+  "NetworkStatus": "состояние сети",
+  "CloudServerConnection": "Подключение облачных сервисов",
+  "LiveService": "Сервис прямых трансляций",
+  "TimeSharedDiagnosisService": "диагностическое обслуживание",
+  "FirmwareVersion": "Версия прошивки",
+  "SaveSetting": "Сохранить настройки",
+  "SaveConfig": "Сохранить конфигурацию",
+  "Success": "успехи",
+  "Failed": "не удается",
+  "Refresh": "обновить",
+  "RefreshSuccess": "Обновить успешно",
+  "RefreshFailed": "сбой обновления",
+  "Preview": "просмотр",
+  "StartPreview": "Начать просмотр",
+  "StopPreview": "Остановить просмотр",
+  "Connect": "Подключиться",
+  "Connected": "подключено",
+  "ConnectFailed": "разрыв соединения",
+  "Disconnected": "отключено",
+  "StartCheck": "Начало тестирования",
+  "Checking": "Проводится тестирование",
+  "RestartSonopost": "Перезапустите Sonopost",
+  "RecoverSonopost": "Восстановление заводских настроек Sonopost",
+  "RestartSonopostSuccess": "Перезагрузка. Пожалуйста, обновите страницу позже.",
+  "RecoverSonopostSuccess": "Восстанавливается. Пожалуйста, обновите страницу позже.",
+  "MiniScreenLanguageSelect": "Выбор языка на мини-экране",
+  "Operation": "Операция",
+  "Download": "загрузка",
+  "Reupload": "загрузить",
+  "EnableDHCP": "Включить DHCP",
+  "EnableSonoLive": "Включить Прямая трансляция",
+  "EnableCamera01Live": "Включить Прямая трансляция",
+  "EnableCamera02Live": "Включить Прямая трансляция",
+  "EnableMicLive": "Включить Прямая трансляция",
+  "EnableDicomConnection": "Включить DICOM",
+  "FailReason": "Причины неудач",
+  "Uploaded": "Уже загружено",
+  "Retried": "Его пытались повторить.",
+  "Deleted": "удалено",
+  "Delete": "удаление",
+  "NotAnyData": "Нет данных",
+  "RequestError": "ошибка запроса",
+  "ConnectServerAddressFailed": "Не удалось подключиться к адресу сервера",
+  "WifiDeviceNotFound": "Wifi устройство не найдено",
+  "Logged": "войти в систему",
+  "SaveSuccess": "Сохранить успешный",
+  "HasNotAnyOptions": "У нас нет выбора",
+  "DeviceNotFound": "Оборудование не найдено",
+  "PortFormatError": "Введите доступный порт сервера. (0-65535)",
+  "DicomPortFormatError": "Введите доступный порт сервера. (0-65535)",
+  "NetworkException": "Нестабильность сети",
+  "CheckFailed": "не удается",
+  "SaveFailed": "не удается",
+  "UploadFailed": "не удается",
+  "UploadFailBecauseExamIsFinished": "Проект завершен,не удается",
+  "ConvertFailed": "сбой преобразования",
+  "RefreshDNS": "обновить  DNS",
+  "RefreshDNSSuccess": "Обновление DNS успешно",
+  "RefreshDNSFailed": "Не удалось обновить DNS",
+  "LoadFail": "не удалось загрузить...",
+  "SelectTips": "пожалуйста, выберите",
+  "FieldIsRequiredTips": "Пожалуйста, введите",
+  "InputWifiPasswordLabel": "Введите ключ безопасности",
+  "InputWifiPasswordTips": "Введите ключ безопасности",
+  "InputAccountTips": "Пожалуйста, введите номер счета",
+  "InputPasswordTips": "Пожалуйста, введите пароль",
+  "InputHospitalNameTips": "Пожалуйста, введите название больницы",
+  "InputDeviceModelTips": "Введите номер модели устройства",
+  "Ipv4FormatError": "Неверный IPv4-адрес",
+  "PasswordFormatError": "Пожалуйста, введите 6-20 букв или цифр",
+  "ResolutionSelect": "Выбор разрешения",
+  "ResolutionSelectTips": "Пожалуйста, выберите разрешение",
+  "DeviceSelect": "Выбор оборудования",
+  "DeviceSelectTips": "Пожалуйста, выберите устройство",
+  "BrandSelectTips": "Пожалуйста, выберите бренд",
+  "ModelSelectTips": "Пожалуйста, выберите модель",
+  "ConfirmPassword": "Подтверждение пароля",
+  "PasswordTwiceInconsistentTips": "Несоответствие между двумя введенными паролями",
+  "ServerAddressError": "Ошибка адреса сервера",
+  "PreviewRequesting": "Запрос на предварительный просмотр в процессе...",
+  "LoginFailed": "Вход в систему не удался! Пожалуйста, попробуйте еще раз или проверьте причину сбоя в Обнаружении сети.",
+  "WrongAccount": "Ошибка счета",
+  "WrongPassword": "неправильный пароль",
+  "All": "полный",
+  "EnableDualNetwork": "Активация внутреннего и внешнего сетевого распределения",
+  "IsOutSideNetwork": "Назначение в качестве экстрасети",
+  "SetOutSideNetworkError": "Только одна сетевая карта может быть назначена в качестве внешней сети",
+  "SetOutSideNetworkError2": "Пожалуйста, выберите сетевую карту",
+  "NoEnoughNetworkError": "Для настройки требуется не менее двух сетевых карт.",
+  "RestartEffect": "Сохранение прошло успешно, идет перезагрузка...",
+  "Test": "испытание",
+  "TestSuccess": "Успешный тест",
+  "TestFail": "сбой теста",
+  "Testing": "Проводится тестирование...",
+  "Forget": "забыть",
+  "OrganizationIsMissing": "Пожалуйста, введите название больницы перед входом в систему",
+  "EnableDetectRainbowImage": "Включите мониторинг радужной диаграммы",
+  "ScanIntervalTime": "Время интервала сканирования (мс)",
+  "BeforeDisableIntervalTime": "Время ожидания перед отключением драйвера (миллисекунды)",
+  "BeforeEnableIntervalTime": "Время ожидания перед включением драйвера (миллисекунды)",
+  "AfterEnableIntervalTime": "Время ожидания после включения драйвера (миллисекунды)",
+  "NeedPositiveInt": "Положительное целое число в миллисекундах.",
+  "PositiveIntFormatError": "Неправильный формат, пожалуйста, введите целое положительное число в миллисекундах.",
+  "EnableLoginWithAccountAndPassword": "Включить вход по паролю в учетную запись",
+  "EthernetInterface1": "сетевой порт1",
+  "EthernetInterface2": "сетевой порт2",
+  "EthernetInterface3": "сетевой порт3",
+  "EthernetInterface4": "сетевой порт4",
+  "EthernetInterface5": "сетевой порт5",
+  "WifiInterface1": "порт беспроводной сети1",
+  "WifiInterface2": "порт беспроводной сети2",
+  "WifiInterface3": "порт беспроводной сети3",
+  "WifiInterface4": "порт беспроводной сети4",
+  "WifiInterface5": "порт беспроводной сети5",
+  "timeout": "Время вышло",
+  "InputTitle": "Пожалуйста, введите Заголовок",
+  "InputPort": "Введите номер порта",
+  "InputStationIP": "Введите IP-адрес рабочей станции",
+  "TempFileDaySelect": "Пожалуйста, выберите количество дней для сохранения",
+  "DeviceIsOccupied": "Камера занята.",
+  "DisconnectSuccess": "Успешное отключение",
+  "IPAddressExist": "Текущий IP-адрес уже используется, пожалуйста, введите другой IP-адрес!",
+  "OperateFailed": "провал операции",
+  "Unknown": "неизвестная ошибка",
+  "Chinese": "Китайский",
+  "English": "Английский",
+  "LogOffError": "Не удалось выйти из системы",
+  "Offline": "статус оффлайн",
+  "Online": "онлайн-статус",
+  "Logoning": "Вход в систему",
+  "PageTitle4CaptureSetting": "получение изображения",
+  "PageDesc4CaptureSetting": "Включите функцию захвата изображения, чтобы с помощью настраиваемого педального переключателя снимать графики/видео с одним кадром и передавать их в диагностический список облачного сервиса",
+  "SingleFrameImageCaptureSwitch": "Быстрая клавиша для захвата одного изображения",
+  "VideoCaptureSwitch": "Быстрые клавиши для захвата видео",
+  "LeftKeySetting": "Клавиатурные сокращения, соответствующие левой стопе",
+  "RightKeySetting": "Клавиатурные сокращения, соответствующие правой стопе",
+  "EnableCaptureSetting": "Включение захвата изображения",
+  "FootToggleConflict": "Конфликт клавиш ножного переключателя, пожалуйста, сбросьте",
+  "KeyBoardKeyConflict": "Конфликт клавиш клавиатуры, пожалуйста, пожалуйста, сбросьте",
+  "FootToggleLeftKey": "Ножной переключатель слева",
+  "FootToggleRightKey": "Правый ножной переключатель",
+  "ClearRemedicalCache": "Очистка кэша",
+  "ClearRemedicalCacheSuccess": "Очистка кэша прошла успешно",
+  "PageTitle4ClearRemedicalCache": "Очистка кэша передачи изображений",
+  "PageTitle4DeleteUserDefinedSetting": "Пользовательская конфигурация",
+  "DeleteUserDefinedSetting": "Удаление Пользовательская конфигурация",
+  "DeleteUserDefinedSettingSuccess": "Удаление файла пользовательской конфигурации успешно завершено, идет перезагрузка, пожалуйста, обновите страницу позже~",
+  "Tips": "наконечник",
+  "ConfirmRestart": "Пожалуйста, проверьте, хотите ли вы перезапустить Sonopost?",
+  "ConfirmReset": "Проверьте, хотите ли вы восстановить заводские настройки?",
+  "ConfirmDeleteSetting": "Пожалуйста, подтвердите, хотите ли вы удалить пользовательский профиль?<br> Если вы решите удалить, Sonopost автоматически перезапустится после удаления.",
+  "Yes": "Да",
+  "No": "Нет",
+  "ServerNotSupport": "Существующие облачные сервисы не поддерживают функцию захвата изображений",
+  "Uploading": "Загрузка...",
+  "Creating": "При создании...",
+  "Waiting": "в ожидании...",
+  "Status": "положение дел",
+  "RefreshNetwork": "обновить "
+}

+ 24 - 27
Vinno.FIS.Sonopost/Assets/wwwroot/lang/zh-cn.json

@@ -27,32 +27,31 @@
   "PageTitle4RainbowImage": "彩虹图监测设置",
   "PageTitle4ServerLoginModeSelection": "登录方式选择",
   "PageDesc4ServerLoginModeSelection": "请选择云服务登录的方式。默认模式可直接登录,无需输入账号密码。",
-  "PageDesc4ServerLogin": "请选择云服务器方可成功登录云服务,二维码出现后,意味着超声魔盒成功登录至云服务",
-  "PageDesc4ServerRegister": "初次安装魔盒,需要为该魔盒创建新账号",
-  "PageDesc4ServerNetCheck": "超声魔盒因各种原因登录失败时,可进行网络检测排查原因",
-  "PageDesc4LiveSono": "启用超声机直播,选择合适的分辨率并保存,可观看该超声机实时直播画面",
-  "PageDesc4LiveCamera01": "启用摄像机直播,选择合适的分辨率并保存,可观看扫查手法画面",
-  "PageDesc4LiveCamera02": "启用摄像机2直播,选择合适的分辨率并保存,可观看扫查手法画面",
+  "PageDesc4ServerLogin": "请选择云服务器方可成功登录云服务,二维码出现后,意味着超声魔盒成功登录至云服务。",
+  "PageDesc4ServerNetCheck": "超声魔盒因各种原因登录失败时,可进行网络检测排查原因。",
+  "PageDesc4LiveSono": "启用超声机直播,选择合适的分辨率并保存,可观看该超声机实时直播画面。",
+  "PageDesc4LiveCamera01": "启用摄像机直播,选择合适的分辨率并保存,可观看扫查手法画面。",
+  "PageDesc4LiveCamera02": "启用摄像机2直播,选择合适的分辨率并保存,可观看扫查手法画面。",
   "PageDesc4LiveMic": "启用麦克风,直播时可采集音频。",
-  "PageDesc4DicomSono": "启用DICOM连接,可将超声机内存储的图像或视频传输至云服务的分时诊断列表",
-  "PageDesc4DicomFailList": "分时诊断可能存在因网络波动而传输失败的情况,可在此列表中选择相关病例并重传",
-  "PageDesc4DicomStation": "启用工作站DICOM连接,可将超声机上传的图像或视频通过超声魔盒转发至工作站",
-  "PageDesc4NetworkWifi": "在Wifi环境中,可搜索Wifi网络并连接",
-  "PageDesc4NetworkAdvance": "如超声魔盒同时连接外网和内网,外网连接云服务,内网连接超声机DICOM存储,则需开启此设置",
-  "DeviceBindingQrCodeGuide": "使用杏聆荟扫一扫或手动输入唯一码可绑定该设备",
-  "Testingsuccessfully": "测试成功",
-  "VCloudTestTimeoutError": "测试失败或连接超时",
-  "NetworkStatusTestError1": "请检查是否已插入网线或接入无线网络",
-  "NetworkStatusTestError2": "无法访问网络资源,请检查当前网速是否满足要求,网络防火墙是否设置白名单或黑名单权限",
-  "NetworkStatusTestError3": "无法解析DNS,请确认当前网速是否满足要求并检查服务器地址是否正确。如仍无法解析,请至“网络连接设置”页面刷新DNS缓存并检查网络内DNS相关设置",
-  "vCloudServerConnectionTestError1": "无法连接云服务,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部云服务端口",
-  "vCloudServerConnectionTestError2": "魔盒软件过低,请检查更新并升级",
-  "RemedicalServiceTestError1": "远程影像存储服务未开启",
-  "RemedicalServiceTestError2": "无法获取远程影像存储端口,请联系售后工程师处理",
-  "RemedicalServiceTestError3": "无法连接远程影像存储端口,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部远程影像存储端口",
-  "LiveUsServiceTestError1": "实时视频传输服务未开启",
-  "LiveUsServiceTestError2": "无法获取实时视频传输端口,请联系售后工程师处理",
-  "LiveUsServiceTestError3": "无法连接实时视频传输服务,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部实时视频传输服务端口",
+  "PageDesc4DicomSono": "启用DICOM连接,可将超声机内存储的图像或视频传输至云服务的分时诊断列表",
+  "PageDesc4DicomFailList": "分时诊断可能存在因网络波动而传输失败的情况,可在此列表中选择相关病例并重传",
+  "PageDesc4DicomStation": "启用工作站DICOM连接,可将超声机上传的图像或视频通过超声魔盒转发至工作站",
+  "PageDesc4NetworkWifi": "在Wifi环境中,可搜索Wifi网络并连接",
+  "PageDesc4NetworkAdvance": "如超声魔盒同时连接外网和内网,外网连接云服务,内网连接超声机DICOM存储,则需开启此设置",
+  "DeviceBindingQrCodeGuide": "使用杏聆荟扫一扫或手动输入唯一码可绑定该设备",
+  "Testingsuccessfully": "测试成功",
+  "VCloudTestTimeoutError": "测试失败或连接超时",
+  "NetworkStatusTestError1": "请检查是否已插入网线或接入无线网络",
+  "NetworkStatusTestError2": "无法访问网络资源,请检查当前网速是否满足要求,网络防火墙是否设置白名单或黑名单权限",
+  "NetworkStatusTestError3": "无法解析DNS,请确认当前网速是否满足要求并检查服务器地址是否正确。如仍无法解析,请至“网络连接设置”页面刷新DNS缓存并检查网络内DNS相关设置",
+  "vCloudServerConnectionTestError1": "无法连接云服务,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部云服务端口",
+  "vCloudServerConnectionTestError2": "魔盒软件过低,请检查更新并升级",
+  "RemedicalServiceTestError1": "远程影像存储服务未开启",
+  "RemedicalServiceTestError2": "无法获取远程影像存储端口,请联系售后工程师处理",
+  "RemedicalServiceTestError3": "无法连接远程影像存储端口,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部远程影像存储端口",
+  "LiveUsServiceTestError1": "实时视频传输服务未开启",
+  "LiveUsServiceTestError2": "无法获取实时视频传输端口,请联系售后工程师处理",
+  "LiveUsServiceTestError3": "无法连接实时视频传输服务,请检查当前网速是否满足要求并确认本机所连接的网络可访问外部实时视频传输服务端口",
   "Account": "账号",
   "Password": "密码",
   "ServerAddress": "服务器地址",
@@ -77,8 +76,6 @@
   "PatientId": "病人ID",
   "Name": "姓名",
   "CreateTime": "创建时间",
-  "SonoHDInput": "超声机高清输入",
-  "SonoSDInput": "超声机标清输入",
   "IPAddress": "IP地址",
   "SubnetMask": "子网掩码",
   "Gateway": "默认网关",

+ 23 - 3
Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/capture.html

@@ -14,6 +14,26 @@
     .lang-cn .layui-form-item .layui-input-block {
         margin-left: 190px;
     }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 250px;
+    }
+
+    .lang-ru .layui-form-item .needwrap {
+        margin-top: -10px;
+    }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 280px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 300px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 330px;
+    }
 </style>
 <div>
     <div class="page-title" data-content="PageTitle4CaptureSetting"></div>
@@ -33,7 +53,7 @@
         </div>
         <div id="captureSettingContainer">
             <div class="layui-form-item">
-                <label class="layui-form-label" data-content="SingleFrameImageCaptureSwitch"></label>
+                <label class="layui-form-label needwrap" data-content="SingleFrameImageCaptureSwitch"></label>
                 <div class="layui-input-block">
                     <select name="SingleFrameImageCaptureSwitch" lay-filter="SingleFrameImageCaptureSwitch">
                     </select>
@@ -46,13 +66,13 @@
                 </div>
             </div>
             <div class="layui-form-item">
-                <label class="layui-form-label" data-content="LeftKeySetting"></label>
+                <label class="layui-form-label needwrap" data-content="LeftKeySetting"></label>
                 <div class="layui-input-block">
                     <select name="LeftKeySetting" lay-filter="LeftKeySetting"></select>
                 </div>
             </div>
             <div class="layui-form-item">
-                <label class="layui-form-label" data-content="RightKeySetting"></label>
+                <label class="layui-form-label needwrap" data-content="RightKeySetting"></label>
                 <div class="layui-input-block">
                     <select name="RightKeySetting" lay-filter="RightKeySetting">
                     </select>

+ 16 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/sono.html

@@ -10,6 +10,22 @@
     .lang-cn .layui-form-item .layui-form-label {
         width: 100px;
     }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 185px;
+    }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 215px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 185px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 215px;
+    }
 </style>
 <div id="pageDicomSono">
     <div class="page-title" data-content="PageTitle4DicomSono"></div>

+ 8 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/station.html

@@ -6,6 +6,14 @@
     .lang-cn .layui-form-item .layui-form-label {
         width: 100px;
     }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 185px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 240px;
+    }
 </style>
 <div id="pageCameraLive">
     <div class="page-title" data-content="PageTitle4DicomStation"></div>

+ 43 - 11
Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/camera01.html

@@ -6,6 +6,22 @@
     .lang-en .layui-form-item .layui-form-label {
         width: 110px;
     }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 180px;
+    }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 150px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 190px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 160px;
+    }
 </style>
 <div id="pageCameraLive">
     <div class="page-title" data-content="PageTitle4LiveCamera01"></div>
@@ -18,7 +34,7 @@
                        lay-filter="IsEnable"
                        lay-skin="switch" />
                 <label class="layui-form-label"
-                       style="float: right; width: 150px"
+                       style="float: right; width: 250px"
                        data-content="EnableCamera01Live"></label>
             </div>
         </div>
@@ -132,6 +148,9 @@
                         loadResolutions([]);
                     }
                 }
+                else {
+                    loadResolutions([]);
+                }
             } else {
                 // 清除设备选择
                 form.val(formFilter, { Id: "" });
@@ -140,11 +159,20 @@
         }
         function loadResolutions(arr) {
             arr = arr || [];
-            let options = arr.map((x) => {
-                let name = `${x.Width}x${x.Height}`;
-                return `<option value="${name}">${name}<option />`;
+            let source = arr;
+            source = [{ Name: $t("SelectTips"), Id: "", tCode: "SelectTips", Width: 0, Height: 0, Framerate: 0 }, ...source];
+            let options = source.map((x) => {
+                if (x.tCode) {
+                    let item = $(`<option value="${x.Id}">${x.Name}</option>`);
+                    item.attr("data-content", x.tCode);
+                    return item;
+                }
+                else {
+                    let name = `${x.Width}x${x.Height}`;
+                    return `<option value="${name}">${name}<option />`;
+                }
+
             });
-            options = [`<option value=""><option />`, ...options];
             $("select[name=Resolution]").empty().append(options);
         }
         async function loadCameraInfo() {
@@ -182,13 +210,17 @@
             form.val(formFilter, { Id: id, Resolution: resolution });
             form.render(null, formFilter);
         }
+
         function renderCameraSelect(arr) {
-            let options = ['<option value=""></option>'];
-            if (arr && arr.length) {
-                arr.forEach((x) => {
-                    options.push(`<option value="${x.Id}">${x.Name}<option />`);
-                });
-            }
+            let source = arr;
+            source = [{ Name: $t("SelectTips"), Id: "", tCode: "SelectTips" }, ...source];
+            let options = source.map((x) => {
+                let item = $(`<option value="${x.Id}">${x.Name}</option>`);
+                if (x.tCode) {
+                    item.attr("data-content", x.tCode);
+                }
+                return item;
+            });
             $("select[name=Id]").empty().append(options);
         }
 

+ 17 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/camera02.html

@@ -6,6 +6,22 @@
     .lang-en .layui-form-item .layui-form-label {
         width: 110px;
     }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 180px;
+    }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 150px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 190px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 160px;
+    }
 </style>
 <div id="pageCameraLive">
     <div class="page-title" data-content="PageTitle4LiveCamera02"></div>
@@ -18,7 +34,7 @@
                        lay-filter="IsEnable"
                        lay-skin="switch" />
                 <label class="layui-form-label"
-                       style="float: right; width: 150px"
+                       style="float: right; width: 250px"
                        data-content="EnableCamera02Live"></label>
             </div>
         </div>

+ 26 - 7
Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/mic.html

@@ -6,6 +6,22 @@
     .lang-en .layui-form-item .layui-form-label {
         width: 110px;
     }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 180px;
+    }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 150px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 190px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 160px;
+    }
 </style>
 <div id="pageMicLive">
     <div class="page-title" data-content="PageTitle4LiveMic"></div>
@@ -18,7 +34,7 @@
                        lay-filter="IsEnable"
                        lay-skin="switch" />
                 <label class="layui-form-label"
-                       style="float: right; width: 150px"
+                       style="float: right; width: 250px"
                        data-content="EnableMicLive"></label>
             </div>
         </div>
@@ -82,12 +98,15 @@
         }
 
         function renderMicSelect(arr) {
-            let options = ['<option value=""></option>'];
-            if (arr && arr.length) {
-                arr.forEach((x) => {
-                    options.push(`<option value="${x.Id}">${x.Name}<option />`);
-                });
-            }
+            let source = arr;
+            source = [{ Name: $t("SelectTips"), Id: "", tCode: "SelectTips" }, ...source];
+            let options = source.map((x) => {
+                let item = $(`<option value="${x.Id}">${x.Name}</option>`);
+                if (x.tCode) {
+                    item.attr("data-content", x.tCode);
+                }
+                return item;
+            });
             $("select[name=Id]").empty().append(options);
         }
 

+ 19 - 2
Vinno.FIS.Sonopost/Assets/wwwroot/pages/live/sono.html

@@ -6,6 +6,22 @@
     .lang-en .layui-form-item .layui-form-label {
         width: 110px;
     }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 180px;
+    }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 150px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 190px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 160px;
+    }
 </style>
 <div id="pageSonoLive">
     <div class="page-title" data-content="PageTitle4LiveSono"></div>
@@ -18,7 +34,7 @@
                        lay-filter="IsEnable"
                        lay-skin="switch" />
                 <label class="layui-form-label"
-                       style="float: right; width: 150px"
+                       style="float: right; width: 250px"
                        data-content="EnableSonoLive"></label>
             </div>
         </div>
@@ -207,6 +223,7 @@
                         }),
                         true
                     );
+                    renderSelect("Model", [], true);
                     let brandData = brandArray.find((x) => x === brand);
                     if (brandData) {
                         selectedBrand = brand;
@@ -303,7 +320,7 @@
         function renderSelect(filter, arr, hasEmpty) {
             let source = arr;
             if (hasEmpty) {
-                source = [{ name: "", value: "" }, ...source];
+                source = [{ name: $t("SelectTips"), value: "", tCode: "SelectTips" }, ...source];
             }
             let options = source.map((x) => {
                 let item = $(`<option value="${x.value}">${x.name}</option>`);

+ 8 - 3
Vinno.FIS.Sonopost/Assets/wwwroot/pages/network/advance.html

@@ -1,4 +1,9 @@
-<div>
+<style>
+    .lang-ru .layui-form-item .needwrap {
+        margin-top: -10px;
+    }
+</style>
+<div>
     <div class="page-title" data-content="PageTitle4NetworkAdvance"></div>
     <div class="page-desc" data-content="PageDesc4NetworkAdvance"></div>
     <div class="layui-form page-form" lay-filter="FormSonoAdvancce">
@@ -9,8 +14,8 @@
                        name="IsEnable"
                        lay-filter="IsEnable"
                        lay-skin="switch" />
-                <label class="layui-form-label"
-                       style="float: right; width: 160px"
+                <label class="layui-form-label needwrap"
+                       style="float: right; width: 300px"
                        data-content="EnableDualNetwork"></label>
             </div>
         </div>

+ 2 - 2
Vinno.FIS.Sonopost/Assets/wwwroot/pages/network/wifi.html

@@ -1,7 +1,7 @@
 <div>
     <div class="page-title" data-content="PageTitle4NetworkWifi"></div>
     <div class="page-desc" data-content="PageDesc4NetworkWifi"></div>
-    <button class="layui-btn layui-btn-normal" id="btnRefresh" data-content="RefreshNetwork"></button>
+    <button class="layui-btn layui-btn-normal" id="btnRefresh" data-content="RefreshNetwork" style="margin-top:15px;margin-bottom:15px"></button>
     <div id="wifiList"></div>
     <div id="wifiSetting"></div>
     <div>
@@ -20,7 +20,7 @@
         let pointItems = [];
         let timerIndex;
         let _isbusy = false;
-        this.onload = async function () {   
+        this.onload = async function () {
             await $c("WifiConnectionItem", "NetworkSettingForm");
             await loadWifiPoints();
             $("#btnSave").on("click", async function () {

+ 17 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/pages/server/login.html

@@ -29,6 +29,22 @@
             font-size: 14px;
             word-wrap: normal;
         }
+
+    .lang-ru .layui-form-item .layui-input-block {
+        margin-left: 170px;
+    }
+
+    .lang-ru .layui-form-item .layui-form-label {
+        width: 140px;
+    }
+
+    .lang-es .layui-form-item .layui-input-block {
+        margin-left: 170px;
+    }
+
+    .lang-es .layui-form-item .layui-form-label {
+        width: 140px;
+    }
 </style>
 <div id="pageLogin">
     <div class="page-title" data-content="PageTitle4ServerLogin"></div>
@@ -121,7 +137,7 @@
                 <div class="device-unique_id ftbold"></div>
                 <div class="device-unique_qrcode">
                     <div class="qrcode"></div>
-                    <div class="tips" data-content="DeviceBindingQrCodeGuide"></div>
+                    <div class="tips" data-content="DeviceBindingQrCodeGuide" style="margin-left:-100px;width:360px"></div>
                 </div>
             </div>
         </div>

+ 1 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/pages/server/vcloudloginmode.html

@@ -10,7 +10,7 @@
                        lay-filter="IsLoginWithAccountAndPassword"
                        lay-skin="switch" />
                 <label class="layui-form-label"
-                       style="float: right; width: 300px"
+                       style="float: right; width: 350px"
                        data-content="EnableLoginWithAccountAndPassword"></label>
             </div>
         </div>

+ 16 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/pages/system/oledlang.html

@@ -18,6 +18,22 @@
     .lang-cn .layui-form-item#formItemLang .layui-form-label {
         width: 120px;
     }
+
+    .lang-ru .layui-form-item#formItemLang .layui-input-block {
+        margin-left: 230px;
+    }
+
+    .lang-ru .layui-form-item#formItemLang .layui-form-label {
+        width: 200px;
+    }
+
+    .lang-es .layui-form-item#formItemLang .layui-input-block {
+        margin-left: 260px;
+    }
+
+    .lang-es .layui-form-item#formItemLang .layui-form-label {
+        width: 230px;
+    }
 </style>
 <div id="pageOledLang">
     <div class="layui-form page-form" lay-filter="FormOledLang">

+ 3 - 1
Vinno.FIS.Sonopost/Features/Oled/OledMessages.cs

@@ -5,7 +5,9 @@ namespace Vinno.FIS.Sonopost.Features.Oled
     public enum Language
     {
         English,
-        Chinese
+        Chinese,
+        Russian,
+        Spanish
     }
 
     public enum OledMessage

+ 2 - 0
Vinno.FIS.Sonopost/Vinno.FIS.Sonopost.csproj

@@ -244,6 +244,8 @@
     <EmbeddedResource Include="Assets\wwwroot\libs\layui\font\iconfont.woff" />
     <EmbeddedResource Include="Assets\wwwroot\libs\layui\font\iconfont.woff2" />
     <EmbeddedResource Include="Assets\wwwroot\README.md" />
+    <EmbeddedResource Include="Assets\wwwroot\lang\es-es.json" />
+    <EmbeddedResource Include="Assets\wwwroot\lang\ru-ru.json" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>

+ 24 - 1
Vinno.FIS.Sonopost/WebApi/Controllers/SystemController.cs

@@ -101,9 +101,14 @@ namespace Vinno.FIS.Sonopost.WebApi.Controllers
             switch (SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage)
             {
                 case Language.Chinese:
-
                     return Result.Success("zh-cn");
 
+                case Language.Spanish:
+                    return Result.Success("es-es");
+
+                case Language.Russian:
+                    return Result.Success("ru-ru");
+
                 case Language.English:
                 default:
                     return Result.Success("en-us");
@@ -126,6 +131,14 @@ namespace Vinno.FIS.Sonopost.WebApi.Controllers
             {
                 SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Chinese;
             }
+            else if (request.Language.ToLower() == "ru-ru")
+            {
+                SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Russian;
+            }
+            else if (request.Language.ToLower() == "es-es")
+            {
+                SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Spanish;
+            }
             else
             {
                 SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.English;
@@ -153,6 +166,16 @@ namespace Vinno.FIS.Sonopost.WebApi.Controllers
                 SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Chinese;
                 OledManager.SetLanguage(Language.Chinese);
             }
+            else if (request.Language.ToLower() == "ru-ru")
+            {
+                SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Russian;
+                OledManager.SetLanguage(Language.English);
+            }
+            else if (request.Language.ToLower() == "es-es")
+            {
+                SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.Spanish;
+                OledManager.SetLanguage(Language.English);
+            }
             else
             {
                 SonopostUserDefinedSettings.Instance.LanguageSetting.PageLanguage = Language.English;