
FreeBSDに新しいロケールを作成したいと思います。ただ既存のものをコピーすれば良いと思いましたが、/usr/share/locale
簡単ではありませんね。
まず、ロケールのコピーを作成します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?)
答え1
FreeBSDでLinuxismを試しているようです。 FreeBSDでは、次のものを使用する必要があります。ログインクラス
ロケールの一般的な説明がよく示されています。ロケールを何に設定する必要がありますか?これはどのような影響を及ぼしますか?。
この回答で無視できる部分は「ロケールのインストール」です。 FreeBSDは、すべての一般的なロケールがインストールされた状態で提供されます。これを確認できます。
locale -a
しかし、あなたはおそらくロケールを変更して設定しようとしていると主張します。これが私がLinux主義と呼ぶものです。追加された人ロケール実際に何が起こっているのかわからず、LinuxにLC_ALLを設定しました。これロケール変数セットを定義しますLC_*
。LC_ALL
それからそれをカバーするために使用してください!
FreeBSDでユーザー(またはシステム)のロケールを変更するための好ましい方法は、以下を使用することです。22.2.1.1.ログインクラス方式。ここでシステム全体のデフォルト値を変更することもできます。
LC_ALLは、他のすべてのLC_ *設定を(強制的に)無視したい場合にのみ設定する必要があります。 「ロケール」を設定すると思うかもしれませんが、LC_ALL
実際には単に設定するLANG
だけですLANG=en_DK.UTF-8
。これは有効な言語ではないので、そのままにしてください。Unicode CLDRプロジェクト。詳細については、以下を確認してください。「LC_ALL = C」は何をしますか?
私の問題は、あなた自身の新しい言語を作成したくないということです。しかし、あなたが選んだ組み合わせの中から私のものを選んでください推測するシステムはデンマーク語(DK)システムのように機能したいのですが、英語で話す必要があります。これを行うには、LC_*
変数を予備コンテンツと混合して一致させることができます。
例:
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からFreeBSDへ(UTF-8)
私はあなたの答えが上記のどこかにあると思います。しかし、あなたの質問に1単語ずつ答えると、現在FreeBSDは13.0にUTF-8 Cロケールを追加します(コミットr340144を参照)。追加する方法を知りたい場合新しいロケールそれから見てください。C.UTF-8ロケールの紹介
修正する
ディレクトリは/usr/share/locale/*
ディレクトリだけです。 QのようにそのままコピーするとFreeBSD 11.2でも動作します。私はまだverboseLC_ALL
またはログインクラスを使用することをお勧めします。現在私が考えている問題は「太った指」。
このディレクトリにはシンボリックリンクと定義ファイルが含まれています。これらのファイルは次のように生成できます。地域定義それは取り替えるmklocale 2015。
実際のソート順序を変更したくない場合は、「正しい」ソート順序を持つ言語に接続するか、ファイルをコピーします。PATH_LOCALE=/usr/share/locale
これがデフォルトなので暗黙的です。
test
私のシステムからそのままコピーしてコピーしましたen_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