Локализация в MonoDroid - PullRequest
       23

Локализация в MonoDroid

5 голосов
/ 01 декабря 2011

Мое приложение локализовано с использованием стандартных методов .NET RESX (т. Е. String.fr.resx, Strings.de.resx и т. Д.) Отлично работает под Windows Phone.

Я портирую на Android с помощью MonoDroidи я не вижу локализованный пользовательский интерфейс, когда я переключаю язык на телефоне.Если я переименую файл APK в ZIP и открою его, я вижу, что он не упаковал библиотеки локали, созданные во время сборки (т. Е. Промежуточные файлы \ .Resources.dll находятся в каталоге bin, но не упакованы в APK).

Чего мне не хватает?Я пытался изменить действие по сборке файлов RESX с «Встроенного ресурса» на «Ресурс Android» и даже «Актив Android», но безрезультатно.

Заранее благодарен за любую помощь!

Ура Уоррен

1 Ответ

2 голосов
/ 22 июня 2012

Я спросил об этом на канале monodroid irc, и официальный ответ был «пока не поддерживается, но у нас есть планы сделать это».

Вам нужно преобразовать файлы resx в формат android xml (см. Ниже) и добавить их в свой проект, как показано здесь: http://docs.xamarin.com/android/tutorials/Android_Resources/Part_5_-_Application_Localization_and_String_Resources

В моем приложении (игре) мне нужно было посмотретьвверх локализованные строки по имени.Код для этого был прост, но не сразу очевиден.Вместо использования ResourceManager я поменял местами это для 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);            
    }
}

Поскольку я не гуру XSLT, я создал программу командной строки для преобразования resx в строковые XML-файлы Android:

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