Elixir 语言 国际化与本地化实战

Elixir阿木 发布于 2025-06-19 8 次阅读


Elixir 语言国际化与本地化实战

随着全球化的推进,应用程序的国际化与本地化变得越来越重要。Elixir 作为一种功能强大的函数式编程语言,因其并发性和可扩展性在开发分布式系统中受到青睐。本文将围绕 Elixir 语言,探讨国际化与本地化的实战方法,帮助开发者构建支持多语言的应用程序。

国际化(i18n)与本地化(l10n)

在国际化和本地化领域,有两个重要的概念需要理解:

- 国际化(i18n):使应用程序能够支持多种语言,但并不指定特定的语言。

- 本地化(l10n):在国际化基础上,针对特定语言和文化进行适配。

在 Elixir 中,我们可以使用一些库和工具来实现这两个目标。

选择合适的库

在 Elixir 中,有几个库可以帮助我们处理国际化与本地化:

- gettext:一个流行的国际化库,支持多种语言。

- ex_json_library:用于处理 JSON 数据的库,常用于本地化。

下面,我们将使用 `gettext` 库来实现 Elixir 中的国际化。

安装 gettext 库

我们需要在 Elixir 项目中安装 `gettext` 库。可以使用以下命令:

elixir

mix archive.install hex gettext


创建翻译文件

`gettext` 库使用 PO(Gettext Portable Object)文件来存储翻译。我们需要为每种语言创建一个 PO 文件。

例如,对于英语,我们可以创建一个名为 `en.po` 的文件:

plaintext

en.po


msgid ""


msgstr ""


"Project-Id-Version: MyApp"


"PO-Revision-Date: 2023-04-01 12:00+0000"


"Last-Translator: FULL NAME <EMAIL@ADDRESS>"


"Language-Team: English <LL@li.org>"


"MIME-Version: 1.0"


"Content-Type: text/plain; charset=UTF-8"


"Content-Transfer-Encoding: 8bit"


"Plural-Forms: nplurals=2; plural=n != 1;"

"msgctxt "title"


msgid "Welcome to MyApp!"


msgstr "欢迎使用 MyApp!"


对于其他语言,如中文,我们可以创建一个名为 `zh-CN.po` 的文件:

plaintext

zh-CN.po


msgid ""


msgstr ""


"Project-Id-Version: MyApp"


"PO-Revision-Date: 2023-04-01 12:00+0000"


"Last-Translator: FULL NAME <EMAIL@ADDRESS>"


"Language-Team: Chinese (Simplified) <LL@li.org>"


"MIME-Version: 1.0"


"Content-Type: text/plain; charset=UTF-8"


"Content-Transfer-Encoding: 8bit"


"Plural-Forms: nplurals=1; plural=0;"

"msgctxt "title"


msgid "欢迎使用 MyApp!"


msgstr "欢迎使用 MyApp!"


使用 gettext

现在我们已经有了翻译文件,我们可以使用 `gettext` 库来获取翻译。

elixir

defmodule MyApp.Gettext do


@moduledoc false

defmacro __using__(opts) do


quote do


import unquote(__MODULE__)


@gettext_options unquote(opts)


@gettext do text, _opts -> text end


@gettext_lazy do text, _opts -> text end


@gettext_n plaque, count, _opts -> ngettext(plaque, count) end


end


end

def ngettext(singular, plural, count) do


Gettext.dngettext(MyApp.Gettext, "en", singular, plural, count)


end


end


在应用程序中使用翻译:

elixir

defmodule MyAppWeb.PageController do


use MyApp.Gettext

def index(conn, _params) do


title = dgettext("title", "Welcome to MyApp!")


conn


|> put_flash(:info, title)


|> render("index.html", title: title)


end


end


本地化(l10n)

本地化通常涉及日期、货币和数字格式的本地化。在 Elixir 中,我们可以使用 `Decimal` 和 `DateTime` 库来处理这些格式。

elixir

defmodule MyAppWeb.PageController do


use MyApp.Gettext

def index(conn, _params) do


使用 Decimal 处理货币


price = Decimal.new("19.99")


formatted_price = Decimal.to_string_with_delimiter(price)

使用 DateTime 处理日期


now = DateTime.utc_now()


formatted_date = DateTime.format(now, "{0D}/{0M}/{YYYY}")

title = dgettext("title", "Welcome to MyApp!")


conn


|> put_flash(:info, title)


|> render("index.html", title: title, price: formatted_price, date: formatted_date)


end


end


总结

通过使用 `gettext` 库和 Elixir 的内置功能,我们可以轻松地在 Elixir 应用程序中实现国际化与本地化。这不仅可以提高应用程序的可用性,还可以吸引更多来自不同国家和地区的用户。

我们介绍了如何创建翻译文件、使用 `gettext` 库获取翻译,以及如何处理本地化数据。希望这些信息能帮助你在 Elixir 项目中实现国际化与本地化。

扩展阅读

- [gettext 官方文档](https://github.com/elixir-lang/gettext)

- [Decimal 官方文档](https://hexdocs.pm/decimal/)

- [DateTime 官方文档](https://hexdocs.pm/elixir/DateTime.html)

通过不断学习和实践,你可以成为 Elixir 国际化和本地化领域的专家。