如何最好地将整个应用本地化为多种不同的语言?
我正在使用Visual Studio(2005及更高版本)。我正在尝试开发一个应用程序,用户可以在其中更改所有菜单,输入格式等的语言。我想继续这样做,因为我认为.Net中有一些完整的功能可以帮助我实现这一目标?
我需要考虑以下因素(如果我想念一些明显的东西,请填写)
- 字符串(菜单,文本)
- 输入数据(解析浮点数,日期等)
- 应该容易添加对另一种语言的支持
解决方案
回答
对于字符串,我们应该将字符串与代码分开(具有将字符串ID转换为真实字符串的XML / DLL是一种方法)。但是,我们确实需要确保某些语言支持双字节字符(如果使用C / C ++,这是相关的)。
对于输入数据,我们想要的是具有不同的语言环境。在Java中,这相对容易,如果我们使用Cit,也可能很容易。在C / C ++中,我不太了解。基本思想是,输入解析器应基于当时选择的语言环境而有所不同。因此,每个字段(文本字段,文本框等)都必须具有抽象解析器,然后根据语言环境(从右到左,双字节等),由不同的类来实现该抽象解析器。
检查Java实现以获取有关其实现方式的详细信息。它很实用。
回答
我绝不是.NET的专家,但是本地化从来没有像"交换字符串值"或者"更改日期格式"那样简单。还有更多要考虑的因素,例如布局,正确的文本放置。
以中文为例。阅读方式是从上到下而不是从左到右。如果正确本地化,则应用程序应考虑到这一点。
http://msdn.microsoft.com/zh-cn/library/y99d1cd3(VS.80).aspx似乎是一个不错的开始,尽管我们要处理Windows窗体。
回答
经典秘诀是:设计没有本地语言而是本地化功能的应用,然后将初始化开发为一种语言(例如英语)。因此,我们每天晚上都要构建该应用程序并将其本地化为英语;如果没有本地化步骤,它将无法使用。做到这一点,可以用任何其他语言的资源替换用于初始样本本地化的资源。从一开始就考虑非罗马脚本。拥有始终需要本地化的无语言应用程序比需要删除其母语并添加替代语言的特定于语言的应用程序要干净得多。
回答
我们绝对需要使用.NET ResourceManager和resx文件xml格式,但是有许多使用此方法。
这实际上取决于我们要实现的目标。对我来说,我想要一个XML资源文件(每种支持的语言),任何人都可以修改。我创建了一个帮助程序类,该类将全局资源文件加载到ResourceManager中(仅一次),并且我有一个帮助程序函数,该函数为我提供了给定名称的所需资源。这种方法的唯一缺点是我无法利用资源到属性的动态绑定。
我发现,与每种表单的多个或者嵌入式资源文件相比,此方法更易于管理。此外,可以在ASP.NET应用程序中使用完全相同的方法。我还发现这种方法意味着将资源和语言包的翻译外包给客户更加容易管理。
回答
Microsoft推荐的方法是使用附属程序集,如打包和部署资源中所述。如果我们使用ResourceManager加载资源,则.NET将为CurrentUICulture加载正确的资源。这默认为Windows中用户当前的UI语言设置。
可以通过Visual Studio或者外部工具WinRes.exe本地化Windows窗体。本文介绍WinRes以及如何使用Visual Studio本地化窗体。