diff --git a/README.md b/README.md index afaf924d..4c35e2a2 100644 --- a/README.md +++ b/README.md @@ -168,3 +168,46 @@ above. Just change the stylesheet link in the `torch.html.eex` layout. If you want to use the theme, but override the colors, you'll need to include your own stylesheet with the specific overrides. + +## Internationalization + +Torch comes with `.po` files for `en`, `ru` and `es` locales. If you wish to add more +translations you can configure it by creating a `MessagesBackend` module and then +adding it as a configuration on you `config.exs`. You can find the all needed messages +on [messages_backend.ex](lib/torch/messages_backend.ex). + +**Example** + +```elixir +defmodule MyApp.Torch.MessagesBackend do + import MyAppWeb.Gettext, only: [dgettext: 2] + + def message("Contains"), do: dgettext("torch", "Contains") + def message("Equals"), do: dgettext("torch", "Equals") + def message("Choose one"), do: dgettext("torch", "Choose one") + def message("Before"), do: dgettext("torch", "Before") + def message("After"), do: dgettext("torch", "After") + def message("Greater Than"), do: dgettext("torch", "Greater Than") + def message("Greater Than Or Equal"), do: dgettext("torch", "Greater Than Or Equal") + def message("Less Than"), do: dgettext("torch", "Less Than") + def message("start"), do: dgettext("torch", "start") + def message("end"), do: dgettext("torch", "end") + def message("Select Date"), do: dgettext("torch", "Select Date") + def message("Select Start Date"), do: dgettext("torch", "Select Start Date") + def message("Select End Date"), do: dgettext("torch", "Select End Date") + def message("< Prev"), do: dgettext("torch", "< Prev") + def message("Next >"), do: dgettext("torch", "Next >") + # ... + + # You can add a fallback so it won't break with new added texts + def message(text), do: Torch.MessagesBackend.message(text) +end +``` + +```elixir +# config.exs +config :torch, + otp_app: :my_app_name, + messages_backend: MyApp.Torch.MessagesBackend + template_format: "eex" || "slim" +``` diff --git a/lib/torch/config.ex b/lib/torch/config.ex index de5207df..4e764a12 100644 --- a/lib/torch/config.ex +++ b/lib/torch/config.ex @@ -10,4 +10,8 @@ defmodule Torch.Config do def template_format do Application.get_env(:torch, :template_format) end + + def messages_backend do + Application.get_env(:torch, :messages_backend, Torch.MessagesBackend) + end end diff --git a/lib/torch/messages_backend.ex b/lib/torch/messages_backend.ex new file mode 100644 index 00000000..e00d1f8e --- /dev/null +++ b/lib/torch/messages_backend.ex @@ -0,0 +1,24 @@ +defmodule Torch.MessagesBackend do + @moduledoc """ + Provides messages for different parts of the package. Can + also be overridden to include custom translations. + """ + + import Torch.Gettext, only: [dgettext: 2] + + def message("Contains"), do: dgettext("default", "Contains") + def message("Equals"), do: dgettext("default", "Equals") + def message("Choose one"), do: dgettext("default", "Choose one") + def message("Before"), do: dgettext("default", "Before") + def message("After"), do: dgettext("default", "After") + def message("Greater Than"), do: dgettext("default", "Greater Than") + def message("Greater Than Or Equal"), do: dgettext("default", "Greater Than Or Equal") + def message("Less Than"), do: dgettext("default", "Less Than") + def message("start"), do: dgettext("default", "start") + def message("end"), do: dgettext("default", "end") + def message("Select Date"), do: dgettext("default", "Select Date") + def message("Select Start Date"), do: dgettext("default", "Select Start Date") + def message("Select End Date"), do: dgettext("default", "Select End Date") + def message("< Prev"), do: dgettext("default", "< Prev") + def message("Next >"), do: dgettext("default", "Next >") +end diff --git a/lib/torch/views/filter_view.ex b/lib/torch/views/filter_view.ex index 54c7fe63..bd451ecc 100644 --- a/lib/torch/views/filter_view.ex +++ b/lib/torch/views/filter_view.ex @@ -5,7 +5,7 @@ defmodule Torch.FilterView do use Phoenix.HTML - import Torch.Gettext, only: [dgettext: 2] + import Torch.Config, only: [messages_backend: 0] @type prefix :: atom | String.t() @type field :: atom | String.t() @@ -27,7 +27,7 @@ defmodule Torch.FilterView do :"#{field}_equals", options, value: params[to_string(prefix)]["#{field}_equals"], - prompt: dgettext("default", "Choose one") + prompt: messages_backend().message("Choose one") ) end @@ -47,8 +47,8 @@ defmodule Torch.FilterView do {selected, _value} = find_param(params[prefix_str], field) opts = [ - {dgettext("default", "Contains"), "#{prefix}[#{field}_contains]"}, - {dgettext("default", "Equals"), "#{prefix}[#{field}_equals]"} + {messages_backend().message("Contains"), "#{prefix}[#{field}_contains]"}, + {messages_backend().message("Equals"), "#{prefix}[#{field}_equals]"} ] select(:filters, "", opts, class: "filter-type", value: "#{prefix}[#{selected}]") @@ -70,8 +70,8 @@ defmodule Torch.FilterView do {selected, _value} = find_param(params[prefix_str], field) opts = [ - {dgettext("default", "Before"), "#{prefix}[#{field}_before]"}, - {dgettext("default", "After"), "#{prefix}[#{field}_after]"} + {messages_backend().message("Before"), "#{prefix}[#{field}_before]"}, + {messages_backend().message("After"), "#{prefix}[#{field}_after]"} ] select(:filters, "", opts, class: "filter-type", value: "#{prefix}[#{selected}]") @@ -92,10 +92,10 @@ defmodule Torch.FilterView do {selected, _value} = find_param(params[prefix_str], field) opts = [ - {dgettext("default", "Equals"), "#{prefix}[#{field}_equals]"}, - {dgettext("default", "Greater Than"), "#{prefix}[#{field}_greater_than]"}, - {dgettext("default", "Greater Than Or Equal"), "#{prefix}[#{field}_greater_than_or]"}, - {dgettext("default", "Less Than"), "#{prefix}[#{field}_less_than]"} + {messages_backend().message("Equals"), "#{prefix}[#{field}_equals]"}, + {messages_backend().message("Greater Than"), "#{prefix}[#{field}_greater_than]"}, + {messages_backend().message("Greater Than Or Equal"), "#{prefix}[#{field}_greater_than_or]"}, + {messages_backend().message("Less Than"), "#{prefix}[#{field}_less_than]"} ] select(:filters, "", opts, class: "filter-type", value: "#{prefix}[#{selected}]") @@ -174,14 +174,14 @@ defmodule Torch.FilterView do torch_date_input( "#{prefix}[#{field}_between][start]", get_in(params, [prefix, "#{field}_between", "start"]), - dgettext("default", "start") + messages_backend().message("start") ) {:safe, ending} = torch_date_input( "#{prefix}[#{field}_between][end]", get_in(params, [prefix, "#{field}_between", "end"]), - dgettext("default", "end") + messages_backend().message("end") ) raw(start ++ ending) @@ -227,7 +227,7 @@ defmodule Torch.FilterView do class: "datepicker", name: name, value: value, - placeholder: dgettext("default", "Select Date") + placeholder: messages_backend().message("Select Date") ) end @@ -238,7 +238,7 @@ defmodule Torch.FilterView do class: "datepicker start", name: name, value: value, - placeholder: dgettext("default", "Select Start Date") + placeholder: messages_backend().message("Select Start Date") ) end @@ -249,7 +249,7 @@ defmodule Torch.FilterView do class: "datepicker end", name: name, value: value, - placeholder: dgettext("default", "Select End Date") + placeholder: messages_backend().message("Select End Date") ) end diff --git a/lib/torch/views/pagination_view.ex b/lib/torch/views/pagination_view.ex index 6249c399..e0811258 100644 --- a/lib/torch/views/pagination_view.ex +++ b/lib/torch/views/pagination_view.ex @@ -6,7 +6,7 @@ defmodule Torch.PaginationView do use Phoenix.View, root: "lib/torch/templates" use Phoenix.HTML - import Torch.Gettext, only: [dgettext: 2] + import Torch.Config, only: [messages_backend: 0] import Torch.TableView @doc """ @@ -26,7 +26,7 @@ defmodule Torch.PaginationView do """ def prev_link(conn, current_page, sort_opts \\ nil) do if current_page != 1 do - link(dgettext("default", "< Prev"), + link(messages_backend().message("< Prev"), to: "?" <> querystring(conn, page: current_page - 1, sort_opts: sort_opts) ) end @@ -46,7 +46,7 @@ defmodule Torch.PaginationView do """ def next_link(conn, current_page, num_pages, sort_opts \\ nil) do if current_page != num_pages do - link(dgettext("default", "Next >"), + link(messages_backend().message("Next >"), to: "?" <> querystring(conn, page: current_page + 1, sort_opts: sort_opts) ) end diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 8b393f27..e1a736fd 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -11,63 +11,76 @@ msgid "" msgstr "" #, elixir-format -#: lib/torch/views/pagination_view.ex:29 +#: lib/torch/messages_backend.ex:17 msgid "< Prev" msgstr "" #, elixir-format -#: lib/torch/views/pagination_view.ex:47 +#: lib/torch/messages_backend.ex:18 msgid "Next >" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:29 -#: lib/torch/views/filter_view.ex:174 +#: lib/torch/messages_backend.ex:6 msgid "Choose one" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:50 -#: lib/torch/views/filter_view.ex:71 +#: lib/torch/messages_backend.ex:5 msgid "Equals" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:49 +#: lib/torch/messages_backend.ex:4 msgid "Contains" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:72 +#: lib/torch/messages_backend.ex:9 msgid "Greater Than" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:73 +#: lib/torch/messages_backend.ex:10 msgid "Greater Than Or Equal" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:74 +#: lib/torch/messages_backend.ex:11 msgid "Less Than" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:139 +#: lib/torch/messages_backend.ex:12 msgid "start" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:146 +#: lib/torch/messages_backend.ex:13 msgid "end" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:185 +#: lib/torch/messages_backend.ex:15 msgid "Select Start Date" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:196 +#: lib/torch/messages_backend.ex:16 msgid "Select End Date" msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:8 +msgid "After" +msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:7 +msgid "Before" +msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:14 +msgid "Select Date" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index e94f13c4..1e2b4272 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -1,59 +1,74 @@ #, elixir-format -#: lib/torch/views/pagination_view.ex:29 +#: lib/torch/messages_backend.ex:17 msgid "< Prev" msgstr "" #, elixir-format -#: lib/torch/views/pagination_view.ex:47 +#: lib/torch/messages_backend.ex:18 msgid "Next >" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:29 lib/torch/views/filter_view.ex:174 +#: lib/torch/messages_backend.ex:6 msgid "Choose one" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:50 lib/torch/views/filter_view.ex:71 +#: lib/torch/messages_backend.ex:5 msgid "Equals" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:49 +#: lib/torch/messages_backend.ex:4 msgid "Contains" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:72 +#: lib/torch/messages_backend.ex:9 msgid "Greater Than" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:73 +#: lib/torch/messages_backend.ex:10 msgid "Greater Than Or Equal" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:74 +#: lib/torch/messages_backend.ex:11 msgid "Less Than" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:139 +#: lib/torch/messages_backend.ex:12 msgid "start" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:146 +#: lib/torch/messages_backend.ex:13 msgid "end" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:185 +#: lib/torch/messages_backend.ex:15 msgid "Select Start Date" msgstr "" #, elixir-format -#: lib/torch/views/filter_view.ex:196 +#: lib/torch/messages_backend.ex:16 msgid "Select End Date" msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:8 +msgid "After" +msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:7 +msgid "Before" +msgstr "" + +#, elixir-format, fuzzy +#: lib/torch/messages_backend.ex:14 +msgid "Select Date" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po new file mode 100644 index 00000000..9d22eda9 --- /dev/null +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -0,0 +1,87 @@ +## "msgid"s in this file come from POT (.pot) files. +## +## Do not add, change, or remove "msgid"s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use "mix gettext.extract --merge" or "mix gettext.merge" +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: es\n" +"Plural-Forms: nplurals=2\n" + +#, elixir-format +#: lib/torch/messages_backend.ex:17 +msgid "< Prev" +msgstr "< Prev" + +#, elixir-format +#: lib/torch/messages_backend.ex:18 +msgid "Next >" +msgstr "Sig >" + +#, elixir-format +#: lib/torch/messages_backend.ex:6 +msgid "Choose one" +msgstr "Elija uno" + +#, elixir-format +#: lib/torch/messages_backend.ex:5 +msgid "Equals" +msgstr "Igual a" + +#, elixir-format +#: lib/torch/messages_backend.ex:4 +msgid "Contains" +msgstr "Contiene" + +#, elixir-format +#: lib/torch/messages_backend.ex:9 +msgid "Greater Than" +msgstr "Mayor a" + +#, elixir-format +#: lib/torch/messages_backend.ex:10 +msgid "Greater Than Or Equal" +msgstr "Mayor o igual a" + +#, elixir-format +#: lib/torch/messages_backend.ex:11 +msgid "Less Than" +msgstr "Menor a" + +#, elixir-format +#: lib/torch/messages_backend.ex:12 +msgid "start" +msgstr "inicio" + +#, elixir-format +#: lib/torch/messages_backend.ex:13 +msgid "end" +msgstr "fin" + +#, elixir-format +#: lib/torch/messages_backend.ex:15 +msgid "Select Start Date" +msgstr "Seleccione fecha de inicio" + +#, elixir-format +#: lib/torch/messages_backend.ex:16 +msgid "Select End Date" +msgstr "Seleccione fecha de fin" + +#, elixir-format +#: lib/torch/messages_backend.ex:8 +msgid "After" +msgstr "Después de" + +#, elixir-format +#: lib/torch/messages_backend.ex:7 +msgid "Before" +msgstr "Antes de" + +#, elixir-format, fuzzy +#: lib/torch/messages_backend.ex:14 +msgid "Select Date" +msgstr "Seleccione fecha de fin" diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po index 3e42413d..d030915e 100644 --- a/priv/gettext/ru/LC_MESSAGES/default.po +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -1,59 +1,74 @@ #, elixir-format -#: lib/torch/views/pagination_view.ex:29 +#: lib/torch/messages_backend.ex:17 msgid "< Prev" msgstr "< Предыдущая" #, elixir-format -#: lib/torch/views/pagination_view.ex:47 +#: lib/torch/messages_backend.ex:18 msgid "Next >" msgstr "Следующая >" #, elixir-format -#: lib/torch/views/filter_view.ex:29 lib/torch/views/filter_view.ex:174 +#: lib/torch/messages_backend.ex:6 msgid "Choose one" msgstr "Выберите один элемент" #, elixir-format -#: lib/torch/views/filter_view.ex:50 lib/torch/views/filter_view.ex:71 +#: lib/torch/messages_backend.ex:5 msgid "Equals" msgstr "Равно" #, elixir-format -#: lib/torch/views/filter_view.ex:49 +#: lib/torch/messages_backend.ex:4 msgid "Contains" msgstr "Содержит" #, elixir-format -#: lib/torch/views/filter_view.ex:72 +#: lib/torch/messages_backend.ex:9 msgid "Greater Than" msgstr "Больше" #, elixir-format -#: lib/torch/views/filter_view.ex:73 +#: lib/torch/messages_backend.ex:10 msgid "Greater Than Or Equal" msgstr "Больше или равно" #, elixir-format -#: lib/torch/views/filter_view.ex:74 +#: lib/torch/messages_backend.ex:11 msgid "Less Than" msgstr "Меньше" #, elixir-format -#: lib/torch/views/filter_view.ex:139 +#: lib/torch/messages_backend.ex:12 msgid "start" msgstr "начало" #, elixir-format -#: lib/torch/views/filter_view.ex:146 +#: lib/torch/messages_backend.ex:13 msgid "end" msgstr "конец" #, elixir-format -#: lib/torch/views/filter_view.ex:185 +#: lib/torch/messages_backend.ex:15 msgid "Select Start Date" msgstr "Выберите дату начала" #, elixir-format -#: lib/torch/views/filter_view.ex:196 +#: lib/torch/messages_backend.ex:16 msgid "Select End Date" msgstr "Выберите дату окончания" + +#, elixir-format +#: lib/torch/messages_backend.ex:8 +msgid "After" +msgstr "" + +#, elixir-format +#: lib/torch/messages_backend.ex:7 +msgid "Before" +msgstr "" + +#, elixir-format, fuzzy +#: lib/torch/messages_backend.ex:14 +msgid "Select Date" +msgstr "Выберите дату окончания"