4

使用 Xamarin Android,可以为多语言应用程序创建本地化字符串,如其 Android 文档中所示:

http://docs.xamarin.com/guides/android/application_fundamentals/resources_in_android/part_5_-_application_localization_and_string_resources

但是,我的模型中有各种 try/catch 块,它们将错误消息作为字符串发送回。理想情况下,我希望我的解决方案的模型和控制器部分完全跨平台,但如果不将特定于平台的 Android 上下文传递给模型,我看不到任何有效本地化消息的方法。

有没有人知道如何实现这一目标?

4

3 回答 3

7

我正在使用.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());
        }
    }
}
于 2013-06-07T15:11:34.100 回答
2

对于 Xamarin,您还可以查看 Vernacular https://github.com/rdio/vernacular

您可以毫不费力地编写代码,而不必担心翻译。将生成的 IL 输入到 Vernacular 以获取 iOS、Andorid、Windows Phone 格式的可翻译字符串。

于 2014-06-12T12:45:20.070 回答
1

我在Xamarin iOS 本地化中使用 .NET创建了一个稍微难看的解决方案,您可能会发现它很有帮助。

于 2013-12-16T15:55:19.473 回答