プラグインから新しいロケールを追加する

通常、Discourse に新しい言語を追加する最良の方法は、「https://meta.discourse.org/t/how-to-add-a-new-language/14970」で説明されているように、プルリクエストを作成することです。

現在のところコアに追加できない言語を使用したい場合は、次のガイドを参照してください。


既存のロケールを拡張するロケールの追加

たとえば、メキシコ向けのスペイン語ロケール (es_MX) を追加したいとします。Discourse にはすでにスペイン語ロケール (es) が含まれているため、これは非常に簡単です。

プラグインのディレクトリ構造は次のようになります。

custom-locales
├── assets
│   └── locales
│       └── es_MX.js.erb
├── config
│   └── locales
│       ├── client.es_MX.yml
│       └── server.es_MX.yml
└── plugin.rb
plugin.rb

register_locale を呼び出して、新しいロケールを追加します。

  • 最初のパラメーターは必須であり、言語コードである必要があります。

  • 言語コードが names.yml に存在する場合、name (ロケールの英語名) と nativeName (ユーザーインターフェースに表示される名前) は省略できます。

  • fallbackLocale は、翻訳や複数形ルールの欠落時にフォールバックとして使用される言語コードです。

# name: custom-locales
# about: An example plugin for adding new locales.
# version: 1.0

register_locale("es_MX", name: "Spanish (Mexico)", nativeName: "Español (México)", fallbackLocale: "es")
<locale>.js.erb

assets/locales/es_MX.js.erb の内容は非常に単純です。そのファイル内のロケールコードを必要なものに置き換えるようにしてください。

//= require locales/i18n
<%= JsLocaleHelper.output_locale(:es_MX) %>
config/locales の翻訳ファイル

ファイル config/locales/client.es_MX.yml および config/locales/server.es_MX.yml には、使用したい翻訳が含まれています。Discourse が必要とするすべての翻訳を提供する義務はありません。翻訳が不足している場合は、fallbackLocale と英語が使用されます。


新しいロケールの追加

既存のロケールにフォールバックすべきではない、完全に新しいロケールを追加するには、もう少し作業が必要です。

プラグインのディレクトリ構造は次のようになります。

custom-locales
├── assets
│   └── locales
│       └── foo.js.erb
├── config
│   └── locales
│       ├── client.foo.yml
│       └── server.foo.yml
├── lib
│   └── javascripts
│       └── locale
│           ├── message_format
│           │   └── foo.js
│           └── moment_js
│               └── foo.js
│           └── moment_js_timezones
│               └── foo.js
└── plugin.rb
plugin.rb

register_locale を呼び出して、新しいロケールを追加します。

  • 最初のパラメーターは必須であり、言語コードである必要があります。

  • 言語コードが names.yml に存在する場合、name (ロケールの英語名) と nativeName (ユーザーインターフェースに表示される名前) は省略できます。存在しない場合は、これらも設定する必要があります。

  • plural は、言語の複数形ルールを記述します。インスピレーションを得るために plurals.rb を確認してください。また、plurals.rb にすでに言語コードが含まれている場合は、このパラメーターを省略できます。

# name: custom-locales
# about: An example plugin for adding new locales.
# version: 1.0

register_locale(
  "foo",
  name: "Foo",
  nativeName: "Foo Bar",
  plural: {
    keys: [:one, :other],
    rule: lambda { |n| n == 1 ? :one : :other }
  }
)
<locale>.js.erb

assets/locales/foo.js.erb の内容は非常に単純です。そのファイル内のロケールコードを必要なものに置き換えるようにしてください。

//= require locales/i18n
<%= JsLocaleHelper.output_locale(:foo) %>
config/locales の翻訳ファイル

ファイル config/locales/client.foo.yml および config/locales/server.foo.yml には、使用したい翻訳が含まれています。Discourse が必要とするすべての翻訳を提供する義務はありません。翻訳が不足している場合は、英語の翻訳が使用されます。

message_format/<locale>.js

lib/javascripts/locale/message_format/foo.js には、クライアントによって使用される複数形のルールが含まれています。ルールは、register_locale メソッドで使用したものと同じである必要があります。インスピレーションを得るために、lib/javascripts/locale 内のファイルを確認してください。お使いの言語コードのファイルがすでにそのディレクトリに存在する場合は、このファイルを省略できます。

moment_js/<locale>.js

lib/javascripts/locale/moment_js/foo.js には、moment.js によって使用されるロケールファイルが含まれています。インスピレーションを得るために、vendor/assets/javascripts/moment-locale 内のファイルを確認してください。お使いの言語コードのファイルがすでにそのディレクトリに存在する場合は、このファイルを省略できます。

moment_js_timezones/<locale>.js

lib/javascripts/locale/moment_js_timezones/foo.js には、タイムゾーンのドロップダウンで使用されるロケールファイルが含まれています。インスピレーションを得るために、vendor/assets/javascripts/moment-timezone-names-locale 内のファイルを確認してください。このファイルはオプションです。


FAQ

Discourse がロケールを読み込みません。何が問題ですか?

プラグインが有効になっていること、ロケールが正しく登録されていること、およびすべての必須ファイルが存在し、ファイル名に正しい言語コードが含まれていることを確認してください。Discourse は、ファイルが見つからない場合、ロケールを読み込みません。


このドキュメントはバージョン管理されています - 変更の提案はgithubで行ってください。

「いいね!」 17

How can I customize the language in the translation plugin? I see that some of the plugins in the language cannot be translated,

for example: discourse-details, discourse-local-dates, discourse-narrative-bot, discourse-nginx-performance-report

「いいね!」 3