(ロケール設定ではなく)ロケール定義を変更する


8

予備の発言:この質問はない程度に設定変更することでロケールをLC_ALLLC_TIMELANG、など、それはロケール変更については、むしろだ定義を例で、/usr/share/i18n/locales/de_DEこれらのシステム設定を変更するよりも、より適切なオプションについての提案を取得するには、それぞれ、または。

その目的は、ISO時間表現 を取得することで%Y-%m-%dあり%H:%M:%S、望ましくない副作用ありません。

私がネットで見つけた提案はまだすべて不適切でした(たとえば、ロケールを「デンマーク語」に設定すると、母国語のスペルの平日の名前が維持されません)。

現在、望ましい動作を得るために私が現在見ている唯一の選択肢は、で私のネイティブロケールの定義を変更することです/usr/share/i18n/locales/de_DE。システムの更新により、これらの変更されたファイルが再度上書きされる可能性があるため、これは完全なソリューションではありません。

私の質問は:

  1. 特定のシステムロケールファイルを変更するよりも、目的の機能を取得するためのロケール関連のオプションはありますか?
  2. 特定のロケール定義ファイルを変更するときに予想される問題はありますか?(そして、システムが更新された場合に、このファイルが上書きされるのをどのように防ぐことができますか?)
  3. 既存のロケールファイルの新しい特定のバリアントを定義し、それをLC_*設定で使用する方が良いでしょうか?(そして、その新しいファイル/定義はどのようにしてシステムに正しく知らされるのでしょうか?)
  4. 他に何か提案はありますか?

興味のあるロケールファイルをコピーし、そのコピーに一意の名前を付けて(たとえば、en_XX-ここでの制限は何なのかわからないので、試行錯誤で十分かもしれません)、必要な変更を加えてください。 、それをロケールとして使用します。リストなどを後で再生成する必要があります
。– goldilocks

1
あなたは私の質問を読みたいかもしれません。それは私がしたことの詳細を含んでいます。私はまだそれをパッケージ化していませんが、今のところこれはかなりうまくいきます。単純に設定LC_TIME(中/etc/environmentまたは/etc/default/localeまたは/etc/locale.conf変更されたロケールにディストリビューションに依存します)(私は鉱山と呼ばれるisodate.UTF-8)と、それぞれの形式は、唯一の時間/日付のためにそのカスタマイズされたロケールから選ばれます。これは、en_USISOの日付と時刻を表示するように他の設定をカスタマイズした方法です。
0xC0000022L

1
@Janis:DebianとUbuntuでは、ロケールの名前/var/lib/locales/supported.d/local(またはそこにある他のファイルの1つ)を入力dpkg-reconfigure localesし、コンパイルするロケール定義のスーパーユーザーとして実行することもできます。そして、はい、カスタマイズされたロケールを指すように設定LC_TIMEすることは、これまでに見た中で最も煩わしくない方法のようです。そのため、システムにはLC_TIME「全体的なロケール」とは異なる設定が可能なグローバル設定があります。
0xC0000022L 2015年

@ 0xC0000022L; ここでのあなたの経験は非常に貴重です。ここまでの提案で、新しいロケールファイルを探します。copyonセクションのアプローチを使用するか、他のセクションを冗長にしておくか(diff元のファイルに対してできるようにするため)は、まだ決定していません。
Janis

回答:


5

、最近の質問、私はこのような変化のためのベストプラクティスは何尋ねました。まだ答えはありませんでした。しかし、私が使用しているレシピをお伝えします。これは問題なく機能することが証明されています。すべてのプログラムが日付を正しく取得します。

私の説明はUbuntuについてですが、DebianとMintで動作する可能性があります。

準備

カスタマイズするロケールを/usr/share/i18n/locales新しいファイルにコピーします。例えば

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate

セクションを除いてすべてを次のように調整しますLC_TIME

copy "de_DE"

LC_TIME希望する結果に合わせてセクションを調整します。上記のリンクされた質問の設定をテンプレートとして使用できます。これはまさにまさにあなたが望むもののようです。

ロケールが「AM / PM」表記を使用しない場合は、それらを空に設定します。

t_fmt_ampm ""
am_pm   "";""

システムに知らせる

ファイル/var/lib/locales/supported.d/localを編集して、ロケール定義に関する情報をそこに追加します。つまり、上記のファイル名がだった場合は次のような行を追加し、isodateそれ以外の場合は調整します。

de_DE.UTF-8@isodate UTF-8

/var/lib/locales/supported.d/local存在しない場合は、その名前のファイルを作成します。システム上のおよびパッケージがアップデートを受信するとすぐに上書きされる可能性があるため、変更をそれぞれのフォルダenまたはdeファイルに入れないでください。language-pack-*-baselanguage-pack-*

今実行しますdpkg-reconfigure locales

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.

あなたの場合、これはde_DE.UTF-8@isodateロケールが生成されたことを示します(構文の問題がないと仮定します)。

最後に、以下を追加して/etc/default/localeください:

LC_TIME="de_DE.UTF-8@isodate"

これにより、を使用して定義されたデフォルトのロケールのみが LC_TIMEオーバーライドされるようになりますLANG

新たにログインすると、使用中の新しいISO日付/時刻、dateまたはそれぞれのlibcランタイム関数を使用する他のツールを確認できるはずです。


意図ここではまた、機能していない間、少なくとも邪魔に変更を加えることですに対して(例えばパッケージマネージャや友人に対して)システム。もちろん、単にロケールのコピーを作成し、上記で概説したのと同じような方法でインストールしてから、を調整することもできLANGます。重要なのは、パッケージの更新によって変更が上書きされるリスクを冒したくない限り、カスタマイズしたコピー使用する必要があるということです(つまり、カスタマイズしたものは何でも、つまりcopy単にセクションをそのままにしておく必要があります)。オリジナル)。そしてLANG完全にカスタマイズされたロケール定義を指すように変更するか、または追加する LC_TIME カスタマイズされたロケール定義ファイルの同じ名前の関連するカスタマイズされたセクションのみを指すようにするには、グローバル設定の1つを調整する必要はありません。


3
ベストプラクティスとして、ロケールの末尾にのような@somethingを付けますen_US.UTF-8@isodate
ステファンChazelas

@StéphaneChazelas:ああ!驚くばかり。しかし、あなたがすることはできませんし、どのようにそれはファイルの命名に影響を与え、どのようにしてロケールを参照するでしょうし、それぞれ?教えてくれますか?copyLC_IDENTIFICATION/etc/default/locale/var/lib/locales/supported.d/local
0xC0000022L

1
en_US@isodate定義ファイルを作成し、それを使用localedefして正しいファイルを作成します。詳細については、sourceware.org / git /?p = glibc.git; a = blob; f = localedata / READMEを参照してください(およびsourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ …例として)。
スティーブン・キット、

1
はい、いずれの場合でも、LC_IDENTIFICATIONセクション(en_US @ isodate)は変更する必要があります。これは、ロケールが異なるためです。終了コマンドはでありlocaledef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate、Debian固有の構成については不明ですが、私のコメントは主にロケールに名前を付ける。
ステファンChazelas

1
私が理解しているように、Debianではロケール定義を/usr/local/share/i18n/localesに追加し、サポートされているロケールと文字マップのペアをに追加して/usr/local/share/i18n/SUPPORTED実行しますdpkg-reconfigure locales(も参照/etc/locale.gen)。
スティーブンキット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.