5

我想以与语言环境相关的方式显示长度,即:以当前语言环境的正确测量单位显示长度。我知道LC_MEASUREMENT这是我需要使用的,但是我该如何使用它呢?

GNU gettext 没有给我任何可以使用的东西LC_MEASUREMENT。我查看了一些天气小程序的来源,它们都要求您在首选项窗口中手动输入您的单位(开尔文、华氏或摄氏)。

在我看来,这个环境变量从来没有被任何人使用过,但是我真的很想用它来提供更好的用户体验。也许,是否有一个免费的(如自由的)数据库将语言环境名称映射到相应的测量单位?

仅供参考:我的应用程序是用 C 编写的。

4

2 回答 2

2

据我所知,C 标准和 GNU gettext 没有提供任何了解一个国家使用的测量单位的方法,没有第三方库可以完成这项工作,也没有现成的数据库(免费或专有) .

然而,根据CIA - The World Factbook 的说法:

目前,只有三个国家——缅甸、利比里亚和美国——尚未采用国际单位制(SI,或公制)作为其官方度量衡系统。

因此,即使没有数据库或第三方库,编写自己的代码也相当容易。您只需要对三个值进行特殊处理LC_MEASUREMENT(或者,更好的是,三个模式,因为其中一些国家有不止一种语言):

更新:所有这些国家都处于(缓慢)转换为公制(SI)的过程中。这可能是没有人费心编写一些库、代码片段或数据库的另一个原因。

于 2012-12-26T18:11:39.033 回答
0

这是一个老问题,但还有另一种方法。如果不是一个明确的解决方案,至少是一个很好的解决方法。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <locale.h>
    #include <langinfo.h>
    
    int main(void)
    {
        /* for LC_MEASUREMENT */
        const char *nonmetric="_MM _US _LR";
        char *measured;

        printf("NL_MEASUREMENT: %s\n", nl_langinfo(_NL_MEASUREMENT_MEASUREMENT));

        measured=getenv("LC_MEASUREMENT");
        printf("\nLC_MEASUREMENT: %s\n", measured);
        has_=strchr(measured, '_');
        if(has_!=NULL && strstr(nonmetric, has_) != NULL)
            printf("US Customary Units\n");
        else
            printf("Metric System\n");

        /* for LC_MONETARY, LC_NUMERIC, LC_MESSAGE, LC_CTYPE and others */
        struct lconv *lc;

        setlocale(LC_ALL, "pt_BR.UTF-8");
        lc=localeconv();
        printf("\nLC_MONETARY, Currency symbol: %s\n", lc->currency_symbol);
        printf("\nLC_NUMERIC, Decimal point: %s\n", lc->decimal_point);
        printf("\nLC_MESSAGE, YESEXPR: %s\n", nl_langinfo(YESEXPR));
        printf("\nLC_CTYPE, CODESET: %s\n", nl_langinfo(CODESET));
    
        return 0;
    }

(*) 第二个代码块只是为了完整性。

但是该示例的第一部分提供了有关公制单位的可用信息。它并不多,但它目前是您可以使用的。

它只是标识国家代码。但是您可以针对这 3个国家(缅甸/缅甸、美国和利比里亚)对其进行测试:

  • *_MM(my_MM 或 en_MM)
  • *_US(chr_US、HAW_US、en_US、es_US 或 lkt_US)
  • *_LR(ff_LR、kpe_LR 或 en_LR)

如果不同,您可以假设采用公制(或至少部分采用)。


在没有环境变量的情况下调用此程序以查看您的配置:

$ ./lc_measurement.x

NL_MEASUREMENT: UTF-8
LC_MEASUREMENT: C.UTF-8
Metric System

LC_MONETARY, Currency symbol: R$
LC_NUMERIC, Decimal point: , 
LC_MESSAGE, YESEXPR: ^[+1SsyY]
LC_CTYPE, CODESET: UTF-8

$ LC_MEASUREMENT="kpe_LR" ./lc_measurement.x

NL_MEASUREMENT: UTF-8
LC_MEASUREMENT: kpe_LR
US Customary Units

LC_MONETARY, Currency symbol: R$
LC_NUMERIC, Decimal point: , 
LC_MESSAGE, YESEXPR: ^[+1SsyY]
LC_CTYPE, CODESET: UTF-8
于 2022-02-18T21:09:31.180 回答