gettext的本地化分类有哪些?如何应用于时间、货币等场景?
Gettext与其他本地化分类的配合使用
首先明确:gettext的核心是处理文本翻译(对应LC_MESSAGES分类),时间、货币、数值、字符集这类本地化需求,并不由gettext直接实现,而是通过系统的本地化环境配置+对应语言的标准库API来处理——这些分类(LC_TIME、LC_MONETARY、LC_NUMERIC等)属于GNU本地化体系的一部分,和gettext配合使用即可完成完整的软件本地化。
下面以Python和C语言为例,说明具体实现方式:
1. 统一配置所有本地化分类
通过设置全局本地化环境,让所有分类(包括LC_MESSAGES)都使用同一套locale规则,同时初始化gettext处理文本翻译。
Python示例
import locale from gettext import translation from datetime import datetime # 设置全局本地化(法语-法国),所有LC_*分类自动应用对应规则 locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') # 初始化gettext翻译(处理LC_MESSAGES) trans = translation('myapp', localedir='locales', languages=['fr']) trans.install() # 数值格式化(LC_NUMERIC):法语千分位用空格分隔 print(locale.format_string("%d", 1234567, grouping=True)) # 输出:1 234 567 # 货币格式化(LC_MONETARY):法语货币符号在金额后,用逗号做小数分隔 print(locale.currency(1234.56)) # 输出:1 234,56 € # 时间格式化(LC_TIME):法语日期格式为DD/MM/YYYY print(datetime.now().strftime('%x %X')) # 输出:07/10/2024 14:35:22 # gettext处理文本翻译 print(_("Hello World")) # 输出对应法语翻译:Bonjour le monde
2. 单独配置某类本地化规则
如果需要混合不同locale的规则(比如全局用美式英语,但日期用英式规则),可以单独设置特定的LC_*分类。
Python示例
import locale from datetime import datetime # 全局设置为美式英语 locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # 单独将时间分类设置为英式英语 locale.setlocale(locale.LC_TIME, 'en_GB.UTF-8') # 日期格式化将使用英式规则(周一开始,日期格式DD/MM/YYYY) print(datetime.now().strftime('%A, %x')) # 输出:Monday, 07/10/2024 # 数值格式化仍使用美式规则(千分位用逗号) print(locale.format_string("%d", 1234567, grouping=True)) # 输出:1,234,567
3. C语言原生示例(GNU本地化体系)
#include <stdio.h> #include <locale.h> #include <time.h> #include <libintl.h> #include <locale.h> #define _(str) gettext(str) int main() { // 设置全局本地化为德语-德国 setlocale(LC_ALL, "de_DE.UTF-8"); // 绑定gettext翻译域 bindtextdomain("myapp", "./locales"); textdomain("myapp"); // 数值格式化(LC_NUMERIC):德语千分位用点 printf("%'d\n", 1234567); // 输出:1.234.567 // 货币格式化(LC_MONETARY):德语货币符号在前,小数用逗号 struct lconv *lc = localeconv(); printf("%s%.2f\n", lc->currency_symbol, 1234.56); // 输出:€1234,56 // 时间格式化(LC_TIME):德语日期格式为DD.MM.YYYY time_t now = time(NULL); char buf[100]; strftime(buf, sizeof(buf), "%x %X", localtime(&now)); printf("%s\n", buf); // 输出:07.10.2024 14:40:15 // gettext文本翻译 printf("%s\n", _("Hello World")); // 输出:Hallo Welt return 0; }
关键总结
- gettext仅负责字符串翻译,对应
LC_MESSAGES分类; - 时间、货币、数值等格式化依赖系统的locale数据库,通过语言的标准库API调用;
- 所有本地化分类通过
setlocale(或对应语言的locale模块)统一/单独配置,和gettext配合完成全流程本地化。
内容的提问来源于stack exchange,提问作者igorsantos07
相关产品推荐
相关产品推荐

