国际化和本地化
为了适应日益全球化的互联网,作为开发人员,我们有时可能需要构建多语言的国际Web应用程序。
这意味着某些页面将根据用户区域以不同语言显示,并且UI和UX也可能会根据当地假日或文化显示不同的效果。
例如,在运行时,应用程序将能够识别和处理来自不同地理区域的请求并以本地方言呈现页面或显示不同的用户界面。
作为称职的开发人员,我们不希望手动修改应用程序的源代码以满足每个可能的区域。
当应用程序需要添加对新语言的支持时,我们应该能够简单地使用相应的语言包并完成它。
在本次分享中,我们将讨论国际化和本地化(通常分别表示为i18n和L10N)。
国际化是设计应用程序的过程,这些应用程序足够灵活,可以服务于世界各地的多个地区。
在某些方面,我们可以将国际化视为有助于促进本地化的东西,这是适应Web应用程序的内容和设计以适应特定区域的语言或文化需求。
目前,Go的标准软件包不提供i18n支持,但有一些有用且相对简单的第三方实现可用。
在本次分享中,我们将使用开源"go-i18n"库来支持我们示例中的国际化。
当我们谈论使我们的Web应用程序“国际化”时,我们的意思是每个网页都应该使用特定于语言环境的信息构建,并使用相应的本地字符串,时间和货币格式等组合在一起。这涉及三件事:
1. 如何确定用户的语言环境。
2. 如何保存与语言环境相关的字符串或其他信息。
3. 如何根据用户的语言环境嵌入字符串和其他信息。
在第一部分中,我们将介绍如何检测和设置正确的区域设置,以允许网站用户访问其特定于语言的页面。
第二部分介绍如何处理或存储字符串,货币,时间,日期和其他与语言环境相关的信息。
最后,第三部分将介绍如何使您的Web应用程序国际化;
更具体地说,我们将讨论如何使用适合语言环境的内容返回不同的页面。
通过这三个部分,我们将能够在我们的Web应用程序中支持完整的i18n。
设置默认区域
找出语言环境
区域设置是特定地理区域的一组描述符,可以包括特定的语言习惯,文本格式,文化习语和许多其他设置。
区域设置的名称通常由三部分组成。
第一个(也是强制性的)是语言环境的语言缩写,例如英语为“en”,中文为“zh”。
第二部分是可选的国家说明符,并在第一部分后面加一个减号。
此说明符允许Web应用程序区分使用相同语言的不同国家/地区,例如美国英语的“en-US”和英国英语的“en-GB”。
最后一部分是另一个可选说明符,并添加到具有句点的语言环境中。
它指定要使用的字符集,例如“zh-CN.gb2312”指定中文的gb2312字符集。
默认为“UTF-8”编码集,因此Go应用程序中的i18n不需要考虑最后一个参数。
因此,在我们的示例中,我们将仅使用区域设置描述的前两部分作为我们的标准i18n区域设置名称。
在Linux和Solaris系统上,您可以使用locale -a命令获取所有支持的区域名称的列表。您可以使用此列表作为一些常见语言环境的示例。对于BSD和其他系统,没有locale命令,但区域信息存储在/usr/share/locale中。
设置区域
现在我们已经定义了区域设置,我们需要能够根据访问用户的信息(来自他们的个人设置,访问的域名等)来设置它。
以下是我们可以用来设置用户区域设置的一些方法:
来自域名
当应用程序为不同区域使用不同的域时,我们可以通过域名本身设置用户的语言环境。
例如,我们可以使用www.gowhich.com作为我们的默认英文网站,使用域名www.gowhich.cn作为其中文对应网站。
通过为不同的区域设置单独的域,您可以检测并提供所请求的区域设置。
这种类型的设置有几个优点:
1. 通过URL识别语言环境是独特且明确的
2. 用户直观地知道要访问的特定区域或语言的域名
3. 在Go应用程序中实现此方案非常简单方便,可以通过映射实现
4. 有利于搜索引擎爬虫,可以改善网站的搜索引擎优化
我们可以使用以下代码来实现相应的域名区域设置:
if r.Host == "www.gowhich.com" {
i18n.SetLocale("en")
} else if r.Host == "www.gowhich.cn" {
i18n.SetLocale("zh-CN")
} else if r.Host == "www.gowhich.tw" {
i18n.SetLocale("zh-TW")
}
或者,我们也可以通过使用子域来设置语言环境,例如英语站点的“en.gowhich.com”和中文站点的“cn.gowhich.com”。
该方案可以通过以下代码实现:
prefix:= strings.Split(r.Host,".")
if prefix[0] == "en" {
i18n.SetLocale("en")
} else if prefix[0] == "cn" {
i18n.SetLocale("zh-CN")
} else if prefix[0] == "tw" {
i18n.SetLocale("zh-TW")
}
如上所述,从域名设置区域设置有其优点,但是l10n通常不以这种方式实现。
首先,由于每个语言环境都需要自己的域名,因此域名的成本(尽管通常单独可以负担得起)可以很快加起来,并且域名通常不一定适合本地上下文。
其次,我们不希望为每个区域设置单独配置每个网站。
相反,我们应该能够以编程方式执行此操作,例如使用URL参数。
我们来看看下面的描述。
来自URL参数
实现l10n的最常用方法是直接在URL参数中设置所需的区域设置,例如www.gowhich.com/hello?locale=zh或www.gowhich.com/zh/hello。
这样,我们可以像这样设置区域:i18n.SetLocale(params ["locale"])。
这种设置几乎具有将语言环境放在域前面并且它是RESTful的所有优点,因此我们不需要添加其他方法来实现它。
这种方法的缺点是它需要在每个链接内部具有相应的区域设置参数,这可能非常麻烦并且可能增加复杂性。
但是,我们可以编写一个通用函数来生成这些特定于语言环境的URL,以便通过它生成所有链接。
此函数应自动为每个链接添加一个locale参数,以便用户单击它们时,我们可以轻松地解析它们的请求:locale = params ["locale"]。
也许我们希望我们的URL看起来更加RESTful。
例如,我们可以将我们的资源映射到特定区域,例如www.gowhich.com/en/books,用于我们的英文站点,www.gowhich.com/zh/books用于中文站点。
这种方法不仅更有利于URL SEO,而且对用户也更友好。
访问该站点的任何人都应该能够直接从URL访问特定于语言环境的网站资源。
然后,可以通过应用程序路由器传递此类URL地址,以获取正确的区域设置(请参阅描述路由器插件实现的REST部分):
router.Get("/:locale/books", listbook)
从客户端设置区域
在某些特殊情况下,我们需要显式客户端信息才能设置区域设置,而不是从URL或URL参数中获取。
此信息可能直接来自客户端的浏览器设置,用户的IP地址或用户在注册时填写的位置设置。
这种方法更适合基于Web的应用程序。
Accept-Language
当客户端使用带有Accept-Language字段的HTTP标头集请求信息时,我们可以使用以下Go代码来解析标头并设置适当的区域代码:
AL := r.Header.Get("Accept-Language")
if AL == "en" {
i18n.SetLocale("en")
} else if AL == "zh-CN" {
i18n.SetLocale("zh-CN")
} else if AL == "zh-TW" {
i18n.SetLocale("zh-TW")
}
当然,在现实世界的应用程序中,我们可能需要更严格的流程和规则来设置用户区域
IP Address
设置客户区域的另一种方法是查看用户的IP地址。
我们可以使用流行的GeoIP GeoLite Country or City libraries[http://dev.maxmind.com/geoip/legacy/geolite/]来帮助我们将用户IP地址与相应的区域相关联。
实现此机制非常简单:我们只需要在数据库中查找用户的IP地址,然后根据返回的区域返回特定于语言环境的内容。
User profile
您还可以让用户通过输入元素(如下拉菜单(或类似的东西))为您提供其区域设置信息。
收到此信息后,我们可以将其保存到与用户个人资料相关联的帐户中。
当用户再次登录时,我们将能够检查并设置他们的区域设置 - 这保证了每次用户访问网站时,返回的内容将基于其先前设置的区域设置。
小结
在本次分享中,我们演示了可以通过多种方式检测和设置用户特定的区域设置。
这些方法包括通过域名,子域名,URL参数以及直接从客户端设置用户区域。
通过满足特定地区的特定需求,我们可以为用户提供舒适,熟悉和直观的环境,以访问我们提供的服务。
版权声明
由 durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。