web-dev-qa-db-ja.com

FreeBSDで新しいロケールを作成する

FreeBSDで新しいロケールを作成したいのですが。 /usr/share/localeにある既存のものを1つだけコピーできると思いましたが、明らかにそれほど単純ではありません。

まず、en_US.UTF-8ロケールのコピーを作成します。

$ Sudo cp -R /usr/share/locale/en_US.UTF-8 /usr/share/locale/en_DK.UTF-8

私はmoshを使用してセットアップをテストしているので、標準のen_US.UTF-8を使用するとすべてがうまくいきます。

$ LC_ALL=en_US.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org

ただし、新しく作成したen_DK.UTF-8ロケールを使用しようとすると、次のエラーが発生します。

$ LC_ALL=en_DK.UTF-8 PATH_LOCALE=/usr/share/locale mosh xyz.example.org
The locale requested by LC_ALL=en_DK.UTF-8 isn't available here.
Running `locale-gen en_DK.UTF-8' may be necessary.

mosh-server needs a UTF-8 native locale to run.

Unfortunately, the local environment ([no charset variables]) specifies
the character set "US-ASCII",

The client-supplied environment (LC_ALL=en_DK.UTF-8) specifies
the character set "US-ASCII".

sh: warning: setlocale: LC_ALL: cannot change locale (en_DK.UTF-8)
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_DK.UTF-8
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=en_DK.UTF-8
Connection to xyz.example.org closed.
/usr/local/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)
3

FreeBSDでLinuxismを試みているようです。 FreeBSDでは login classes を使用する必要があります

ロケールを何に設定すればよいのか、そうすることの意味は何ですか? に、ロケールの優れた一般的な説明があります。

その答えの中で無視できる部分は、「ロケールのインストール」です。 FreeBSDには、すべての一般的なロケールがインストールされています。あなたはこれを確認することができます

locale -a

しかし、あなたおそらくは、ロケールを変更して設定しようとしたと主張します。そしてそれが私がLinuxismと呼んでいるものです。人々は実際に何が起こったのか理解せずにlocaleをLinuxに追加し、LC_ALLを設定します。 localeは、LC_*変数のセットを定義します。 LC_ALLを使用して、それらをオーバーライドします!

FreeBSDでは、ユーザー(またはシステム)のロケール設定を変更する好ましい方法は 22.2.1.1。ログインクラスメソッド を使用することです。ここでもシステム全体のデフォルトを変更できます。

LC_ALLは、他のLC_ *設定の一部またはすべてを(強制的に)無効にする場合にのみ設定してください。 LC_ALLで「ロケール」を設定していると思われるかもしれませんが、実際にはLANGLANG=en_DK.UTF-8に設定しているだけです。これは有効な言語ではありません。 nicode CLDR Project に任せてください。詳細については、こちらをご覧ください 「LC_ALL = C」の機能

私の問題は、あなたがあなた自身の新しい言語を発明したくないということです。しかし、あなたが選択した組み合わせから、私のguessは、システムをデンマーク語(DK)システムとして動作させたいが、英語で話したいということです。そのため、LC_*変数を混合してHeatsコンテンツに一致させることができます。

例:

LANG=en_US.UTF-8
LC_CTYPE="da_DK.UTF-8"
LC_COLLATE="da_DK.UTF-8"
LC_TIME="da_DK.UTF-8"
LC_NUMERIC="da_DK.UTF-8"
LC_MONETARY="da_DK.UTF-8"
LC_MESSAGES="en_US.UTF-8"

何らかの理由でログインクラスを設定したくない場合でも、CLDRで定義された変数を使用する必要があります。これにより、最も移植性の高い結果が得られます。

$ LC_ALL=C LANG=en_US.UTF-8 LC_CTYPE=da_DK.UTF-8 LC_COLLATE=da_DK.UTF-8 LC_TIME=da_DK.UTF-8 LC_NUMERIC=da_DK.UTF-8 LC_MONETARY=da_DK.UTF-8 LC_MESSAGES=en_US.UTF-8 mosh xyz.example.org
/usr/local/bin/mosh: could not get canonical name for xyz.example.org: hostname nor servname provided, or not known
ssh_exchange_identification: Connection closed by remote Host
/usr/local/bin/mosh: Did not find remote IP address (is SSH ProxyCommand disabled?).
$

一般的に使用するロケール設定の場合は、ログインクラスを使用して設定できます。 FreeBSDハンドブックまたは私の回答 SSH to FreeBSD in UTF-8 を参照してください。

あなたの答えはどこか上にあると思います。しかし、質問にそのまま答えると、FreeBSD currentは13.0にUTF-8 Cロケールを追加します(commit r340144を参照)。 新しいロケールを追加する方法を本当に見たい場合は、 C.UTF-8ロケールの紹介 を見てください

更新

ディレクトリ/usr/share/locale/*は単なるディレクトリです。 Qのように逐語的なコピーを作成すると、FreeBSD 11.2で問題なく動作します。引き続き、詳細なLC_ALLまたはログインクラスを使用することをお勧めします。今のところ問題は "fat fingers"だと思います。

ディレクトリには、シンボリックリンクと定義ファイルが含まれています。ファイルは localdef で作成できます 2015年のmklocale を置き換えます。

実際の照合順序を変更したくない場合は、「適切な」照合順序を持つ言語にリンクするか、単にファイルをコピーします。 PATH_LOCALE=/usr/share/localeはデフォルトであるため、暗黙的です。

私のシステムでtesten_DK.UTF-8に逐語コピーを作成しました。すぐにlocale -aが表示されます。どちらも期待どおりに機能しました:

$ locale -a | grep -e en_DK -e test
en_DK.UTF-8
test
$ LC_ALL=test mosh xyz.example.org
/usr/local/bin/mosh: could not get canonical name for xyz.example.org: hostname nor servname provided, or not known
ssh_exchange_identification: Connection closed by remote Host
/usr/local/bin/mosh: Did not find remote IP address (is SSH ProxyCommand disabled?).
$ LC_ALL=test /bin/sh
$ locale
LANG=
LC_CTYPE="test"
LC_COLLATE="test"
LC_TIME="test"
LC_NUMERIC="test"
LC_MONETARY="test"
LC_MESSAGES="test"
LC_ALL=test
$ exit
$ LC_ALL=en_DK.UTF-8 mosh xyz.example.org
/usr/local/bin/mosh: could not get canonical name for xyz.example.org: hostname nor servname provided, or not known
ssh_exchange_identification: Connection closed by remote Host
/usr/local/bin/mosh: Did not find remote IP address (is SSH ProxyCommand disabled?).
$ LC_ALL=dummy mosh xyz.example.org
Perl: warning: Setting locale failed.
Perl: warning: Please check that your locale settings:
        LC_ALL = "dummy",
        LANG = (unset)
    are supported and installed on your system.
Perl: warning: Falling back to the standard locale ("C").
Perl: warning: Setting locale failed.
Perl: warning: Please check that your locale settings:
        LC_ALL = "dummy",
        LANG = (unset)
    are supported and installed on your system.
Perl: warning: Falling back to the standard locale ("C").
/usr/local/bin/mosh: could not get canonical name for xyz.example.org: hostname nor servname provided, or not known
ssh_exchange_identification: Connection closed by remote Host
/usr/local/bin/mosh: Did not find remote IP address (is SSH ProxyCommand disabled?).
$ uname -a
FreeBSD test 11.2-RELEASE FreeBSD 11.2-RELEASE #0 r335510: Fri Jun 22 04:32:14 UTC 2018     [email protected]:/usr/obj/usr/src/sys/GENERIC  AMD64
5
Claus Andersen