数字を適切にローカライズする方法は?


38

フロントエンドアプリケーションで番号をローカライズする際に注意する必要があるのはどの警告ですか?

例:ブラジルポルトガル語(pt-BR)では、ドットで千を分割し、コンマで小数を分割します。米国英語(en-US)ではそれは逆です。pt-BRでは、en-USと同様に、桁で区切られた桁が表示されます。しかし、今日、インド英語(en-IN)について読んで、この宝石に出会いました。

インドの番号付けシステムは、数字のグループ化に適しています。言葉で書かれたとき、または話されたとき、100,000 / 100 000未満の数字は、標準英語と同じように表現されます。100,000 / 100,000以上の数字は、インドのナンバリングシステムのサブセットで表されます。

https://en.wikipedia.org/wiki/Indian_English#Numbering_system

つまり:

1000000 units in pt-BR are formatted 1.000.000
1000000 units in en-US are formatted 1,000,000
1000000 units in en-IN are formatted 10,00,000

コンマとドット、およびその他の特定の区切り記号に加えて、マスキングも有効な懸念事項のようです。

フロントエンドアプリケーションで番号をローカライズする際に注意すべき他の注意事項はありますか?特に非ラテン文字セットに数字を表示している場合はどうなりますか?


3
お金を扱うときにさらに面白くなります!:-)
ステファンビジッター16

4
火星の番号付けシステムについては話していないが、基数6(2倍3本の指)があります;-)しかし、日本人にも奇妙な点があります。 ..推測
qwerty_so 16

6
なぜあなたはこのことを心配する必要がありますか?OSの設定に従っていませんか?
ヤンDoggen

3
@JanDoggenは、それがソフトウェアエンジニアリングドメインの興味深い問題の1つである、「データを適切に人々に提示する方法」だからです。システムを設計するときに心配すべきことは、この質問の領域です。そして、私たちの友人ステファンが言ったように、私もお金について話していません。生の数字。
マチャド

5
@JanDoggen、これはオンラインソフトウェアを扱う際にさらに複雑になります。ユーザーはインドにいて、アメリカ英語のコンピューターでブラジルのポルトガル語のWebページを読んでいる可能性があります。サーバーは中国語である可能性があります。アプリは、ユーザーが使用しているOSやサーバーの場所に関係なく、ユーザーが望むものを理解する必要があります。1,000.00ドルは67.545,00ルピーになります。米国の通貨で、現地の為替レートで換算されますが、ポルトガル語の形式で表示されます。
ノードマン16

回答:


87

ほとんどのプログラミング言語とフレームワークには、このために使用できる実用的で実用的なメカニズムが既にあります。

たとえば、C#エコシステムにはSystem.Globalization名前空間があり、必要なものを指定できますCulture

Console.WriteLine(myMoneyValue.ToString("C", "en-US"));

これは、あなたが再発明したいものではありません。お気に入りの言語またはフレームワークが提供する国際化機能を使用します。


2
System.Globalizationと、この種の複雑さを処理する他のフレームワークを知っています。私が知らないのは、彼らがどのような問題を解決しているのかということです。たとえば、いくつかのアプリケーションでは、.ToString( "#、## 0.00"、locale)のようにToStringで特定のマスキングを使用していますが、インド人にこの番号を表示している場合、そのマスク自体は無効です。それで、「特定のマスクを使用しないでください」以外に、他に何に注意する必要がありますか?
マチャド

7
私が知っていることは何もありません。フレームワークを適切に使用すれば、正常に機能するはずです。国際化の問題には特定の特定のケースがありますが、それらの包括的なリストを作成することはここでは行いません。この例を参照してください。
ロバートハーベイ

5
これが唯一の正しい答えです。ロケールを設定し、ユーザーに表示する前にi18nレイヤーを介して値をプッシュし、フレームワークの作成者に対処させます。これは、数値、通貨値、翻訳された文字列、日付、すべてに当てはまります。

2
完璧な答え。「車輪を再発明しないでください」は、このような一般的な問題に対処する際に常に考慮されるべきものです。何度も投票できないのは残念だ。
BgrWorker 16

3
@Machado「たとえば、私が見るいくつかのアプリケーションは、.ToString( "#、## 0.00"、locale)のようなToStringで特定のマスキングを使用しますが、この数字をインド人に見せている場合、そのマスク自体は無効です。 」-明確ではないかもしれませんが,、書式文字列内のの位置はほとんど無関係であり、「#、0.00」でも同じ効果があることに注意してください。,単に「ロケールで指定された方法で番号グループ区切り文字を使用する」ことを意味します。
hvd 16

23

ここでいくつかの優れた回答がすでにありますが、忘れてはならない重要なことについては言及していません:数字の書式設定がどこで行われても、出力の用途が明確である(または制御できる)ことを確認してください:

  • ユーザーインターフェイスの場合は、ローカライズされた書式を適用する必要があります

  • 番号がファイルに書き込まれようとして、あるいはネットワークを介して送信される、または番号がで必要とされる場所の別のフォームされたときに機械読み取り可能な形式、必ずそれがされていることを確認していない現在の文化に従ってフォーマットが、固定設定に応じて、 (たとえば、.NET環境では、を使用しますInvariantCulture)。

そうしないと、カルチャAを使用して数値が書き込まれたり送信されたり、カルチャBを使用して読み取りまたは受信されたときに問題が発生します。

私の経験では、これは数値の適切なローカリゼーションを行う上で最大のハードルの1つです。数値の書式設定と変換を集中化するために、人々は書式設定用の一般的な再利用可能な関数を作成し始め、それをすべての場所で使用し始めます場所。ただし、プログラムのどこかで機械可読文字列形式の数値も必要になるとすぐに、ローカライズ形式と非ローカライズ形式の2つのバリアントが必要です。これにより、2つの形式の変換を混同するリスクが高くなります(特に、開発者とテストマシンのデフォルトのロケール設定が非UIフォーマットに使用される「固定」設定に似ていますが、ユーザーベースの一部にはありません)。

補遺:この問題は、数値が機械で処理されるのか、後で人間(またはその両方)で処理されるのかが事前に明確でない状況では、非常に厄介になる可能性があります。たとえば、ログファイルの出力の一部として。そのような場合は、小数点以外の区切り文字を使用しない「中立」標準を使用するのがおそらく最善です。


2
さらに悪いことに、多くの現代のプログラミング言語では、標準ライブラリの明白な/デフォルトの関数は「ローカライズ」されています。そのため、開発者がローカライズを知らない、または気にしない場合、結果として生じるアプリケーションは、外国のシステムで単にいというよりも機能しない可能性があります。
ピーターグリーン

4
私も同様に悪いことに同意しません。UIのローカルな数値規則に従わないツールは、引き続き使用可能です。数値規則の不一致のために、自身のデータファイルの読み取りに失敗したり、サーバーとの通信に失敗したりするツールは、使用できない可能性がはるかに高くなります。
ピーターグリーン

5
この逸話:EN-ZAの小数点の区切り文字は、以前にローカルに格納された値をデシリアライズに失敗し始め勝利7およびWindows 8の間で変化
Caleth

1
@PeterGreen:UIのローカル数値規則に従わないツールは、まだ使用可能であるか、特定のユースケースでは完全に使用できない可能性あります。私はそのような仮定をすることに非常に注意するでしょう。非常に多くの開発者が数字のローカライズを間違っている理由は、まさにそのような仮定をすることです。
Doc Brown

1
@DocBrown私は、標準ライブラリのローカライズされた整数/浮動小数点解析ルーチンに悩まされている、維持すべき最も恐ろしいレガシーコードを持っています。私はそれの公正がこれらのジョブのデフォルトのルーチンは非局在化しているときに、プログラムはローカライズのためのケアせずに書かれたと言うことだと思うことがあり、いくつかの状況で使用できなくなりますが、デフォルトのルーチンがローカライズされている場合、プログラムは常にますそれがある瞬間を破られますグローバルロケールが英語ではないコンピューターで実行されます。
セバスチャンレッド

9

適切なローカライズは非常に困難です。ほとんどのプログラミングエコシステムは、ローカライズのソリューションを試みていますが、私の経験では、それらは多かれ少なかれ壊れています。したがって、私は提案します:

  • ローカライズを自動化しようとしないでください。常に機能するとは限りません。問題を見つけることは困難であり、ユーザーを苛立たせます。

  • 一貫性を保つ:異なる言語と形式の規則を混ぜないでください。たとえば、英語のテキストでのブラジルスタイルの小数点記号。

  • 指定されたロケールのセットを明示的にサポートします。翻訳者と協力して、日付と数字の適切なフォーマットを決定します。ほとんどの(すべてではない)問題を既存のライブラリに委任できますが、おそらく独自のローカライズツールキットを作成することになります。

  • 各ユーザーが構成可能な単純なフォーマットの選択を行います:日付と時刻のフォーマット、小数点、優先通貨など。これは、旅行者、外国人、または言語に関係なく複数のロケールまたは文化を混在させる必要がある他の人々に特に役立ちます。


18
また、多くのユーザーが「自分のロケールに合った」と見なされる慣習を嫌い、それを恐ろしいレガシー慣行と見なし、まったくグループ化しない、または異なる種類のグループ化を望んでいることに注意してください。そのため、おそらくそれをオフにするか、手動でオーバーライドするオプションがあるはずです。
R ..

2

重要な考慮事項:どれだけで十分かを判断する必要があります。完璧にローカライズしようとするウサギの穴を下ると、ますます複雑になるからです。

「n個のアイテムを選択しました」などの典型的なラベルを使用します。選択されているアイテムが1つだけの場合、これは間違って表示されます。いが実用的な解決策は、「n個のアイテムを選択しました」と書くことです。ただし、正しく実行する場合は、nに応じて2つの異なるテキストが必要です。複数のロケールでこれを行おうとすると、言語によって文法が異なるため、すぐに非常に複雑になります。一部の言語では、1つ、2つ、および複数のアイテムに対してさまざまな活用があります。このため、知識のある人は、既存のローカリゼーションフレームワークでは不十分であると常に不満を言うでしょう。

しかし、あなたはあなたの戦いを選択し、どのレベルの洗練が十分であるかを決定しなければなりません。多くの目的のために、数値と日付をフォーマットするための標準的なローカライズライブラリで十分です。


これはICU(MessageFormat)によって解決されます。欠点は、多くの言語でのICUの採用がまだ弱いことです。ただし、開発者は依然として正しい方法でメッセージを作成する必要があります。それは本当に工学的な側面以上のものです。userguide.icu-project.org/formatparse/messages
noderman 16

これは、GNU gettextでより広く利用可能なngettext関数によっても解決されますが、MessageFormatクラスは、ngettextでは解決できない余分な問題も解決するようです。
hvd 16

2

言語のすべての警告に気付くことができません。あなたは数字について話していますが、複数形、性別、照合があります。それらが存在することを知り、他の人々、特にICUおよびCLDRプロジェクトによって実行される広範な作業に依存する必要があります。

最新の言語のほとんどは、これらのプロジェクトの一部またはすべての機能を実装していますが、実装していない場合でも、これらのプロジェクトについて読むと、何を探すべきかがわかります。

http://site.icu-project.org

http://cldr.unicode.org

更新

CLDR調査ツールは、すべてのパターンへのアクセスを提供します。特定の言語と地域で数値をフォーマットする方法を示します。たとえば、ポルトガル語(ポルトガル):

http://st.unicode.org/cldr-apps/v#/pt_PT/Number_Formatting_Patterns/

そして、本当にすべてのデータをチェックしたい(そしておそらくそれを使用したい)場合は、GitHubからJSON形式でCLDRをダウンロードできます。

https://github.com/unicode-cldr/cldr-json#cldr-json

ダウンロードに関する詳細はこちら:

http://cldr.unicode.org/index/downloads


入力をありがとう、しかし私は今のところほとんど数字に興味があります。:)
マチャド

はい。回答を編集して、調査ツールへのリンクを追加しました。ここで、検索を絞り込むことができます。
noderman

違いを確認するためにブラジルを変更しようとしましたが、そのための視覚化を有効にしていないようです:st.unicode.org/cldr-apps/v#/pt_BR/Number_Formatting_Patternsそれ以外の場合、ツールはかなり良いようです。
マチャド

ブラジルがルート言語であるためです。調査ツールは実際にはCLDRデータに変更を加えるために使用されるため、ルートには特別なアカウントが必要です。GitHubにアクセスして、すべての情報を直接取得できます:github.com/unicode-cldr/cldr-numbers-modern/tree/master/main具体的には、ブラジルはこちらです:github.com/unicode-cldr/cldr-numbers-modern/ blob / master / main / pt /…
ノードマン

0

さて、ここではすべての答えに満足していますが、正解としてマークするためにそれぞれに個別に満足しているわけではありません。

これまでのところ、これは数字をローカライズするときに注意すべきことです:

人間向け

  • 数千の区切り文字が常に数千で区切られているわけではありません。質問のインドの事例をご覧ください。
  • 数千文字と小数文字は、文化によって文化が異なります。たとえば、ドイツ語ではスペースを使用して数千が分割されますが、英語ではカンマで、ポルトガル語ではドットです。
  • 左から右への言語と右から左への言語に関連する違いがある場合、情報はありません。
  • サポートされるローカライズの特定のセットを提供し、ユーザーに明確にします。
  • ユーザーがデフォルトのローカライズをサポートされているローカライズの1つに変更できるようにしてください。寛大な神であるため、喜んで喜んでケーキをお送りします。:);

コンピューターの場合

  • マシンは寛容ではなく、数値のシリアル化と非シリアル化中に常に同じフォーマットを受け取る必要があることに注意してください。
  • そのための単一の形式に固執します。
  • 必要最小限の形式を使用してください。数千の分離は避けてください。シリアル化と逆シリアル化には小数で十分です。

開発者向け

  • (以下の@hydeで提案されているように):既存のライブラリをローカライズに使用します。
  • 可能であれば、ネイティブテスターを使用してローカライズ/国際化テストケースを指定します。それ以外の場合はライブラリを信頼します。
  • ローカライズはほとんど解決される問題であることを忘れないでください。すべての主要言語には、数字、日付、および時間をローカライズできるネイティブまたは外部のライブラリがあります。

1
不足しているアイテム:開発者向け:ローカライズに既存のライブラリを使用します。可能であれば、ネイティブテスターを使用し、ローカライズ/国際化テストケースを指定します。それ以外の場合は、ライブラリを信頼します。
ハイド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.