【发布时间】:2015-04-24 02:41:01
【问题描述】:
我目前负责一个现有的 CMS,该 CMS 是几年前使用 C# .Net 构建的,一些客户要求他们的网站使用西班牙语。这些网站预先填充了来自库的页面,目前该应用程序不支持 i18n。让客户拥有西班牙语网站的最快方法是什么?允许任何语言的最佳方式是什么?
我知道这是两个不同的答案,但我想为未来做计划,同时提供一个快速的解决方案来取悦客户。
【问题讨论】:
标签: c# .net internationalization
我目前负责一个现有的 CMS,该 CMS 是几年前使用 C# .Net 构建的,一些客户要求他们的网站使用西班牙语。这些网站预先填充了来自库的页面,目前该应用程序不支持 i18n。让客户拥有西班牙语网站的最快方法是什么?允许任何语言的最佳方式是什么?
我知道这是两个不同的答案,但我想为未来做计划,同时提供一个快速的解决方案来取悦客户。
【问题讨论】:
标签: c# .net internationalization
最简单的 i18n 解决方案通常涉及对程序中的任何文本使用字符串字典。
而不是做这样的事情:
TextBox t = new TextBox();
t.Text = "Hello, user!";
你会做这样的事情:
TextBox t = new TextBox();
t.Text = i18nStringDictionary["HelloUserMessage"]; //some people prefer an enum to
//bare strings in this case
其中 i18nStringDictionary 是一个全局或半全局字典。然后,在应用程序启动时,您可以使用配置文件指定的文件中的正确值对其进行初始化。每种语言都有一个文件。说明上面的例子,在你的英文文件中,你会有:
HelloUserMessage, "Hello, user!"
//More message pairs in english
在你的西班牙语文件中:
HelloUserMessage, "Hola, usario!"
//More message pairs in spanish.
最后,您将这些对解析为字典类型。
当然,这只是在您想自行开发的情况下,但它展示了大多数 i18n 库在幕后所做的事情。否则,您可以使用 C# 的内置功能 (https://msdn.microsoft.com/en-us/goglobal/bb688096.aspx),或查找大量第三方工具。
无论如何,它可能根本不会很快,因为它涉及将站点/程序中的所有字符串文字替换为对某些字典或库的引用。但是,一旦完成,您只需要进行翻译并设置配置文件变量就可以了。
最终编辑:
由于您谈论的是网站,因此您可能也有包含文本的视图或模板。这些通常也需要替换为对字符串库的引用。
【讨论】:
只需搜索 ASP.NET 全球化和本地化。
您可以为 ASP.NET 控件中使用的所有静态文本添加资源文件 (RESX)。 Here is an MSDN article even covering Spanish.
在 Visual Studio 中创建一个新的 RESX 文件将为您提供一个表格视图。假设您将 Text.resx 添加到项目中。这将是默认语言。
|姓名 |价值 | |你好世界 |你好世界 ! | |欢迎留言 |欢迎 ! |您现在可以在后面的代码中引用名称:
Label label = new Label();
label.Text = Text.WelcomeMessage;
或者你可以在设计器中设置绑定
<asp:Label ID="Button1" runat="server"
Text="<%$ Resources:Text, WelcomeMessage %>" />
现在要添加另一种语言,只需创建一个名为 Text.language-country.resx 的新文件。所以在你的情况下 Text.es-ES.resx.
当您切换到西班牙语时,您在此处添加的每个条目都会覆盖默认语言。如果缺少,则显示默认值。
|姓名 |价值 | |欢迎留言 | ¡ |你可以通过改变当前线程的文化属性来切换语言
Thread.CurrentThread.CurrentUICulture =
new CultureInfo("es-ES");
否则可以根据浏览器设置设置语言。 更多信息在这里:https://msdn.microsoft.com/en-us/library/ff647353.aspx
RESX 文件实际上是可以嵌入到程序集中的 XML 文档,被称为内容文件。 因此,您可以将默认资源文件发送给翻译机构以供他们编辑。只是提醒他们不要翻译名称列中的任何条目。
【讨论】: