使用 Xamarin Android,可以为多语言应用程序创建本地化字符串,如其 Android 文档中所示:
但是,我的模型中有各种 try/catch 块,它们将错误消息作为字符串发送回。理想情况下,我希望我的解决方案的模型和控制器部分完全跨平台,但如果不将特定于平台的 Android 上下文传递给模型,我看不到任何有效本地化消息的方法。
有没有人知道如何实现这一目标?
使用 Xamarin Android,可以为多语言应用程序创建本地化字符串,如其 Android 文档中所示:
但是,我的模型中有各种 try/catch 块,它们将错误消息作为字符串发送回。理想情况下,我希望我的解决方案的模型和控制器部分完全跨平台,但如果不将特定于平台的 Android 上下文传递给模型,我看不到任何有效本地化消息的方法。
有没有人知道如何实现这一目标?
我正在使用.net 资源文件而不是 Android 资源文件。他们让我可以从代码中访问字符串,无论它在哪里。
我唯一不能自动做的就是从布局中引用这些字符串。为了解决这个问题,我编写了一个快速实用程序来解析 resx 文件并创建一个具有相同值的 Android 资源文件。它会在 Android 项目构建之前运行,因此所有字符串在构建时都已就位。
免责声明:我实际上还没有用多种语言测试过这个。
这是实用程序的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace StringThing
{
class Program
{
static void Main(string[] args)
{
string sourceFile = args[0];
string targetFile = args[1];
Dictionary<string, string> strings = LoadDotNetStrings(sourceFile);
WriteToTarget(targetFile, strings);
}
static Dictionary<string, string> LoadDotNetStrings(string file)
{
var result = new Dictionary<string, string>();
XmlDocument doc = new XmlDocument();
doc.Load(file);
XmlNodeList nodes = doc.SelectNodes("//data");
foreach (XmlNode node in nodes)
{
string name = node.Attributes["name"].Value;
string value = node.ChildNodes[1].InnerText;
result.Add(name, value);
}
return result;
}
static void WriteToTarget(string targetFile, Dictionary<string, string> strings)
{
StringBuilder bob = new StringBuilder();
bob.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
bob.AppendLine("<resources>");
foreach (string key in strings.Keys)
{
bob.Append(" ");
bob.AppendLine(string.Format("<string name=\"{0}\">{1}</string>", key, strings[key]));
}
bob.AppendLine("</resources>");
System.IO.File.WriteAllText(targetFile, bob.ToString());
}
}
}
对于 Xamarin,您还可以查看 Vernacular https://github.com/rdio/vernacular
您可以毫不费力地编写代码,而不必担心翻译。将生成的 IL 输入到 Vernacular 以获取 iOS、Andorid、Windows Phone 格式的可翻译字符串。
我在Xamarin iOS 本地化中使用 .NET创建了一个稍微难看的解决方案,您可能会发现它很有帮助。