2011-12-01 13 views
5

Moja aplikacja jest zlokalizowana przy użyciu standardowych metod .NET RESX (np. String.fr.resx, Strings.de.resx itd.) Działa świetnie w systemie Windows Phone.Lokalizacja w MonoDroid

Przesyłam do systemu Android przy użyciu MonoDroid i nie widzę zlokalizowanego interfejsu użytkownika podczas przełączania ustawień regionalnych w telefonie. Jeśli zmienię nazwę pliku APK na ZIP i go otworzę, to widzę, że nie pakował on bibliotek regionalnych utworzonych podczas kompilacji (tj. Pośrednie pliki \ .Resources.dll znajdują się w katalogu bin, ale nie są pakowane do pakietu APK) .

Czego mi brakuje? Próbowałem zmienić działanie kompilacji plików RESX z "Embedded Resource" na "Android Resource", a nawet "Android Asset", ale bezskutecznie.

Z góry dziękuję za pomoc!

Cheers Warren

+1

lokalizacji w Androidzie został zaimplementowany poprzez tytuł folderów. Przeczytaj ten artykuł, aby dowiedzieć się, jak to zrobić http://developer.android.com/guide/topics/resources/localization.html – mironych

Odpowiedz

2

poprosiłem o to na monodroid kanał IRC i oficjalna odpowiedź była „nie są jeszcze obsługiwane, ale mamy zamiar to zrobić”.

Trzeba przekonwertować RESX pliki do android formacie xml (patrz poniżej) i dodać je do swojego projektu, jak pokazano poniżej: http://docs.xamarin.com/android/tutorials/Android_Resources/Part_5_-_Application_Localization_and_String_Resources

W mojej aplikacji (gier) I potrzebne patrzeć zlokalizowanych ciągów według nazwy . Kod do tego był prosty, ale nie od razu oczywisty. Zamiast używać ResourceManager zamieniłem w tym dla Androida:

class AndroidResourcesProxy : Arands.Core.IResourcesProxy 
{ 
    Context _context; 

    public AndroidResourcesProxy(Context context) 
    { 
     _context = context; 
    } 

    public string GetString(string key) 
    { 
     int resId = _context.Resources.GetIdentifier(key, "string", _context.PackageName); 
     return _context.Resources.GetString(resId);    
    } 
} 

Ponieważ nie jestem guru XSLT Zrobiłem program wiersza poleceń do konwersji plików RESX do Android ciąg XML:

/// <summary> 
/// Conerts localisation resx string files into the android xml format 
/// </summary> 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string inFile = args[0]; 
     XmlDocument inDoc = new XmlDocument(); 
     using (XmlTextReader reader = new XmlTextReader(inFile)) 
     { 
      inDoc.Load(reader); 
     } 

     string outFile = Path.Combine(Path.GetDirectoryName(inFile), Path.GetFileNameWithoutExtension(inFile)) + ".xml"; 
     XmlDocument outDoc = new XmlDocument(); 
     outDoc.AppendChild(outDoc.CreateXmlDeclaration("1.0", "utf-8", null)); 

     XmlElement resElem = outDoc.CreateElement("resources"); 
     outDoc.AppendChild(resElem); 

     XmlNodeList stringNodes = inDoc.SelectNodes("root/data"); 
     foreach (XmlNode n in stringNodes) 
     { 
      string key = n.Attributes["name"].Value; 
      string val = n.SelectSingleNode("value").InnerText; 

      XmlElement stringElem = outDoc.CreateElement("string"); 
      XmlAttribute nameAttrib = outDoc.CreateAttribute("name"); 
      nameAttrib.Value = key; 
      stringElem.Attributes.Append(nameAttrib); 
      stringElem.InnerText = val; 

      resElem.AppendChild(stringElem); 
     } 

     XmlWriterSettings xws = new XmlWriterSettings(); 
     xws.Encoding = Encoding.UTF8; 
     xws.Indent = true; 
     xws.NewLineChars = "\n"; 

     using (StreamWriter sr = new StreamWriter(outFile)) 
     { 
      using (XmlWriter writer = XmlWriter.Create(sr, xws)) 
      { 
       outDoc.Save(writer); 
      } 
     } 
    } 
}