2011-12-01 17 views
5

La mia app è localizzata utilizzando i metodi standard di RESX .NET (ad es. String.fr.resx, Strings.de.resx ecc.) Funziona perfettamente con Windows Phone.Localization in MonoDroid

Sto eseguendo il porting su Android utilizzando MonoDroid e non vedo l'interfaccia utente localizzata quando cambio locale al telefono. Se rinominare il file APK in ZIP e aprirlo, vedo che non ha impacchettato le DLL locali prodotte durante la compilazione (cioè i file intermedi \ .Resources.dll si trovano sotto la directory bin ma non sono pacchettizzati nell'APK) .

Cosa mi manca? Ho provato a cambiare l'azione di costruzione sui file RESX da "Risorsa incorporata" a "Risorsa Android" e persino "Asset Android", ma senza alcun risultato.

Grazie in anticipo per qualsiasi aiuto!

Acclamazioni Warren

+1

Localizzazione in Android è stato implementato attraverso il titolo delle cartelle. Si prega di leggere questo articolo per scoprire come fare questo http://developer.android.com/guide/topics/resources/localization.html – mironych

risposta

2

ho chiesto spiegazioni sul canale IRC MonoDroid e la risposta ufficiale è stata "non ancora supportati, ma noi abbiamo intenzione di farlo".

è necessario convertire i file resx in formato xml Android (vedi sotto) e aggiungerli al progetto come mostrato di seguito: http://docs.xamarin.com/android/tutorials/Android_Resources/Part_5_-_Application_Localization_and_String_Resources

Nella mia app (gioco) avevo bisogno di cercare le stringhe localizzate per nome . Il codice per farlo era semplice ma non immediatamente ovvio. Invece di utilizzare ResourceManager ho scambiato in questo per Android:

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);    
    } 
} 

Dato che io non sono un guru XSLT ho fatto un programma a riga di comando per convertire resx per Android file stringa di 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); 
      } 
     } 
    } 
} 
Problemi correlati