在现代网站开发中,国际化(i18n)是一个重要的功能,旨在使网站能够支持多语言,满足全球用户的需求。本文将介绍如何使用 Golang 的模板引擎和 GNU Gettext 实现网站的国际化,以及常见的 i18n 方案和其优缺点。
什么是 i18n
国际化(i18n)是指在软件开发过程中,使应用程序能够支持多种语言和地区的配置。这个过程通常包括:
- 翻译文本内容
- 格式化日期、时间和数字
- 处理不同的文化习惯和规范
网站国际化的好处
在全球化的市场中,网站国际化对于企业出海具有以下显著的好处:
- 扩大用户群:支持多语言的网站能够吸引更多的国际用户,提高网站的访问量和用户粘性。
- 提升用户体验:提供本地化的内容和界面,使用户能够更容易地理解和使用网站,提高用户满意度。
- 增强竞争力:在全球市场中,支持多语言的网站比仅支持单一语言的网站具有更强的竞争力。
- 提高转化率:本地化的网站内容能够更好地传达品牌价值和产品信息,从而提高转化率和销售额。
- 优化 SEO:通过多语言版本的内容和 hreflang 标签,能够提高网站在不同语言搜索引擎中的排名,增加曝光率。
常用的 i18n 方案
GNU Gettext
- 优点:成熟稳定,广泛使用;支持多种语言;有丰富的工具链支持。
- 缺点:初始配置和维护成本较高;翻译文件格式较为复杂。
JSON/YAML 配置文件
- 优点:简单易用;格式直观;与现代前端框架兼容性好。
- 缺点:对大规模多语言支持的扩展性差;需要自己实现较多的工具和功能。
第三方 i18n 库
- 优点:功能完善;易于集成;通常有社区支持和更新。
- 缺点:可能引入额外的依赖;对特定需求的定制化支持不足。
GNU Gettext 介绍
GNU Gettext 是一个国际化和本地化的工具包,广泛应用于各种软件项目中。它的主要功能是通过翻译文件将软件中的文本转换为不同的语言。GNU Gettext 包括以下组件:
- .pot 文件:翻译模板文件,包含需要翻译的字符串。
- .po 文件:翻译文件,包含翻译后的字符串和原始字符串的映射。
- .mo 文件:编译后的翻译文件,供程序运行时使用。
GNU Gettext 的工作流程通常包括以下步骤:
- 提取字符串:从代码中提取需要翻译的字符串,生成 .pot 文件。
- 翻译字符串:将 .pot 文件分发给翻译人员,生成对应语言的 .po 文件。
- 编译翻译文件:将 .po 文件编译为 .mo 文件,供程序使用。
- 加载翻译文件:程序运行时加载 .mo 文件,根据用户的语言设置显示对应的翻译内容。
我的方案
在我的个人项目中,我使用 Golang 的模板引擎编写网页,并使用 GNU Gettext 实现 i18n,定时任务更新 gnu po file 。以下是大致的实现流程:
加载翻译文件: 在网站服务启动时,加载预先生成好的各种语言的 po 翻译文件。通过中间件获取用户的语言设置,或者根据浏览器信息自动匹配语言。
前端 SEO 优化: 在前端网页上通过
hreflang
告知搜索引擎本地化相关的链接信息,这有助于 SEO。语言参数传递: 在 HTML 模板中调用 i18n 需要语言参数。通常需要从请求上下文中获取语言信息,但无法直接将请求上下文传入到模板中,因此需要将语言参数使用模板变量的形式从后端传递到 HTML 模板方法里。
字符串标记和翻译: 实现自定义的需要自动转换语言的标记方法,通常需要包含 3 类,go 中调用的方法、html 模板方法、以及 js 代码中的标记。在编写业务代码时,在 Golang 代码、HTML 模板代码以及 JS 代码中使用自定义的方法标记需要翻译成其他语言的字符串。该方法的作用除了可以调用 gettext 获取文字对应的翻译语言外,还能起到 shell 脚本提取翻译文字的标记。
定时任务: 使用 shell 脚本每天根据规则定时提取 HTML、Go、JS 代码中的标记字符串,以及数据库中需要翻译的内容(历史的、新增的、更新过的),以特定格式生成文本文件,在通过 GNU Gettext 将其转换为 po 模板。很多网站的国际化只有导航等固定内容的国际化,实际数据库中的动态内容却没有国际化,全站内容都做 i18n,这是我想处理的重点问题。将这些文件与历史文件对比合并,避免重复内容导致文件过大和处理困难。
自动翻译和更新: 使用 GNU Gettext 将生成文件转换为 po 模板并生成 po 文件,然后通过 Python 代码读取解析 po 文件,找出没有翻译过的内容。通过调用谷歌翻译将内容翻译为不同语言并写回 po 文件,同时修正翻译结果的格式。当然自动翻译的结果不是那么完美,有时候需求人工审核检查。
自动提交和部署: 完成翻译后,将新增的 URL 更新到 sitemap,自动提交代码,触发自动部署上线更新网站。上线成功后,将新增和更新的 URL 提交通知给百度、微软以及谷歌等搜索引擎,确保更新后的网页能被快速搜索到。
在《Gin 使用 GNU gettext 方式实现 i18n 国际化多语言》这篇博客文章中有实现细节的介绍,感兴趣的可以看看。
以上提到的 GNU Gettext 的 Golang 包我使用的是:gettext-go,调用免费谷歌翻译的 Python 库是:pygtrans。
提交链接工具
为了便捷地将 URL 提交通知给百度、微软以及谷歌等搜索引擎,我开发了一个 Golang 包——urlsubmitter 用于提交链接。目前还比较粗糙,欢迎大家一起完善。
总结
通过上述方案,可以实现网站的全面国际化,支持多语言内容的自动更新和优化,提升用户体验和搜索引擎优化效果。希望本文能对有相似需求的开发者提供参考和帮助。