win10 sistema separadores separador punto lista idioma decimales cómo configuración configuracion como coma cambiar html internationalization locale

html - sistema - cómo cambiar la configuración regional y el idioma



Con un navegador, ¿cómo puedo saber qué separador decimal usa el sistema operativo? (12)

"¿Hay alguna forma de hacerlo en el lado del servidor (preferiblemente, para que pueda recopilar estadísticas), o en el lado del cliente?"

No tu no puedes Esa GUI está mirando algunas configuraciones específicas del usuario o de la máquina. En primer lugar, es probable que no sepa qué configuraciones busca esta interfaz de usuario. En segundo lugar, con una aplicación web probablemente no podrá verificar estas configuraciones (lado del cliente -> Javacsript).

Estoy desarrollando una aplicación web.

Necesito mostrar algunos datos decimales correctamente para poder copiarlos y pegarlos en una aplicación GUI determinada que no esté bajo mi control.

La aplicación GUI es sensible al entorno local y acepta solo el separador decimal correcto que se establece en el sistema.

Puedo adivinar el separador decimal de Accept-Language y la conjetura será correcta en el 95% de los casos, pero a veces falla.

¿Hay alguna forma de hacerlo en el lado del servidor (preferiblemente, para que pueda recopilar estadísticas) o en el lado del cliente?

Actualizar:

Todo el punto de la tarea es hacerlo automáticamente.

De hecho, esta aplicación web es un tipo de interfaz en línea para una GUI heredada que ayuda a llenar los formularios correctamente.

El tipo de usuarios que lo usan en su mayoría no tienen idea de lo que es un separador decimal.

La solución Accept-Language está implementada y funciona, pero me gustaría mejorarla.

Actualización2:

Necesito recuperar una configuración muy específica: conjunto de separador decimal en Control Panel / Regional and Language Options / Regional Options / Customize Configuración Control Panel / Regional and Language Options / Regional Options / Customize .

Trato con cuatro tipos de sistemas operativos:

  1. Windows ruso con una coma como DS (80%).
  2. Windows en inglés con un periodo como DS (15%).
  3. Windows ruso con un punto como DS para hacer que las aplicaciones de inglés mal escritas funcionen (4%).
  4. Windows en inglés con una coma como DS para hacer que las aplicaciones rusas mal escritas funcionen (1%).

El 100% de los clientes están en Rusia y la solicitud heredada trata con formularios emitidos por el gobierno ruso, por lo que solicitar un país dará el 100% de la Federación de Rusia, y GeoIP rendirá el 80% de la Federación de Rusia y el 20% de los demás (incorrecto) respuestas


Puedo adivinar el separador decimal de Accept-Language y la conjetura será correcta en el 95% de los casos, pero a veces falla.

Este es IMO el mejor curso de acción. Para manejar los fallos, agregue un enlace para configurarlo manualmente junto al área de visualización.


Aquí hay una función de JavaScript simple que devolverá esta información. Probado en Firefox, IE6 e IE7. Tuve que cerrar y reiniciar mi navegador entre cada cambio en la configuración en Panel de control / Configuración regional y de idioma / Opciones regionales / Personalizar. Sin embargo, recogió no solo la coma y el punto, sino también cosas personalizadas extrañas, como la letra "a".

function whatDecimalSeparator() { var n = 1.1; n = n.toLocaleString().substring(1, 2); return n; }

function whatDecimalSeparator() { var n = 1.1; n = n.toLocaleString().substring(1, 2); return n; } console.log(''You use "'' + whatDecimalSeparator() + ''" as Decimal seprator'');

¿Esto ayuda?


Creo que tienes que confiar en JavaScript para darte la configuración regional.
Pero al parecer JS no tiene acceso directo a esta información.
Veo que Dojo Toolkit se basa en una base de datos externa para encontrar la información del entorno local, aunque podría no tener en cuenta los cambios de configuración, por ejemplo.
Otra solución que veo es tener un pequeño applet de Java silencioso que consulte esta información del sistema y JavaScript para sacarlo de Java.
Puedo dar más información si no sabes cómo hacerlo (si quieres ir por esta ruta complicada, por supuesto).

[EDIT] Así que actualicé mi conocimiento de soporte de localización en Java ...
A diferencia de lo que pensé originalmente, no tendrá directamente el separador decimal o los miles de caracteres separadores directamente, como haría con el separador de línea o separador de ruta: en su lugar, Java ofrece API para formatear los números o fechas que proporciona.
De alguna manera, tiene sentido: en Europa a menudo se coloca el símbolo de la moneda después del número, algunos países (¿India?) Tienen una regla más compleja con dígitos separados, etc.

Otra cosa: Java encuentra correctamente la configuración regional actual del sistema, pero no toma información desde allí (tal vez por las razones anteriores). En su lugar, utiliza su propio conjunto de reglas. Entonces, si tiene una configuración regional en español donde reemplazó el separador decimal con un signo de exclamación, Java no lo usará (pero quizás tampoco su aplicación, de todos modos ...).

Así que estoy escribiendo un applet que expone un servicio (funciones) a JavaScript, lo que permite dar formato a los números a la ubicación actual. Puede usarlo como tal, usando JavaScript para dar formato a los números en el navegador. O simplemente puede alimentarlo con un número de muestra y extraer los símbolos desde allí, usándolos localmente o devolviéndolos al servidor.

Termino y pruebo mi applet y lo publico pronto.


De acuerdo, tengo algo que mostrar, más una prueba de concepto que un producto terminado, pero debido a la falta de especificaciones precisas, lo dejo de esta manera (o lo haré en exceso). Lo publico en un mensaje separado porque será un poco largo. Aproveché la oportunidad para probar un poco más jQuery ...

El código de Java: GetLocaleInfo.java

import java.applet.*; import java.util.Locale; import java.text.*; public class GetLocaleInfo extends Applet { Locale loc; NumberFormat nf; NumberFormat cnf; NumberFormat pnf; // For running as plain application public static void main(String args[]) { final Applet applet = new GetLocaleInfo(); applet.init(); applet.start(); } public void init() // Applet is loaded { // Use current locale loc = Locale.getDefault(); nf = NumberFormat.getInstance(); cnf = NumberFormat.getCurrencyInstance(); pnf = NumberFormat.getPercentInstance(); } public void start() // Applet should start { // Following output goes to Java console System.out.println(GetLocaleInformation()); System.out.println(nf.format(0.1)); System.out.println(cnf.format(1.0)); System.out.println(pnf.format(0.01)); } public String GetLocaleInformation() { return String.format("Locale for %s: country=%s (%s / %s), lang=%s (%s / %s), variant=%s (%s)", loc.getDisplayName(), loc.getDisplayCountry(), loc.getCountry(), loc.getISO3Country(), loc.getDisplayLanguage(), loc.getLanguage(), loc.getISO3Language(), loc.getDisplayVariant(), loc.getVariant() ); } public String FormatNumber(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return nf.format(value); } public String FormatCurrency(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return cnf.format(value); } public String FormatPercent(String number) { double value = 0; try { value = Double.parseDouble(number); } catch (NumberFormatException nfe) { return "!"; } return pnf.format(value); } }

Un ejemplo de página HTML que utiliza el applet anterior: GetLocaleInfo.html

<!-- Header skipped for brevity --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js"></script> <script type="text/javascript"> var applet; $(document).ready(function() { applet = document.getElementById(''LocaleInfo''); $(''#Results'').text(applet.GetLocaleInformation()); }); </script> <script type="text/javascript"> function DoFormatting() { $(''table.toFormat'').each(function() { var table = $(this); $(''td'', table).each(function(cellId) { var val = $(this); if (val.is(''.number'')) { val.text(applet.FormatNumber(val.text())); } else if (val.is(''.currency'')) { val.text(applet.FormatCurrency(val.text())); } else if (val.is(''.percent'')) { val.text(applet.FormatPercent(val.text())); } }); }); } </script> </head> <body> <div id="Container"> <p>Page to demonstrate how JavaScript can get locale information from Java</p> <div id="AppletContainer"> <object classid="java:GetLocaleInfo.class" type="application/x-java-applet" codetype="application/java" name="LocaleInfo" id="LocaleInfo" width="0" height="0"> <param name="code" value="GetLocaleInfo"/> <param name="mayscript" value="true"/> <param name="scriptable" value="true"/> <p><!-- Displayed if object isn''t supported --> <strong>This browser does not have Java enabled.</strong> <br> <a href="http://java.sun.com/products/plugin/downloads/index.html" title="Download Java plug-in"> Get the latest Java plug-in here </a> (or enable Java support). </p> </object> </div><!-- AppletContainer --> <p> Click on the button to format the table content to the locale rules of the user. </p> <input type="button" name="DoFormatting" id="DoFormatting" value="Format the table" onclick="javascript:DoFormatting()"/> <div id="Results"> </div><!-- Results --> <table class="toFormat"> <caption>Synthetic View</caption> <thead><tr> <th>Name</th><th>Value</th><th>Cost</th><th>Discount</th> </tr></thead> <tbody> <tr><td>Foo</td><td class="number">3.1415926</td><td class="currency">21.36</td><td class="percent">0.196</td></tr> <tr><td>Bar</td><td class="number">159263.14</td><td class="currency">33</td><td class="percent">0.33</td></tr> <tr><td>Baz</td><td class="number">15926</td><td class="currency">12.99</td><td class="percent">0.05</td></tr> <tr><td>Doh</td><td class="number">0.01415926</td><td class="currency">5.1</td><td class="percent">0.1</td></tr> </tbody> </table> </div><!-- Container --> </body> </html>

Probado en Firefox 3.0, IE 6, Safari 3.1 y Opera 9.50, en Windows XP Pro SP3. Funciona sin problemas con los dos primeros, en Safari tengo un error extraño después de la llamada a init ():

java.net.MalformedURLException: no protocol: at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at sun.plugin.liveconnect.SecureInvocation.checkLiveConnectCaller(Unknown Source) at sun.plugin.liveconnect.SecureInvocation.access$000(Unknown Source) at sun.plugin.liveconnect.SecureInvocation$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.plugin.liveconnect.SecureInvocation.CallMethod(Unknown Source)

pero todavía funciona.

No puedo hacer que funcione con Opera: el applet se carga correctamente, ya que puedo ver la traza de la llamada init () en la consola de Java, no tengo errores cuando JavaScript llama a las funciones de Java (excepto si agrego y llamo un método obtener un parámetro JSObject, curiosamente), pero las funciones de Java no se llaman (agregué el rastro de las llamadas).
Creo que Liveconnect funciona en Opera, pero todavía no veo cómo. Investigaré un poco más.
[Actualización] Eliminé las referencias a un archivo jar que no existía (lo que no detiene otros navegadores) y obtuve un seguimiento de las llamadas, pero no actualiza la página.
Mmm, si hago alert(applet.GetLocaleInformation()); Obtuve la información, así que podría ser un problema de jQuery.


Es posible recuperar separadores para la configuración regional actual o determinada usando Intl.NumberFormat#formatToParts .

function getDecimalSeparator(locale) { const numberWithDecimalSeparator = 1.1; return Intl.NumberFormat(locale) .formatToParts(numberWithDecimalSeparator) .find(part => part.type === ''decimal'') .value; }

Solo funciona para los navegadores que soportan la API Intl . De lo contrario, requiere un polyfill Intl.

Ejemplos:

> getDecimalSeparator() "." > getDecimalSeparator(''fr-FR'') ","

Prima:

Podríamos extenderlo para recuperar el separador decimal o de grupo de una configuración regional determinada:

function getSeparator(locale, separatorType) { const numberWithGroupAndDecimalSeparator = 1000.1; return Intl.NumberFormat(locale) .formatToParts(numberWithGroupAndDecimalSeparator) .find(part => part.type === separatorType) .value; }

Ejemplos:

> getSeparator(''en-US'', ''decimal'') "." > getSeparator(''en-US'', ''group'') "," > getSeparator(''fr-FR'', ''decimal'') "," > getSeparator(''fr-FR'', ''group'') " "


Incluso si sabía en qué configuración regional se está ejecutando esta "Aplicación GUI", todavía tiene que averiguar cómo está obteniendo la configuración regional actual y cómo está determinando el separador decimal.

No sé cómo se hace en una Mac, pero en las aplicaciones de Windows se supone que deben consultar las preferencias del usuario establecidas a través del Panel de control. Es muy posible que esta aplicación misteriosa esté ignorando esas configuraciones y, en su lugar, utilice su propia configuración interna.

O tal vez están tomando el lugar actual, e inferiendo el resto, en lugar de que se lo digan.

Incluso entonces, en inglés, los números se dan en grupos de 3 dígitos, con una coma que separa los grupos. es decir:

5,197,359,078

A menos que el número fuera un número entero que contenga un número de teléfono :

519-735-9078

A menos que, por supuesto, el número fuera un número entero que contenga un número de cuenta :

5197359078

En cuyo caso, volverá a la lógica anulada y codificada.

Editar: Ejemplo de moneda eliminada, ya que la moneda tiene sus propias reglas de formato.


Otra solución posible: podría usar algo como GeoIP (ejemplo en PHP) para determinar la ubicación del usuario y decidir en función de esta información.


Por qué no

0.1.toLocaleString().replace(//d/g, '''')


Preguntar al usuario, no adivinar. Tenga un ajuste para ello en su aplicación web.

Editado para añadir:

Creo que está bien adivinar la configuración predeterminada que funciona bien, digamos, el 95% del tiempo. Lo que quise decir es que el usuario todavía debería ser capaz de anular las suposiciones que haya hecho el software. Ya me he sentido frustrado muchas veces cuando un software intenta ser demasiado inteligente y no permite que se corrija.


Usando las respuestas de otras personas, compilé las siguientes funciones de utilidad de decimales y miles de separadores:

var decimalSeparator = function() { return (1.1).toLocaleString().substring(1, 2); }; var thousandSeparator = function() { return (1000).toLocaleString().substring(1, 2); };

¡Disfrutar!


function getDecimalSeparator() { //fallback var decSep = "."; try { // this works in FF, Chrome, IE, Safari and Opera var sep = parseFloat(3/2).toLocaleString().substring(1,2); if (sep === ''.'' || sep === '','') { decSep = sep; } } catch(e){} return decSep; }