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 #

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?

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
  • MarkerClick funciona pero InfoWindowClick no abre ViewModel
  • Java.IO.ISerializable Xamarin
  • Google Maps Android API Error de autorización: ¿ha cambiado este servicio en los últimos meses?
  • Comprobación de Android de la fecha cambiada
  • Recursos para Android de Xamarin NotFoundException ZXingNetMobile
  • Quitar icono de la barra de acción xamarin
  • Android: EditText activa automáticamente el teclado, ¿cómo detenerlo?
  • Error después de habilitar Multi-Dex en Xamarin Android
  • SqliteException ocupado iOS / Android Xamarin MVVMCross
  • Xamarin android support library v7 y v13 en la misma aplicación
  • Async / esperar malas prácticas bajo Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.