使用 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