5

ロケールに依存する方法で長さを表示したいのですが、つまり、現在のロケールの正しい測定単位で長さを表示します。使用する必要があるものはわかっLC_MEASUREMENTていますが、どのように使用すればよいですか?

GNU gettextは、で動作するものを何も提供しませんLC_MEASUREMENT。いくつかの天気アプレットのソースを調べましたが、それらはすべて、設定ウィンドウにユニット(ケルビン、華氏、または摂氏)を手動で入力する必要があります。

その環境変数は誰にも使用されていないように思えますが、ユーザーエクスペリエンスを向上させるために使用したいと思います。おそらく、ロケール名を対応する測定単位にマップする無料の(自由のように)データベースはありますか?

参考:私のアプリケーションはCで書かれています。

4

2 に答える 2

2

私の知る限り、C標準とGNU gettextは、国で使用されている測定単位を知る方法を提供していません。その仕事をするサードパーティのライブラリはなく、すぐに使用できるデータベース(無料またはプロプライエタリ)はありません。 。

ただし、CIAによると-ワールドファクトブック

現時点では、ビルマ、リベリア、米国の3か国のみが、重量と測定の公式システムとして国際単位系(SI、またはメートル法)を採用していません。

したがって、データベースやサードパーティのライブラリがなくても、独自のコードを作成するのはかなり簡単です。LC_MEASUREMENT3つの値(または、これらの国の一部には言語以上のものがあるため、3つのパターン)を特殊なケースにする必要があります。

更新:これらの国はすべて、メートル法(SI)への変換の(遅い)プロセスにあります。これはおそらく、ライブラリ、コードスニペット、またはデータベースを作成することを誰も気にしないもう1つの理由です。

于 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;
    }

(*)コードの2番目のブロックは、完全を期すためのものです。

ただし、例の最初の部分では、メートル単位について入手可能な情報を示しています。それほど多くはありませんが、現在は自由に使用できます。

国コードを識別するだけです。ただし、これら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 に答える