Estás desarrollando la aplicación ASP.Net MVC, ¿verdad? Otras respuestas parecen ser específicas para aplicaciones de escritorio. Déjame capturar cosas comunes:
Detección local
Es bastante importante que su aplicación detecte la configuración regional del usuario correctamente. En la aplicación de escritorio, CultureInfo.CurrentCulture tiene la configuración regional de formato preferida (la que se debe usar para formatear números, fechas, monedas, etc.) mientras que CultureInfo.CurrentUICulture tiene la configuración regional de interfaz de usuario preferida (la que se debe usar para mostrar mensajes localizados) . Para las aplicaciones web, debe configurar ambas culturas en automático (para detectar automáticamente la configuración regional desde el encabezado AcceptLanguage) a menos que desee implementar un flujo de trabajo de detección de configuración regional sofisticado (es decir, que desee admitir cambios de idioma a pedido).
Externalizar cadenas
Todas las cadenas deben provenir de recursos, es decir, archivos Resx. En la aplicación Winforms, se puede lograr fácilmente configurando la propiedad Localizable del formulario en true. También necesitaría externalizar manualmente (desafortunadamente) las cadenas que provienen de sus modelos. También es relativamente simple. En Asp.Net necesitaría externalizar todo manualmente ...
Diseños
Definitivamente debe permitir la expansión de la cadena. En el mundo de Winforms, se puede lograr a través de TableLayoutPanel, que debe usarse para asegurarse de que el diseño se ajuste automáticamente para acomodar texto más largo. En el mundo web, no tienes suerte. Es posible que deba implementar el mecanismo de localización CSS, una forma de modificar (anular) las definiciones CSS. Esto permitiría a las personas de localización modificar los problemas de estilo a pedido. Asegúrese de que cada elemento HTML en la página representada tenga una identificación única, ya que le permitirá apuntar con precisión.
Problemas culturales específicos
Evite usar gráficos, colores y sonidos que puedan ser específicos para la cultura occidental. Si realmente lo necesita, proporcione los medios de localización. Evite los gráficos sensibles a la dirección (ya que esto sería un problema cuando intenta localizar para decir árabe o hebreo). Además, no asuma que todo el mundo está usando los mismos números (es decir, no es cierto para el árabe).
ToString () y Parse ()
Asegúrese de pasar siempre CultureInfo cuando llame a ToString () a menos que no sea compatible. De esa manera estás comentando tus intenciones. Por ejemplo: si está usando algún número internamente y por alguna razón necesita convertirlo a cadena, use:
int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);
Para los números que se mostrarán al usuario, use:
var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used
Lo mismo se aplica a Parse (), TryParse () e incluso ParseExact (): se podrían introducir algunos errores desagradables sin el uso adecuado de CultureInfo. Esto se debe a que una pobre alma en Microsoft, llena de buenas intenciones, decidió que es una buena idea tratar CultureInfo.CurrentCulture como la predeterminada (se usaría si no pasa nada), después de todo cuando alguien está usando ToString ( ) él / ella quiere mostrarlo al usuario, ¿verdad? Resulta que no siempre es el caso; por ejemplo, intente almacenar el número de versión de su aplicación en la base de datos y luego convertirlo a la instancia de la clase Versión. Buena suerte.
Fechas y zonas horarias
Asegúrese de siempre almacenar e instanciar DateTime en UTC (use DateTime.UtcNow en lugar de DateTime.Now). Conviértalo a la hora local en formato local al mostrar:
DateTime now = DateTime.UtcNow;
var s = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);
Si necesita enviar correos electrónicos con referencia de tiempo en el cuerpo, asegúrese de incluir información de zona horaria; incluya el desplazamiento UTC y la lista de ciudades:
DateTime someDate; // i.e. from database
var formattedDate = String.Format("{0} {1}",
someDate.ToLocaleTime().ToString(CultureInfo.CurrentCulture),
TimeZoneInfo.Local.DisplayName);
Mensajes compuestos
Ya se le advirtió que no concatene cadenas. En su lugar, probablemente usaría String.Format () como se muestra arriba. Sin embargo, debo decir que debe minimizar el uso de mensajes compuestos. Eso es solo porque las reglas de gramática objetivo son bastante diferentes, por lo que los traductores pueden necesitar no solo reordenar la oración (esto se resolvería usando marcadores de posición y String.Format ()), sino que traduciría la oración completa de manera diferente en función de lo que será sustituido Deja que te dé algunos ejemplos:
// Multiple plural forms
English: 4 viruses found.
Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.
// Conjugation
English: Program encountered incorrect character | Application encountered incorrect character.
Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.
Otros problemas de concatenación
La concatenación no está restringida a cadenas. Evite establecer controles juntos, diga:
Recuérdame nuevamente en [cuadro de texto con número] días.
Esto debería rediseñarse para algo como: Recordarme nuevamente en este número de días: [cuadro de texto].
Codificación de caracteres y fuentes
Siempre guarde, transfiera, cualquier texto en Unicode (es decir, en UTF-8). No codifique las fuentes: es posible que la localización necesite modificarlas y desactivará el mecanismo de reserva de fuentes predeterminado (en el caso de Winforms). Recuerde permitir caracteres "extraños" en la mayoría de los campos (es decir, nombre de usuario).
Prueba
Probablemente necesitará implementar la llamada pseudo traducción, es decir, crear recursos para, por ejemplo, la cultura alemana y copiar sus cadenas en inglés agregando prefijos y sufijos. También puede ajustar marcadores de posición para detectar fácilmente cadenas compuestas. El propósito de la pseudo traducción es detectar problemas de localización como cadenas codificadas, problemas de diseño y uso excesivo de mensajes compuestos.