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

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

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

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

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

Ура Уоррен


person user1075034    schedule 01.12.2011    source источник
comment
Локализация в Android реализована через название папок. Прочтите эту статью, чтобы узнать, как это сделать developer.android.com/guide /topics/resources/localization.html   -  person mironych    schedule 02.12.2011


Ответы (1)


Я спросил об этом на 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);
            }
        }
    }
}
person Aranda    schedule 22.06.2012