从插件添加新语言环境

通常,向 Discourse 添加新语言的最佳方法是按照“https://meta.discourse.org/t/how-to-add-a-new-language/14970”中所述创建拉取请求(pull request)。

如果您想使用的语言目前无法添加到核心(core)中,请遵循以下指南。


添加扩展现有语言环境的语言环境

假设您想为墨西哥添加一个西班牙语语言环境(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.ymlconfig/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.ymlconfig/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 个赞