ASP.NET 和 SQL 深入探讨文化和语言






4.80/5 (35投票s)
在本文中,我们将详细探讨如何使用 Asp.net 创建多语言、多文化应用程序。
引言
Asp.net 是一项非常有趣的技术,其支持多种语言的能力让我们(开发人员)在国际舞台上立足。这是否意味着每个 asp.net 应用程序都支持多种语言?答案是否定的。我们需要自己去实现,为此,我们需要理解一些术语和指南。在本文中,我们将详细探讨如何使用 Asp.net 创建多语言、多文化应用程序。
目标读者是谁?
如果您在开发多语言 Asp.Net 应用程序方面经验丰富,那么您可能会觉得这篇文章很无聊,因为您即将阅读的大部分内容您已经知道了。但如果您是一名希望学习使用 Asp.Net 创建针对多种文化和语言的网站的开发人员,或者想复习一下您所知道的内容,那么您来对地方了。
为什么需要多语言或多文化?
在当前的 IT 世界中,软件销售竞争激烈。客户需要的不仅仅是一个运行其业务的系统。当我们在路上看到一张用我们母语写的横幅时,我们的表情会改变,我们会感到高兴。每个人都喜欢看到自己的母语文化,这是人类的天性。软件应用程序也是如此。人们正在要求使用他们母语和文化的应用程序。
议程
- 全球化与本地化
- 如何使应用程序成为全球化应用程序。
- 如何使应用程序成为本地化应用程序。
- Culture vs. UI Culture(区域设置 vs. UI 区域设置)
- 如何显式设置页面或应用程序的区域设置。
- 如何在全球化应用程序中管理用户输入数据。
- 什么是 SQL Server 排序规则?
- 如何处理排序规则。
- 排序规则和 TempDb。
- varchar 和 nvarchar 之间有什么区别
- 如何在 Asp.Net 中本地化 JavaScript 消息?
全球化与本地化
正如我之前所说,每个人都希望看到应用程序是他们自己的语言。为了实现这个目标,我们可以做的一件事是创建同一页面的多个版本(一页代表一种语言或文化),并根据用户的请求向其显示相应的页面。这不是一个可行的解决方案,因为它违反了面向对象的 DRY(Don't repeat yourself,不要重复自己)原则。这意味着我们必须以一种能够适应多种文化和语言的方式来创建应用程序。这种设计和开发此类应用程序的过程称为 **全球化**。
现在,一旦这样的应用程序开发完成,一些输入将被添加到每个 UI 中。例如,输入意味着告诉系统每种语言(系统需要显示)的每个单词的含义,以便将其本地化。这个将全球化应用程序定制为特定文化的应用程序的过程称为 **本地化**。
如何使应用程序成为全球化应用程序。
为了使应用程序成为全球化应用程序,第一步是识别应用程序中那些阻止其成为全球化应用程序的部分。为此,我们首先需要一个应用程序,所以让我们创建它。
输出
![]() |
|
为了识别全球化问题,我们需要查看标记和代码隐藏。
上述代码的问题是:
- UI (aspx) 包含太多静态内容(例如“in your pocket”、“User Name”、“Password”等消息)。为了使 UI 成为全球化 UI,我们应该用一些占位符替换这些静态内容,以便内容可以在运行时根据特定文化进行更改或替换。
- 为了显示当前日期,我们手动连接日期的各个部分并以 dd/mm/yyyy 格式显示,这对于印度文化来说是正确的,但其他文化呢?我们必须使用通用的语法来表示日期。
- 为了显示金额,我们使用“amount”变量的“ToString”方法并附加“Rs”字符串。同样,这对于印度文化来说是完美的。要显示金额,我们应该使用某种通用方法,该方法会自动为小数点、分隔符、前缀和后缀格式化数字(金额变量)。
解决方案
- 为了使静态内容动态化,我们可以在 Asp.net 中使用“Label”控件,并在运行时根据文化更改其 Text 属性。
- 为了显示当前日期,我们将使用 DateTime 对象的“ToShortDateString”方法。
- 对于金额,我们将使用其重载版本的“ToString”方法,并传递“c”作为参数。(“C”表示货币)。
注意:Label 并不是唯一的解决方案,您可以使用任何内容可以在运行时更改的内容。例如:Literal、Textbox 等。
最终代码
输出
![]() | 现在这个输出与之前的不同。
造成这种差异的原因是什么? 之前显示的任何内容基本上都使用了固定的格式和样式,但现在一切都基于文化和语言,当我提到文化和语言时,我指的是浏览器的文化和语言。 |
让我们将浏览器区域设置更改为西班牙语文化之一,然后检查输出。
注意:我们不涵盖如何更改浏览器区域设置。您可以在互联网上找到很多相关链接。供参考,请查找以下链接:http://www.wikihow.com/Change-Your-Browser's-Language。
![]() | 如您所见,全球化应用程序可以轻松适应多种文化。 问题是什么? 全球化应用程序从不翻译任何内容,它只影响格式。您可以在输出中看到所有文本仍然是英文的。在下一步中,我们将手动告诉系统每个单词在西班牙语中的含义,这称为本地化。 |
如何使应用程序成为本地化应用程序。
为了使应用程序本地化,我们首先应该使其全球化。
现在,为了实现本地化,Microsoft .Net 有一个叫做资源文件的东西。
资源文件有两种:1) 本地资源文件 2) 全局资源文件。
我们将通过示例详细讨论它们。
1. 本地资源文件
本地资源文件将仅链接到一个 aspx 或 ascx 文件。使用它,我们将告诉系统每个单词或句子在特定语言和文化中应该如何称呼。
步骤 1
要创建资源文件,请转到 aspx 文件的设计模式,然后单击工具 -> 生成本地资源文件。
第二步
一旦您这样做,您会注意到两个变化:
- 解决方案资源管理器中会创建一个名为 App_LocalResources 的新文件夹,其中包含一个名为 Login.aspx.resx 的文件。
- UI 中的每个服务器控件现在都附加了一个名为“meta:resourcekey”的属性。
![]() | 在资源文件中,您会注意到一些键值对,其中每个键代表特定控件的特定属性,值代表内容。 |
步骤 3
复制资源文件并创建一个新副本,然后将新副本重命名为“Login.aspx.es-CR.resx”。这里的 es-CR 称为区域标识符。区域标识符由两个标记组成——区域名称和语言名称。例如,这里的“es”代表西班牙语,“CR”代表哥斯达黎加的区域。
步骤 4
打开新创建的资源文件。这个文件只是您之前的文件“Login.aspx.resx”的副本,所以您会在新文件中找到之前文件中的所有键。
使用谷歌翻译或其他工具,并将每个单词/句子的西班牙语表示形式放入相应的字段值中。
步骤 5
执行两种文化下的应用程序并检查输出。
注意:您可能会注意到按钮的宽度增加了。现在这就是我们在全球化阶段应该考虑的。在设计 UI 时,我们应该考虑到将来 UI 也会提供其他语言的版本,因此我们应该将控件(其内容将来会更改)的宽度设置为“auto”或最大值。
2. 全局资源文件
全局资源文件不链接到任何特定的 aspx 或 ascx 文件。假设我们要跨多个页面重用某些消息,并且这些消息应该基于语言。在这种情况下,全局资源文件非常有用。
步骤 1
右键单击您的 asp.net 项目,添加 -> 添加 Asp.Net 文件夹 -> App_GlobalResources。
第二步
右键单击文件夹。单击添加项。选择资源文件。将其命名为 DisplayMessages.resx。
步骤 3
打开文件,它看起来像本地资源文件,但没有条目。
在此文件中添加一个条目。
步骤 4
创建该文件的副本,并将其命名为 DisplayMessages.es-CR.resx。
步骤 5
打开新创建的文件。并将值更改为西班牙语表示。
![]() | 注意:出于演示目的,我只使用了演示文本。 |
步骤 6
在 Login 页面中创建一个标签,如下所示:
<asp:Label runat="server" Text="<%$ Resources:DisplayMessages,HeaderMessage %>" />
步骤 7
执行两种文化下的应用程序并检查输出。
现在我们知道全球化意味着什么,本地化意味着什么。是时候继续深入探讨一些术语了。
Culture vs. UI Culture(区域设置 vs. UI 区域设置)
假设您已经按照我们上面讨论的所有事实创建了一个全球化应用程序。之后,您尝试使用资源文件使其本地化。但是问题是,您的网站会如期工作吗?不,您必须将页面的另外两个属性 Culture 和 UICulture 设置为“auto”。
在页面级别:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="MultilingualSample.Login" Culture="auto" UICulture="auto" meta:resourcekey="PageResource1" %>
或在应用程序级别 – 在 web.config 文件中:
<configuration> <system.web> ……… <globalization culture="auto" uiCulture="auto"/> </system.web> </configuration>
它们之间有什么区别?
- UICulture 值决定了 ASP.NET 需要加载哪个资源文件。它用于页面中的内容。
例如:如果 UICulture 值设置为 es-CR,那么值将从 Login.aspx.es-CR.aspx 中获取并显示。
- Culture 值决定了依赖于区域设置的函数的结果,例如日期、数字和货币格式等。
例如:当 Culture 值设置为 es-CR 时,DateTime 和货币将使用哥斯达黎加格式显示。
为什么需要两个不同的属性?
这为我们提供了更高的灵活性。例如,我们可以根据浏览器的配置切换文本和消息的语言,同时保持全球化设置(如日期和货币)不变。
为什么值应该设置为 auto?
当值设置为 auto 时,将根据浏览器设置的值来考虑。例如,如果浏览器区域设置为 es-CR 且 UICulture 值设置为 auto,则将获取并显示西班牙语资源文件。
如果我们不为这些属性设置值会怎样?
如果您忘记为 Culture 属性设置值,您的日期和货币将开始使用您服务器的默认区域设置显示。同样,当 UICulture 值未设置时,将始终考虑默认资源文件中的值。
如何显式设置页面或应用程序的区域设置。
我们可以通过 3 种方式做到这一点:
1. 使用 @Page 指令
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="MultilingualSample.Login" Culture="es-CR" UICulture="en-US" %>
2. 使用 web.config
<configuration> <system.web> ……… <globalization culture="es-CR" uiCulture="en-US"/> </system.web> </configuration>
3. 以编程方式
protected override void InitializeCulture() { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-CR"); base.InitializeCulture(); }
如何在全球化应用程序中管理用户输入数据
当说 Web 应用程序时,它不仅仅是显示信息。它还从用户那里获取信息,并最终将这些信息存储在数据库中。
为了创建一个完整的多语言应用程序,适当的数据库设计是必须的。为了创建适当的数据库设计,我们应该了解以下几点。
什么是 SQL Server 排序规则?
SQL Server 排序规则涉及 SQL Server 如何解释字符数据。
简而言之,排序规则指定三个属性:
- 非 Unicode 数据类型(如 char、varchar)的排序顺序。
- Unicode 数据类型(如 varchar 和 nchar)的排序顺序。
- 用于存储非 Unicode 字符数据的代码页。
(本文档不详细介绍代码页,但简而言之,它为语言定义了一组值,每个值代表一个特定的字符。如需详细信息,请访问此链接:http://en.wikipedia.org/wiki/Code_page)
现在排序顺序也取决于:
- 区分大小写 – ‘A’ 和 ‘a’ 是相同还是不同?
- 区分重音符号 – ‘a’ 和 ‘á’ 是相同还是不同?
- 区分假名 – 平假名和片假名是否被视为相同?(属于日语)。
- 区分宽度 – varchar 类型中的“Sql”和 nvarchar 类型中的“Sql”是否相同?简而言之,单字节字符是否等于其双字节表示?
如何处理排序规则?
排序规则可以应用于:
- SQL Server 实例级别(安装时)。
注意:服务器级别的排序规则可以在之后更改。如需详细信息,请访问此链接。
http://msdn.microsoft.com/en-IN/library/ms179254(v=sql.105).aspx
- 数据库级别(创建数据库时)。
CREATE DATABASE newDatabase COLLATE SQL_Latin1_General_CP1_CS_AS
- 列级别
CREATE TABLE [T1] ( [NormalColumn] [varchar](50) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL, [AdvancedColumn] [nvarchar](50)COLLATE SQL_Latin1_General_CP1_Ci_AS NOT NULL )
- 查询级别
SELECT Column1 FROM Table1 WHERE Column1 COLLATE Latin1_General_CS_AS = 'casesearch' and Column2 COLLATE Latin1_General_CI_AS = 'CaseInsensitiveSearch'
排序规则和 TempDb
TempDb 是存储所有临时表和存储过程的地方。每次 SQL Server 启动时都会创建此数据库。现在的问题是,该数据库的排序规则是什么?简单来说,这个问题的答案是,与 Model 数据库相同。这意味着我们当前正在使用的数据库(例如客户数据库)和 TempDb 数据库具有不同的排序规则,这可能导致意外的输出。
为了避免此类问题,一种解决方案是在创建临时表时为每一列显式设置排序规则。
CREATE TABLE #T1( [NormalColumn] [varchar](50) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ) ON [PRIMARY]
varchar 和 nvarchar 之间有什么区别?
现在在 SQL Server 中,为了存储用户输入(特别是文本),我们有 text、ntext、char、nchar、varchar、nvarchar 等选项。
几乎每种数据类型都有其“n”表示形式。那么它们之间有什么区别呢?
一个没有“n”的存储非 Unicode 字符,一个有“n”的则存储 Unicode 字符。
因此,nvarchar、nchar 等数据类型能够存储多种语言的数据。
如何在 Asp.Net 中本地化 JavaScript 消息
1. 使用隐藏字段和标签
- 为了本地化 JavaScript 消息,我们可以做的一件事是将标签或隐藏字段放在页面上。
- 在运行时根据资源文件中的区域设置,为这些控件赋值。
- 在 JavaScript 中,每当需要显示消息时,我们只需访问控件并获取其值。
例如:alert ($(‘.ConfirmationLabel’).text());
2. 使用 JSON
- 我们将创建一个 JavaScript 文件,其中包含类似以下的 JsonObject:
var MyAppLocalizedMessages = { DoYouWantToDeleteMessage: { 'en/US': 'Are you sure?', 'fr/FR': 'Are you sure in Spanish?' } }
- 在页面上创建一个隐藏字段,并在页面加载或初始化时将当前区域设置代码分配给它。例如:HiddenCulture.Value = Session["CurrentCultureCode"].ToString();
- 每次要显示消息时,请使用以下语法:var message=MyAppLocalizedMessages.
DoYouWantToDeleteMessage[$(‘#HiddenCulture’).val()];
3. 使用 jQuery 插件
在此处阅读:http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx
4. 使用 ScriptManager
在此处阅读:http://msdn.microsoft.com/en-us/library/bb386572(v=vs.100).aspx
结论
在本文中,我们学习了如何使用 asp.net 创建多语言网站。感谢您的耐心。请继续阅读、继续学习、继续分享。
有关包括 ASP.NET、设计模式、WCF 和 MVC 在内的各种主题的技术培训,请联系 SukeshMarla@Gmail.com 或访问 www.sukesh-marla.com。
要获取更多此类内容,请单击此处:http://www.sukesh-marla.com/。订阅文章更新或在 Twitter 上关注:@SukeshMarla。
观看 500 多个关于 MSBI、.NET、SharePoint、架构、SQL、WPF、WCF、MVC、ASP.NET 等的视频,请访问:www.questpond.com。