システムロケールをカスタマイズするにはどうすればよいですか?


24

システム管理言語サポート テキスト。標準のロケールしか選択できませんが、微調整したいと思います。たとえば、Windowsでは、時間と日付の形式、単位、小数点、通貨などを手動でカスタマイズできます。これをUbuntuで行うにはどうすればよいですか?

回答:


28

この回答では、オプションで既存のロケールをベースとして使用して、ロケールを完全にカスタマイズする方法を示します。この回答で使用されるロケールのタイプはi18nタイプです。そのようなタイプのロケールは、回答の本文にある「ロケール」という言葉に言及するたびに暗示されます。

ガイドを探す

ロケールをカスタマイズするために最初に必要なことは、ロケールの形式を知ることです。このWebロケールエディタには、ロケール内のすべてのフィールドの包括的な説明がありますが、誰でもすぐに使用できるわけではありません。これが使用するガイドになります。

必要なツール

ロケールを操作するために必要な唯一のツールは

  1. テキストエディター。VIMは優れていますが、どれでも可能です。
  2. テキストからユニコードへのコンバーター。あなたが持っていないことが最も期待されるので、簡単なものを提供します。次のサブセクションを読んで入手してください。

ディレクトリを作成し、そのロケールで行う作業に関連するすべてを保存することをお勧めします。

テキストからユニコードへのコンバーター(encodestr)

注:あなたが使用している場合、非共通の文字を、あなたは以下のスクリプトIの書き込みに問題を有していてもよいです。nassによってリンクされた代替スクリプトをご覧ください

次のコードをファイルに保存します。このファイルは、システムによってpythonスクリプトとして識別されますが、これは1つなので大丈夫です。このガイドでは、スクリプトを呼び出したと想定していますencodestr

#!/usr/bin/python

def encode(string):
    newstring = str()
    for ch in string:
        newstring += "<U%04X>" % ord(ch)
    return newstring

if __name__ == '__main__':
    import sys
    print encode(sys.argv[1])

保存した後、ファイルの実行許可を与えます-これは便利です。これを行うには、nautilusを使用するか、端末からスクリプトを保存したディレクトリで次のコマンドを実行しますchmod +x encodestr

これで、同じディレクトリで実行することにより、このスクリプトをテストできます./encodestr hello。に等しい出力が得られるはずです<U0068><U0065><U006C><U006C><U006F>

既存のロケールを変更する

既存のロケールを変更するのが最も簡単なケースです。理想的には、ほぼ完全にニーズに合ったロケールを選択します。その場合、小さな変更を加えるだけで済みます。それを調整するには、ガイドを使用して、どのセクションを変更するか、どのように変更するかを知ることができます。インストールされているすべてのロケールはにありますが/usr/share/i18n/localesガイドにはこれまでに作成されたほとんどすべてのロケールが含まれています。

ただし、ロケールを開いたときに最初に気付くのは、変な<UXXXX>コードと同じくらい英語の単語を読むことです。これらのコードを作成できるようにする必要があります-これがencodestrスクリプトの出番です。

変更する必要があるセクションがわかったら、セクションに含まれる各フィールドを知る必要があります。

たとえば、LC_TIMEセクションにはフィールドt_fmt、および他の多くが含まれます。各フィールドには、ガイドに独自の説明があります

変更するフィールドがわかったので、ガイドをもう一度使用して、フィールドが受け入れる値を見つけます。

たとえば、フィールドt_fmtはテキストと共通のstrfmt変数を受け入れます。

変更するフィールドに何を書き込むかがわかったら、encodestrスクリプトを介してテキストを実行し、エンコードされた同等のものを取得します。

注:すべてのフィールドをエンコードする必要はありません。必要に応じて既存のロケールを参照として使用してください。

たとえばTime: %Tt_fmtフィールドに時間形式を使用する場合は、次を実行し./encodestr "Time: %T"ます。これが返される<U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>のでt_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>、ロケールに行があります(もちろん、それぞれのセクションにあります)。

必要なすべてのフィールドを変更したら、ロケールを使用できるように、システムにロケールをインストールする必要があります。これについては、インストールセクションに進んでください。

ゼロからロケールを作成する

一方を変更するのとは対照的に、カスタムロケールを作成するために使用できるもう一方の方法は、最初からそれを処理しています。再度ガイドを使用する場合、これはそれほど難しくありません。ただし、ここに役立つヒントがあります。実際のコピーアンドペーストメソッドを使用せずに、他のロケールからセクションをコピーできます。次の形式に従う必要があります。

LC_SECTION
copy "locale"
END LC_SECTION

LC_SECTION変更するセクションはどこにあり、localeそのセクションのコピー元のロケールです。

たとえば、英語のロケールで時刻形式をコピーする場合、このテキストはカスタムロケールファイルになります。

LC_TIME
copy "en_GB"
END LC_TIME

そして、それはあなたに多くの作業を節約し、参照されたロケールに加えられた変更があなたのものに反映されることを保証します。

カスタムロケールのインストール

以下に示す手順は最適ではないかもしれませんが、機能します。

  1. ロケールをコンパイルします。パニックにならないでください!これには時間がかかりません。ただ、コマンドを実行し、ロケールの名前です。sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -vcustom

  2. ロケールを/usr/share/i18n/locales/ディレクトリにコピーします。これを行うには間違いなくsudo特権が必要になりますが、カスタムロケールのファイル名を次のコマンドsudo cp locale /usr/share/i18n/locales/で実行できlocaleます。

  3. でロケールを指定します/var/lib/locales/supported.d/。たとえば、ファイル名/var/lib/locales/supported.d/asdを作成し、行を追加しcustom UTF-8ます。ここで、customはロケールの名前です。

  4. magicコマンドを実行します。私は実際にこのコマンドが何をするのか正確には知りませんが、それは重要です。を実行しますsudo locale-gen。最も可能性が高いのは、必要に応じて利用可能なロケールへの参照を生成することです。

  5. ロケールを使用するようシステムに指示します。ロケールをシステム全体で使用する場合は、/etc/environmentファイルを変更します。そうでない場合は、~/.profileファイル、または起動時にソースされた他のファイルを変更できます。後者の意味がわからない場合は心配しないでください~/.profile。ファイルを使用してください。何を書かなければならないかを知るには、まずlocaleコマンドを実行します。それはのような項目でリストを発行する必要がありLANGUAGELC_MESSAGESLC_CTYPEおよび多くの他。あなたは、これは、別々の行に、(前のコマンドでリストされている)したいセクションごとに、書き込むSECTION="locale"場所SECTIONセクションとされlocale、カスタムロケールの名前。

たとえば、オランダの時間形式を使用するが、英語を使用する場合は、次のように記述します。

LANGUAGE="en_GB:en"
LC_TIME="nl_NL"

注:ロケール設定ごとに1つのロケールを使用する場合は、カスタムロケールの名前をLC_ALL="locale"where に記述しlocaleます。あなたはすべてのもののためではなく、言語のロケールを使用する場合は、書くことができますLANG="locale"(もちろん、別の回線で)とLANGUAGE="locale":XX場所をXX希望する言語の2文字のコードです。

たとえば、オランダ語のロケールと英語を使用する場合、次を使用できます。

LANG="nl_NL"
LANGUAGE="nl_NL:en"

終わった

次回ログインすると、ロケールが使用中になります。これをテストするには、localeコマンドを再度実行します。

このガイドの矛盾または虚偽の記述についてコメントしてください!


こんにちは、使用しているpythonコードは、すべての場合に機能するわけではありません。ギリシャ文字のπμ場合<U00CF><U0080><U00CE><U00BC>、予想される文字の代わりに出力されます<U03C0><U03BC>。これが機能するリンクです。
ナス

ご意見ありがとうございます!私はそれが原因であったテキストにあなたのコメントを含めました:)
セベロラズ

走る前に追加custom UTF-8しなければならなかった。それ以外の場合は、リストに含まれません。/usr/share/i18n/SUPPORTEDsudo locale-gen
ウィルバート

文字列変換メソッドをシェルスクリプトコレクションgithub.com/budhajeewa/shell-scripts/commit/…にコピーしました。ありがとうございました!
budhajeewa

この回答でメソッドの逆を行う関数を探している人がいる場合(ロケールファイルの既存の16進値を読み取る必要があります)、そのためのPHPスクリプトを作成しました。github.com/budhajeewa/shell-scripts/commit/...。誰かがそれをPythonで書けるなら、私に知らせてください。それをコレクションに追加したいと思います。
budhajeewa

8

どのようなカスタマイズが必要かはわかりませんが、を使用していくつかのロケール変数を設定できます~/.locale。たとえば、英語のメッセージを取得しますが、ドイツ語の時間などを使用するには

export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"

カスタムロケールの生成も可能です。たとえば、日付についてはこのガイドを参照してください。


1
いいえ、低レベルのカスタマイズが必要です。例:英語のメッセージ、メートル単位、変更されたチェコの日付/時刻(DMYYYY H.MMの代わりにDD.MM.YYYY HH:mm)、小数点としてのドット(チェコ語のロケールではコンマがあります)および€通貨として(チェコ語ロケールにはKč通貨があります)。
イヴァン

そうですか。撮影en_USのためにLC_NUMERICde_DEのためにLC_MONETARYLC_MEASUREMENTあなたの他の副作用を与えますか?個人ロケールを生成するための新しいリンクも参照してください。
カーステンティエル

1
リンクの背後にある指示が質問に素晴らしく答えているようです。おそらく、リンクがいつか到達できない場合に、ここで最も重要な部分を複製できますか?
ステファノパラッツォ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.