ASP.NET应用程序的国际化库

时间:2009-06-29 20:36:56

标签: .net asp.net internationalization translation

我正在ASP.NET(2.0),VS2005中编写一个Web应用程序。开发新应用程序(而不是使用现成的现成解决方案)的主要原因是我需要完全支持至少两种语言(即前端和数据)。我正在寻找在ASP.NET中处理i18n的最佳方法(它可以只是UI,整理DB更简单)。 显然.NET提供了自己的i18n机制,我之前一直在使用它们,但并没有给人留下太深刻的印象 - 在我看来,我在C ++和Java的几个大型开源项目中使用了gettext。 我正在寻找一种能满足以下要求的解决方案:

  • 所有翻译都集中在一个地方
  • 轻松添加新语言
  • 翻译不需要VS,可以由相当缺乏经验的用户(翻译)完成
  • 发现可用语言
  • 更改为原始字符串,可轻松级联到现有翻译
  • 支持复数形式(ngettext)

(更多想法?)

5 个答案:

答案 0 :(得分:6)

我不确定你对常规GlobalizationLocalization的反对意见,你已经说过你已经使用过了。{/ p>

.Net本地化在我使用它的项目上发挥了很大作用,而没有修改核心原则。它到底是怎么回事?

例如,您列出的功能可以使用ASP.Net Globalization Framework完成。

  • 您的所有翻译都会收集在您的资源(.resx)文件中。可以插入单个或多个组件中。
  • 添加语言就像添加具有正确文化前缀的资源文件一样简单。这也可以是单独的文件或嵌入式资源。
  • 根据您的方案,翻译不需要Visual Studio。资源文件(.resx)是XML文件。如果嵌入资源文件,则只需重新编译。
  • 支持语言发现,支持“级联”翻译。
  • 可能必须使用逻辑来处理复数,但这似乎很容易解决。

最后,如果这些都不适合您,那么您可以Extend the Resource Provider Model从您选择的任何来源获取本地化文本。

答案 1 :(得分:4)

快速说明:gettext显然可以在Win32平台上用作非托管库。看看这个dude的博客文章:

http://weblogs.manas.com.ar/spalladino/2009/10/07/gettext-i18n-strings-in-asp-net-controls/

另外,来自C#上的gettext语言文档:

http://www.gnu.org/software/hello/manual/gettext/C_0023.html#C_0023

另一个人谈论了asp.net的gettext i18n:

http://www.expatsoftware.com/articles/2010/03/fixing-internationalization-in-aspnet.html


意见继续:我真的认为.NET风格的国际化使用资源文件并不是那么好。首先,您必须在代码中编写字符串:

My.Resources.ErrorMsgDbNotConnected

在编译代码之前,必须将字符串添加到资源文件中。如果你问我的话,从正在进行的工作中跳出去将一个字符串添加到资源文件然后回来是一个障碍。另外,反之亦然:要查找字符串,您需要查看resources文件夹。不那么激烈,但仍然很烦人。

gettext使用您的家庭语言字符串作为键:

gettext("Sorry, the database connection could not be created.")

如果语言文件中没有密钥,则会解析并使用原始字符串。此外,这意味着翻译者只需打开一个文件即可查看原始语言字符串和翻译后的字符串,而不是打开和比较两个资源文件。

gettext还支持复数,性别和其他语言变体,因此它可以解决多元化问题(“你有1封新电子邮件。”),即使是英文也是如此!

不要以为我是一个.NET仇恨者:基于文化的.NET日历,时间和数字格式非常好,我只是觉得翻译的内容有点缺乏。

答案 2 :(得分:2)

查看FairlyLocal. It's a GetText-based i18n library for ASP.NET,这正是您所要求的。

比处理巨型.resx文件并将所有文本包装在服务器控件中更好。

答案 3 :(得分:1)

.Net已经支持轻松添加新语言并发现可用的语言。

解决在没有VS的情况下进行编辑并在一个地方收集所有资源的要求:

如果您想使用内置的.net框架进行本地化,我建议您使用Zeta Resource Editor来编辑资源文件。 Zeta有一些很好的功能,比如标记没有所有正确翻译的资源,还标记格式字符(例如{0} {1})不匹配的资源。

如果您想要更集中的内容,请查看创建database resource provider

不幸的是,对复数的支持是不存在的。

我不知道你的意思是“对原始字符串的更改很容易级联到现有翻译”。

答案 4 :(得分:0)

对于复数和性别,您可以使用

https://github.com/jaska45/I18N

它使用CLDR中的规则,而不需要CLDR的XML文件或ICU的DLL。 Eveything(逻辑和规则)实现为库的C#文件。非常容易使用。

var message = MultiPattern.Format("one;I have {0} car;other;I have {0} cars", cars);

本地化翻译器可以提供与目标语言所需的模式一样多的模式。