You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:20:27