gpt4 book ai didi

MonoDroid 中的本地化

转载 作者:行者123 更新时间:2023-12-04 05:25:27 27 4
gpt4 key购买 nike

我的应用程序使用标准的 .NET RESX 方法(即 String.fr.resx、Strings.de.resx 等)本地化,在 Windows Phone 下运行良好。

我正在使用 MonoDroid 移植到 Android,但在手机上切换语言环境时看不到本地化的 UI。如果我将 APK 文件重命名为 ZIP 并打开它,我会看到它没有打包在构建过程中生成的语言环境 DLL(即中间的\.Resources.dll 文件在 bin 目录下,但没有打包到 APK 中) .

我错过了什么?我曾尝试将 RESX 文件的构建操作从“嵌入式资源”更改为“Android 资源”甚至“Android Assets ”,但无济于事。

在此先感谢您的帮助!

干杯
沃伦

最佳答案

我在 monodroid irc channel 上询问了这个问题,官方回答是“尚不支持,但我们确实有计划这样做”。

您需要将 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 转换为 Android 字符串 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);
}
}
}
}

关于MonoDroid 中的本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com