使用 elixir gettext 标记要翻译的字符串列表(在编译时)
Marking list of strings for translation with elixir gettext (at compile time)
我正在尝试将此字符串列表标记为可翻译,以便它出现在 .pot 文件中。
import XXXWeb.Gettext
@crop_types ~w(grape strawberry potato tomato rice wheat corn peas hops carrot soy sunflower other)
|> Enum.map(&(XXXWeb.Gettext.dgettext_noop("crop_types", &1)))
根据 documentation,当我 运行 mix gettext.extract --merge
.
时,应该会导致字符串在通常的 .pot 文件中可翻译
我想避免“通常的”dgettext 动态翻译,并在编译时明确标记要翻译的字符串,这样将来当我添加字符串并忘记其中一种语言的翻译时,不会丢失任何内容。
我得到的错误是:
== Compilation error in file lib/XXX/fields/crop_types.ex ==
** (ArgumentError) Gettext macros expect translation keys (msgid and msgid_plural),
domains, and comments to expand to strings at compile-time, but the given msgid
doesn't. This is what the macro received:
{:x1, [line: 5], :elixir_fn}
我读到这是由于 AST 如何首先尝试 运行 gettext 然后 运行s 枚举函数,这完全不是我想要的。但是我对那部分不是很清楚,所以请指正。
我该如何完成?
编辑:
为了安全起见,这是我的 gettext 模块:
defmodule MyAppWeb.Gettext do
use Gettext, otp_app: :myapp
end
我认为这种方法应该有效(编辑后的答案):
defmodule XXXWeb.Gettext do
use Gettext, otp_app: :thing
defmacro extract_gettext_strings(crops) do
{crop_types, _} = Code.eval_quoted(crops)
for crop <- crop_types do
quote do
XXXWeb.Gettext.dgettext_noop("crop_types", unquote(crop))
end
end
end
end
defmodule G do
require XXXWeb.Gettext
XXXWeb.Gettext.extract_gettext_strings(~w(grape strawberry potato tomato rice wheat corn peas hops carrot soy sunflower other))
end
我正在尝试将此字符串列表标记为可翻译,以便它出现在 .pot 文件中。
import XXXWeb.Gettext
@crop_types ~w(grape strawberry potato tomato rice wheat corn peas hops carrot soy sunflower other)
|> Enum.map(&(XXXWeb.Gettext.dgettext_noop("crop_types", &1)))
根据 documentation,当我 运行 mix gettext.extract --merge
.
我想避免“通常的”dgettext 动态翻译,并在编译时明确标记要翻译的字符串,这样将来当我添加字符串并忘记其中一种语言的翻译时,不会丢失任何内容。
我得到的错误是:
== Compilation error in file lib/XXX/fields/crop_types.ex ==
** (ArgumentError) Gettext macros expect translation keys (msgid and msgid_plural),
domains, and comments to expand to strings at compile-time, but the given msgid
doesn't. This is what the macro received:
{:x1, [line: 5], :elixir_fn}
我读到这是由于 AST 如何首先尝试 运行 gettext 然后 运行s 枚举函数,这完全不是我想要的。但是我对那部分不是很清楚,所以请指正。
我该如何完成?
编辑: 为了安全起见,这是我的 gettext 模块:
defmodule MyAppWeb.Gettext do
use Gettext, otp_app: :myapp
end
我认为这种方法应该有效(编辑后的答案):
defmodule XXXWeb.Gettext do
use Gettext, otp_app: :thing
defmacro extract_gettext_strings(crops) do
{crop_types, _} = Code.eval_quoted(crops)
for crop <- crop_types do
quote do
XXXWeb.Gettext.dgettext_noop("crop_types", unquote(crop))
end
end
end
end
defmodule G do
require XXXWeb.Gettext
XXXWeb.Gettext.extract_gettext_strings(~w(grape strawberry potato tomato rice wheat corn peas hops carrot soy sunflower other))
end