架构 FAQ:本地化和全球化 第一部分






3.51/5 (39投票s)
架构 FAQ:本地化和全球化 第一部分
- 引言
- 什么是 Unicode?为什么引入 Unicode?
- .NET 是否支持 Unicode?您如何知道它支持?
- 本地化和全球化有什么区别?
- 规划国际化软件时应考虑哪些架构决策?
- 如何在 Windows 和 ASP.NET 中获取当前环境的区域设置?
- 本地化和全球化过程中,哪些命名空间很重要?
- 什么是资源文件?我们如何生成资源文件?
- 资源文件是否可以是 .resx 扩展名以外的其他格式?
- 资源文件在项目中是如何实际使用的?
- 我们如何在项目中启用“自动区域设置”?
- 参考文献
- 其他面试题 PDF
引言
当我们环顾四周时,架构主要讨论松耦合、可伸缩性、性能等等。许多架构都忽略了软件的一个重要方面,那就是使应用程序全球化。根据项目不同,某些应用程序可能并不真正需要多语言网站,但我相信许多应用程序会。因此,在本文中,我们将通过一系列常见问题解答,为您提供有关构建多语言应用程序的快速入门。
您可以在以下链接中阅读我之前关于设计模式和 UML 的文章:-
第 1 部分 – 设计模式:工厂、抽象工厂、生成器、原型、浅复制和深复制,以及单例和命令模式
SoftArchInter1.aspx
第 2 部分 – 设计模式:解释器、迭代器、中介者、备忘录和观察者模式
SoftArch2.aspx
第 3 部分 – 设计模式:状态、策略、访问者、适配器和享元模式
SoftArch3.aspx
第 4 部分 设计模式:桥梁、组合、装饰器、外观、COR、代理和模板模式
SoftArch4.aspx
使用 IOCDI 实现松耦合架构。
IOCDI.aspx
您可以从以下链接下载我的架构面试问题集:-
http://www.questpond.com/softArchi.zip.zip
什么是 Unicode?为什么引入 Unicode?
为了理解 Unicode 的概念,我们需要回顾一下并理解 ANSI 代码。ASCII (American Standard Code for Information Interchange) 代表信息交换的标准 ASCII 码。在 ASCII 格式中,每个字符由一个字节(即 8 位)表示。因此,简而言之,我们可以有 256 个字符 (2^8)。在 Unicode 出现之前,程序员使用代码页来表示不同语言的字符。代码页是 ASCII 集合的不同解释。代码页为英语保留 128 个字符,其余 128 个字符则针对特定语言进行定制。
下图是对同一内容的图形化表示。
图 14.1:代码页工作原理
代码页方法存在以下缺点:-
• 像中文这样的某些语言有超过 5000 个字符,仅凭 128 个字符集很难表示。
• 一次只能支持两种语言。如前所述,您可以为英语使用 128 个字符,为另一种语言使用其余 128 个字符。
• 最终用户必须拥有代码页。
• 代码表示根据操作系统和使用的语言而变化。这意味着一个字符可以根据操作系统表示为不同的数字。
针对以上所有问题,引入了 Unicode。Unicode 使用 2 个字节表示字符。因此,如果它是两个字节,则表示 18 位。现在您可以使用 2^16 个字符,即 65536 个字符。这是一个巨大的数字,您可以包含世界上任何语言。此外,如果您使用代理项,您还可以获得额外的 100 万个字符……这可以包含各种语言,包括历史字符。
ASCII 表示因操作系统和语言而异。然而,在 Unicode 中,它为每个字符分配一个唯一的字母,而不管语言或操作系统如何,这使得程序员在开发国际兼容应用程序时生活更加轻松。
.NET 是否支持 Unicode?您如何知道它支持?
是的,.NET 绝对支持 Unicode。尝试查看 (char) 的大小,您会看到 2 个字节。Char 数据类型只存储一个字符,只需要 8 位,但因为 .NET 需要支持 Unicode,所以它使用 16 位来存储它。
本地化和全球化有什么区别?
以下是摘自 Microsoft 词汇表的定义。
全球化:- 这是开发一个程序核心的过程,其功能和代码设计不完全基于单一语言或区域设置。
本地化:- 为特定本地市场调整程序的流程,包括翻译用户界面、调整对话框大小、自定义功能(如果需要)以及测试结果以确保程序仍然正常工作。
您可以将全球化视为更多架构决策。本地化是根据本地市场调整您的内容。全球化阶段发生在本地化阶段之前。
规划国际化软件时应考虑哪些架构决策?
注意:- 许多程序员认为这只是将文本从一种语言转换为另一种语言。仅仅通过翻译字符串从一种语言到另一种语言来本地化软件是一个非常错误的假设。面试官肯定会对这样的答案感到失望。所以,让我们尝试可视化一下,我们在设计全球化软件时需要考虑哪些设计注意事项。
• 避免在项目中硬编码字符串。任何显示,从标签到错误消息,都应从资源文件中读取。
• 字符串长度也非常重要。众所周知,当我们把英语翻译成其他语言时,单词会增加至少 30% 到 40%。例如,从下图可以看出,与英语文本相比,印地语文本增加了多少。
图 14.2:文本长度增加
因此,所有标签、消息框都应该设计成可以调整文本大小不匹配的问题。不要将所有字段都挤在一个屏幕上,否则肯定会遇到文本长度问题。留出一些扩展空间。
• 小数分隔符因区域设置而异。例如,美国使用的 25,12.80 在希腊或德国是 25.12,80。是的,您猜对了,欧洲的小数分隔符是“,”(逗号)。
• 日历因国家/地区而异。当然,公历是最常用的。但是,还有一些其他日历,如希伯来历、伊斯兰历、中国历等。所有这些日历都有很大的差异。例如,尼泊尔遵循尼泊尔日历,比公历早 56.7 年。因此,根据文化设置,用户可以按预期看到日期。
• 排序顺序受语言影响。从下图可以看出,印地语和英语的排序顺序不同。
图 14.3:根据区域设置的不同排序顺序
• 时间因区域设置而异。例如,印度的晚上 8 点在欧洲是 20:00。在欧洲,没有 AM 和 PM 的概念。
• 如果您使用的是内置字体,请使用资源文件将它们打包。您可以从资源文件中加载字体,而不是明确告诉用户在他的 PC 上安装字体。
• 键盘布局因区域设置和地区而异。因此,在设计快捷键时要小心。功能键几乎存在于所有键盘上。您可能可以将功能键用于快捷键。下面是一个印地语键盘示例。如果您将 Ctrl + V 定义为粘贴功能的快捷键,这可能会让下面的键盘上的印地语用户感到困惑。
图 14.4:本地化印地语键盘
资料来源:- 图片来自 http://www-306.ibm.com/
因此,从以上几点可以看出,使软件适应全球文化不仅仅是字符串翻译。它远不止于此。
如何在 Windows 和 ASP.NET 中获取当前环境的区域设置?
“CultureInfo.CurrentCulture”显示当前环境的区域设置。例如,如果您运行的是印地语,它将显示“hi-IN”。请注意,“当前区域设置”只会显示您的应用程序正在运行的区域设置。因此,如果它是 Windows 应用程序,这将正常工作。然而,在 ASP.NET 2.0 中,我们需要知道最终用户使用的是什么区域设置。
对于真正的国际化网站,不同的用户可以登录并使用不同的区域设置。例如,您可以看到下图,不同的用户从不同的区域设置登录。客户端浏览器在请求头中将信息发送到服务器。例如,韩国用户将向服务器发送请求头中的“KO”。我们可以使用“Request.UserLanguages”获取该值。
图 14.5:来自不同国家/地区的用户的登录
区域设置在用户的浏览器上定义,如下所示。单击工具 – Internet 选项 – 语言。然后您可以将语言添加到语言首选项框中。使用“上移”和“下移”,您可以定义语言的优先级。在下图中,我们定义了四种语言,“印地语”被设置为最高优先级。“Request.UserLanguages”返回一个字符串数组,其中包含浏览器语言首选项选项卡中定义的排序顺序。
图 14.6:在浏览器中设置语言首选项
以下代码片段显示了如何显示用户语言。第一张图是代码片段,显示了如何使用“Request.UserLanguages”。第二张图显示了相同代码的输出。
图 14.7:“Request.UserLanguages”工作原理
图 14.8:“Request.UserLanguages”的输出
需要注意的一件事是“q”值。“q”代表质量因子。在上图中,质量因子表示以下含义:-
"我更喜欢印地语,但可以接受英语(理解度 80%)或希腊语(理解度 50%)或法语(理解度 30%)。"
仅为非英语用户解释“理解度”的含义。
这是从文本中理解和构建意义的过程。
理解度是从最终用户的角度来看的。它表示最终浏览器用户将以这种程度的理解力来理解该语言。例如,在上面的示例中,最终浏览器用户对英语的理解度为 80%。
注意:- 您可以在“全球化”文件夹中找到显示用户语言的示例。运行“DisplayAllLanguageSettings.aspx”并查看输出。仅供参考,源文件是用 VS.NET 2005 编写的,如果您尝试使用 VS.NET 2003 打开它,可能会出现错误。
本地化和全球化过程中,哪些命名空间很重要?
有两个最重要的命名空间:-
• ‘System.Globalization’ – 此命名空间包含定义与区域设置相关的信息的类,包括语言、国家/地区、使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。
• ‘System.Resources’ – 此命名空间提供了类和接口,允许开发人员创建、存储和管理应用程序中使用的各种特定于区域设置的资源。使用此命名空间,您可以读取资源文件并根据用户的区域设置进行显示。
什么是资源文件?我们如何生成资源文件?
资源文件是包含程序资源的文件夹。许多程序员认为资源文件仅用于存储字符串。但是,您也可以将位图、图标、字体、wav 文件存储到资源文件中。
要生成资源文件,您需要单击工具 – 生成本地资源,如下图所示。不要忘记将页面保留在设计器视图中,否则您将看不到该选项。一旦生成了资源文件,您将在解决方案资源管理器中看到生成的 .resx 文件。
图 14.9:使用 IDE 生成资源文件
如果您查看资源文件,它基本上会有一个键和一个对应于该键的值。
图 14.10:资源文件工作原理
如果您查看上图,键基本上是对象的名称。您可以看到 Label1 在资源文件中存储了一些值。
资源文件是否可以是 .resx 扩展名以外的其他格式?
是的,它们可以是 .txt 格式,以键值对的形式。例如,下面是一个带有值的简单 .txt 文件。
Lbluserid = 用户 ID
LblPassword = 密码
CmdSubmitPassword = 提交
资源文件在项目中是如何实际使用的?
我们如何在项目中启用“自动区域设置”?
注意:- 好了,我们已经进行了很多理论上的讨论,现在是时候实际看看了。让我们创建一个小型项目来理解如何实现这一点。在“全球化”文件夹中,您可以运行“LoginScreen.aspx”来实际查看。以下是详细说明。
我们将创建一个简单的登录屏幕,尝试将其用于英语和希腊语。登录屏幕将在英语用户登录时显示英语设置,在希腊用户登录时显示希腊语设置。所以,以下是开始的步骤。
图 14.11:“自动区域设置”工作原理
在上图中,您可以看到登录页面。您可以在 CD 中找到相同的页面,名为“LoginScreen.aspx”。这是一个简单的页面,有两个标签和两个文本框。现在,标签值,即“用户 ID”和“密码”,应根据浏览器上的区域设置进行更改。所以,以下是相关步骤:-
• 创建两个资源文件,如下所示,一个用于希腊语,一个用于英语。为“Userid”、“Password”和页面的主标题定义了三个值。另一个需要注意的重要事项是文件的命名约定。您需要将命名约定与语言代码关联。您可以从下图中看到资源文件的命名约定分为三个部分:文件名、语言代码和资源文件扩展名。在此示例中,我们将演示英语和希腊语,因此我们使用“el”语言代码标记了文件。
图 14.12:资源文件命名约定
以下是定义的两个资源文件:-
图 14.13:希腊语和英语资源文件
• 定义好资源文件后,我们需要定义两个属性:“UICulture=Auto”和“Culture=Auto”。请参阅上面的“自动区域设置工作原理”图。
• 最后一步,您还需要在 UI 对象级别定义资源键。您可以在“自动区域设置工作原理”图中看到一个示例。
图 14.14:根据设置的登录屏幕
编译项目,运行,然后在更改两种语言的区域设置后查看输出。您应该会看到不同的输出,如上图所示。没有写一行代码,一切就绪……这就是“UICulture=Auto”属性的魔力。
注意:- 您可以在“全球化”文件夹中找到上述源代码。请查看“LoginScreen.aspx”页面。
注意:- 在下一部分中,我们将一次回答三个问题。
参考文献
Hanselman 列出了有用的容器链接,供您参考。
http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
http://msdn.microsoft.com/en-us/magazine/cc163739.aspx
http://msdn.microsoft.com/en-us/library/cc707905.aspx
http://www.devx.com/Java/Article/27583/0/page/2
如需进一步阅读,请观看以下面试准备视频和分步视频系列。