3

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

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

(还有什么想法吗?)

4

5 回答 5

6

我不确定您对常规GlobalizationLocalization有什么反对意见,您已经说过您已经使用过。

.Net 本地化在我使用它的项目中效果很好,而无需修改核心原则。它到底对你有什么不足?

例如,您列出的功能可以使用 ASP.Net 全球化框架来完成。

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

最后,如果这些都不适合您,那么您可以扩展资源提供者模型以从您选择的任何来源获取本地化文本。

于 2009-06-29T20:42:50.017 回答
4

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

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

另一个谈论 gettext i18n for asp.net:

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


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

My.Resources.ErrorMsgDbNotConnected

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

gettext 使用您的母语字符串作为键:

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

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

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

不要以为我讨厌 .NET:基于文化的 .NET 日历、时间和数字格式真的很棒,我只是觉得翻译的东西有点欠缺。

于 2010-02-17T22:57:26.460 回答
2

查看FairlyLocal。这是一个用于 ASP.NET 的基于 GetText 的 i18n 库,它几乎正是您所要求的。

比处理巨大的 .resx 文件并将所有文本包装在服务器控件中要好得多。

于 2010-12-07T17:53:12.073 回答
1

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

为了解决在没有 VS 的情况下进行编辑并将所有资源集中在一个地方的需求:

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

如果您想要更集中的东西,请查看创建数据库资源提供程序

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

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

于 2009-06-29T20:54:23.707 回答
0

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

https://github.com/jaska45/I18N

它使用来自 CLDR 的规则,而不需要 CLDR 的 XML 文件或 ICU 的 DLL。一切(逻辑和规则)都是作为库的 C# 文件实现的。非常容易使用。

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

在本地化时,翻译器可以提供目标语言所需的尽可能多的模式。

于 2017-11-07T00:49:55.500 回答