Xamarin iOS localización utilizando .NET
Estoy intentando utilizar la localización de .NET en una biblioteca portable de la clase para un proyecto de Xamarin iOS / Android. He seguido los pasos en:
Cómo utilizar la localización en C #
- Cómo activar una actividad mediante una notificación local creada a partir de una notificación remota
- Línea azul claro sobre mi barra de navegación en la aplicación de Android
- Agregar dinámicamente vistas a un recycleview.viewholder
- Conectar con un emulador de Android a la localhost webservice
- API de Android IsConnected devolviendo TRUE tras finalizar sesión
Y tiene el código que se ve como sigue:
string sText = strings.enter_movie_name; Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr"); sText = strings.enter_movie_name; lblEnterMovieName.Text = sText;
También he intentado:
ResourceManager resman = new ResourceManager(typeof(MyApplication.strings)); string sText = resman.GetString("enter_movie_name", new CultureInfo("fr"));
He creado strings.resx con enter_movie_name igual a "Enter movie name:" y strings.fr.resx igual a "Entre la movie name:"
Sin embargo, sText siempre termina como "Enter movie name:". Parece que no puedo obtener el "Entre la película nombre:" versión.
También vi el post en Cross-Platform Localization pero no pude resolverlo. Tampoco quiero usar la versión específica de iOS en Localización en Xamarin.iOS, ya que me gustaría poder acceder a mis cadenas desde una biblioteca independiente de la plataforma.
¿Puede alguien señalar a dónde me equivoco?
- Cómo enlazar Android TextView a evento Click con MvvmCross
- Xamarin Android Player no puede ejecutar emuladores de API 21 o superior
- El botón de Android muestra diferentes mensajes de Toast dependen del número de clics
- Android 5.0 hace que las casillas de verificación no seleccionadas sean invisibles cuando el fondo es blanco
- Cómo configurar onclick oyente en xamarin?
- Cómo cambiar el tamaño de la altura de la fila ListView de Android
- Escribir plugins Unity3D multiplataforma con Xamarin
- ¿Cómo puedo mostrar una lista anidada de elementos en Xamarin Forms?
He creado un poco de una solución fea, pero funciona. Lo que he hecho se hace una carpeta llamada 'cadenas' en mi biblioteca de clases portátil (PCL) y dentro de que los archivos creados llamados:
- Strings.resx
- Strings_fr.resx
- Strings_ja_JP.resx
He fijado todos estos como recurso incorporado con la herramienta de encargo como ResXFileCodeGenerator. Esto significa que tengo un DLL de recursos por separado para cada idioma.
En iOS, puedo obtener la configuración regional llamando a:
string sLocale = NSLocale.CurrentLocale.LocaleIdentifier;
Supongo que hay un equivalente de Android utilizando Locale pero no sé qué es.
Esto me da una cadena como "ja_JP" o "fr_FR" o "en_GB" (note que son subrayados, no guiones). A continuación, utilizar esto con la siguiente clase estática que he creado para recuperar un gestor de recursos adecuado y obtener la cadena de la misma.
Si se le da un locale aa_BB primero busca strings_aa_BB, luego para strings_aa, luego para strings.
public static class Localise { private const string STRINGS_ROOT = "MyPCL.strings.strings"; public static string GetString(string sID, string sLocale) { string sResource = STRINGS_ROOT + "_" + sLocale; Type type = Type.GetType(sResource); if (type == null) { if (sLocale.Length > 2) { sResource = STRINGS_ROOT + "_" + sLocale.Substring(0, 2); // Use first two letters of region code type = Type.GetType(sResource); } } if (type == null) { sResource = STRINGS_ROOT; type = Type.GetType(sResource); if (type == null) { System.Diagnostics.Debug.WriteLine("No strings resource file when looking for " + sID + " in " + sLocale); return null; // This shouldn't ever happen in theory } } ResourceManager resman = new ResourceManager(type); return resman.GetString(sID); } }
Un ejemplo de cómo se usaría (refiriéndose al código anterior) sería:
string sText = Localise.GetString("enter_movie_name", sLocale); lblEnterMovieName.Text = sText;
Una desventaja significativa de esto es que todas las vistas necesitarán tener su texto fijado programatically, pero tiene la ventaja que las traducciones pueden ser hechas una vez y después reutilizadas en muchas plataformas. También permanecen separados del código principal en sus propios archivos DLL y por lo tanto pueden ser recompilados individualmente si es necesario.
He creado una solución similar a la respuesta aceptada, pero utilizando archivos txt en lugar de Resx y nuget listo para ir: https://github.com/xleon/I18N-Portable . Publicación de blog aquí .
Otras mejoras son:
-
"anyKey".Translate(); // from anywhere
- Detección automática de la cultura actual
- Obtenga una lista de las traducciones soportadas:
List<PortableLanguage> languages = I18N.Current.Languages;
- Soporte para la vinculación de datos en Mvvm frameworks / Xamarin.Forms
- Etc
- Prueba de la unidad en ejecución de Android Studio muestra 'Empty test suite'
- Cómo empujar las carpetas de la computadora en sdcard usando adb shell