From cf28aa5295e02bc2214e9846ebcef3e9be79c822 Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Tue, 10 Dec 2024 00:39:52 +0200 Subject: [PATCH 1/6] feat: add i18n right not, the most of the app is translated, but there are some parts that are not translated yet, like the settings page. --- .../controllers/page_html/home.html.heex | 8 +- lib/exmr_web/helpers.ex | 7 ++ lib/exmr_web/live/exam_live/index.html.heex | 20 +++- lib/exmr_web/plug/local_plug.ex | 67 +++++++++++ lib/exmr_web/router.ex | 7 +- priv/gettext/default.pot | 113 ++++++++++++++++++ priv/gettext/en/LC_MESSAGES/default.po | 113 ++++++++++++++++++ priv/gettext/ru/LC_MESSAGES/default.mo | Bin 0 -> 1779 bytes priv/gettext/ru/LC_MESSAGES/default.po | 103 ++++++++++++++++ priv/gettext/ru/LC_MESSAGES/errors.po | 111 +++++++++++++++++ 10 files changed, 536 insertions(+), 13 deletions(-) create mode 100644 lib/exmr_web/helpers.ex create mode 100644 lib/exmr_web/plug/local_plug.ex create mode 100644 priv/gettext/default.pot create mode 100644 priv/gettext/en/LC_MESSAGES/default.po create mode 100644 priv/gettext/ru/LC_MESSAGES/default.mo create mode 100644 priv/gettext/ru/LC_MESSAGES/default.po create mode 100644 priv/gettext/ru/LC_MESSAGES/errors.po diff --git a/lib/exmr_web/controllers/page_html/home.html.heex b/lib/exmr_web/controllers/page_html/home.html.heex index 15c51e9..abe028b 100644 --- a/lib/exmr_web/controllers/page_html/home.html.heex +++ b/lib/exmr_web/controllers/page_html/home.html.heex @@ -48,16 +48,16 @@

- hell yeah + <%= gettext("A simple, modern, and fast exam management system.") %>

- y'all really though i'm gonna be serious? lol + <%= gettext("Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado") %>

diff --git a/lib/exmr_web/helpers.ex b/lib/exmr_web/helpers.ex new file mode 100644 index 0000000..79ea4de --- /dev/null +++ b/lib/exmr_web/helpers.ex @@ -0,0 +1,7 @@ +defmodule ExmrWeb.LiveHelpers do + def on_mount(:default, _params, session, socket) do + locale = session["locale"] || "en" + Gettext.put_locale(locale) + {:cont, socket} + end +end diff --git a/lib/exmr_web/live/exam_live/index.html.heex b/lib/exmr_web/live/exam_live/index.html.heex index 478325e..6940612 100644 --- a/lib/exmr_web/live/exam_live/index.html.heex +++ b/lib/exmr_web/live/exam_live/index.html.heex @@ -1,15 +1,15 @@ <.header> Listing Exams
- + | - +
<:actions> <.link patch={~p"/exams/new"}> <.button class="dark:bg-sky-300 text-white dark:text-black/80 dark:hover:bg-sky-400"> - New Exam + <%= gettext("New Exam") %> @@ -20,7 +20,15 @@
<%= exam.subject %>
- <%= exam.date %> | In <%= Date.diff(exam.date, Date.utc_today()) %> days + <%= exam.date %> | + + <%= case Date.diff(exam.date, Date.utc_today()) do + 0 -> gettext("Today") + 1 -> gettext("Tomorrow") + x when x > 1 -> "#{x} #{gettext("days left")}" + x when x < 0 -> "#{x*-1} #{gettext("days passed")}" + end %> +
diff --git a/lib/exmr_web/plug/local_plug.ex b/lib/exmr_web/plug/local_plug.ex new file mode 100644 index 0000000..57952b4 --- /dev/null +++ b/lib/exmr_web/plug/local_plug.ex @@ -0,0 +1,67 @@ +defmodule ExmrWeb.Plugs.Locale do + import Plug.Conn + + def init(_opts), do: nil + + def call(conn, _opts) do + accepted_languages = extract_accept_language(conn) + known_locales = Gettext.known_locales(ExmrWeb.Gettext) + + accepted_languages = + known_locales -- + known_locales -- accepted_languages + + case accepted_languages do + [locale | _] -> + Gettext.put_locale(ExmrWeb.Gettext, locale) + + conn + |> put_session(:locale, locale) + + _ -> + conn + end + end + + # Copied from + # https://raw.githubusercontent.com/smeevil/set_locale/fd35624e25d79d61e70742e42ade955e5ff857b8/lib/headers.ex + def extract_accept_language(conn) do + case Plug.Conn.get_req_header(conn, "accept-language") do + [value | _] -> + value + |> String.split(",") + |> Enum.map(&parse_language_option/1) + |> Enum.sort(&(&1.quality > &2.quality)) + |> Enum.map(& &1.tag) + |> Enum.reject(&is_nil/1) + |> ensure_language_fallbacks() + + _ -> + [] + end + end + + defp parse_language_option(string) do + captures = Regex.named_captures(~r/^\s?(?[\w\-]+)(?:;q=(?[\d\.]+))?$/i, string) + + quality = + case Float.parse(captures["quality"] || "1.0") do + {val, _} -> val + _ -> 1.0 + end + + %{tag: captures["tag"], quality: quality} + end + + defp ensure_language_fallbacks(tags) do + Enum.flat_map(tags, fn tag -> + case String.split(tag, "-") do + [language, _country_variant] -> + if Enum.member?(tags, language), do: [tag], else: [tag, language] + + [_language] -> + [tag] + end + end) + end +end diff --git a/lib/exmr_web/router.ex b/lib/exmr_web/router.ex index 460690a..2db5542 100644 --- a/lib/exmr_web/router.ex +++ b/lib/exmr_web/router.ex @@ -12,6 +12,7 @@ defmodule ExmrWeb.Router do plug :put_root_layout, html: {ExmrWeb.Layouts, :root} plug :protect_from_forgery plug :put_secure_browser_headers + plug ExmrWeb.Plugs.Locale plug :fetch_current_user end @@ -53,7 +54,7 @@ defmodule ExmrWeb.Router do pipe_through [:browser, :redirect_if_user_is_authenticated] live_session :redirect_if_user_is_authenticated, - on_mount: [{ExmrWeb.UserAuth, :redirect_if_user_is_authenticated}] do + on_mount: [{ExmrWeb.UserAuth, :redirect_if_user_is_authenticated}, Exmrweb.LiveHelpers] do if Exmr.enable_registration() != "false" do live "/users/register", UserRegistrationLive, :new end @@ -70,7 +71,7 @@ defmodule ExmrWeb.Router do pipe_through [:browser, :require_authenticated_user] live_session :require_authenticated_user, - on_mount: [{ExmrWeb.UserAuth, :ensure_authenticated}] do + on_mount: [{ExmrWeb.UserAuth, :ensure_authenticated}, ExmrWeb.LiveHelpers] do if Exmr.enable_registration() == "false" do live "/users/register", UserRegistrationLive, :new end @@ -93,7 +94,7 @@ defmodule ExmrWeb.Router do delete "/users/log_out", UserSessionController, :delete live_session :current_user, - on_mount: [{ExmrWeb.UserAuth, :mount_current_user}] do + on_mount: [{ExmrWeb.UserAuth, :mount_current_user}, ExmrWeb.LiveHelpers] do live "/users/confirm/:token", UserConfirmationLive, :edit live "/users/confirm", UserConfirmationInstructionsLive, :new end diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot new file mode 100644 index 0000000..91c4d4e --- /dev/null +++ b/priv/gettext/default.pot @@ -0,0 +1,113 @@ +## This file is a PO Template file. +## +## "msgid"s here are often extracted from source code. +## Add new messages manually only if they're dynamic +## messages that can't be statically extracted. +## +## Run "mix gettext.extract" to bring this file up to +## date. Leave "msgstr"s empty as changing them here has no +## effect: edit them in PO (.po) files instead. +# +msgid "" +msgstr "" + +#: lib/exmr_web/controllers/page_html/home.html.heex:51 +#, elixir-autogen, elixir-format +msgid "A simple, modern, and fast exam management system." +msgstr "" + +#: lib/exmr_web/components/core_components.ex:489 +#, elixir-autogen, elixir-format +msgid "Actions" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:164 +#, elixir-autogen, elixir-format +msgid "Attempting to reconnect" +msgstr "" + +#: lib/exmr_web/controllers/page_html/home.html.heex:54 +#, elixir-autogen, elixir-format +msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:39 +#, elixir-autogen, elixir-format +msgid "Edit" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:155 +#, elixir-autogen, elixir-format +msgid "Error!" +msgstr "" + +#: lib/exmr_web/controllers/page_html/home.html.heex:96 +#, elixir-autogen, elixir-format +msgid "Exams" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:176 +#, elixir-autogen, elixir-format +msgid "Hang in there while we get back on track" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:12 +#, elixir-autogen, elixir-format +msgid "New Exam" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:46 +#, elixir-autogen, elixir-format +msgid "Remove" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:171 +#, elixir-autogen, elixir-format +msgid "Something went wrong!" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:7 +#, elixir-autogen, elixir-format +msgid "Sort by Date" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:4 +#, elixir-autogen, elixir-format +msgid "Sort by Subject" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:154 +#, elixir-autogen, elixir-format +msgid "Success!" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Today" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:27 +#, elixir-autogen, elixir-format +msgid "Tomorrow" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:159 +#, elixir-autogen, elixir-format +msgid "We can't find the internet" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:80 +#: lib/exmr_web/components/core_components.ex:134 +#, elixir-autogen, elixir-format +msgid "close" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:28 +#, elixir-autogen, elixir-format +msgid "days left" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:29 +#, elixir-autogen, elixir-format +msgid "days passed" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po new file mode 100644 index 0000000..b6987d9 --- /dev/null +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -0,0 +1,113 @@ +## "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: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: lib/exmr_web/controllers/page_html/home.html.heex:51 +#, elixir-autogen, elixir-format +msgid "A simple, modern, and fast exam management system." +msgstr "" + +#: lib/exmr_web/components/core_components.ex:489 +#, elixir-autogen, elixir-format +msgid "Actions" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:164 +#, elixir-autogen, elixir-format +msgid "Attempting to reconnect" +msgstr "" + +#: lib/exmr_web/controllers/page_html/home.html.heex:54 +#, elixir-autogen, elixir-format +msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:39 +#, elixir-autogen, elixir-format +msgid "Edit" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:155 +#, elixir-autogen, elixir-format +msgid "Error!" +msgstr "" + +#: lib/exmr_web/controllers/page_html/home.html.heex:96 +#, elixir-autogen, elixir-format +msgid "Exams" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:176 +#, elixir-autogen, elixir-format +msgid "Hang in there while we get back on track" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:12 +#, elixir-autogen, elixir-format +msgid "New Exam" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:46 +#, elixir-autogen, elixir-format +msgid "Remove" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:171 +#, elixir-autogen, elixir-format +msgid "Something went wrong!" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:7 +#, elixir-autogen, elixir-format +msgid "Sort by Date" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:4 +#, elixir-autogen, elixir-format +msgid "Sort by Subject" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:154 +#, elixir-autogen, elixir-format +msgid "Success!" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:26 +#, elixir-autogen, elixir-format +msgid "Today" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:27 +#, elixir-autogen, elixir-format +msgid "Tomorrow" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:159 +#, elixir-autogen, elixir-format +msgid "We can't find the internet" +msgstr "" + +#: lib/exmr_web/components/core_components.ex:80 +#: lib/exmr_web/components/core_components.ex:134 +#, elixir-autogen, elixir-format +msgid "close" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:28 +#, elixir-autogen, elixir-format +msgid "days left" +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:29 +#, elixir-autogen, elixir-format +msgid "days passed" +msgstr "" diff --git a/priv/gettext/ru/LC_MESSAGES/default.mo b/priv/gettext/ru/LC_MESSAGES/default.mo new file mode 100644 index 0000000000000000000000000000000000000000..2694b2e7e1be05da4e4510f14f07c4b77060530f GIT binary patch literal 1779 zcmZ{i&u<$=6vu~Be$<5mr3itF^deB{!D~vXP!&LGT3o2qLR6c!Qcsih#9r#%v3AFH z%&AF)KuS<01cC!Ugg9_Qa!uUYiR&Q2t%uHDdMg4U{sOKX_`cbYT1Xvh_T!m(^WOJ; zcYoWv^K*gm6y|=+UooGX)!S2@i5ae1vgO7l>!NL;0xd`G?xbpAlJPJ za$FVUK3d=*aCvKg4di^kfZXpLkS*oAPhg@wu@95Slb9&8JrL>!`_10)*qg!CqlGLgZ+aIu0Ph4MdwkS2{-e>uxrthmHnG$7P zksUlk4JmDLUXd@O7Y)rrGb@201ILsReqAR@AUdJCnm5_MhD;Jw5wo%8wBD(TcTU9# zoSUZH?7QAs)e3m!u?TFPhUH#4mQhldM#pX^sy1Q1S5`8dSWi>j%$+%Prg%5u%Y{R^ z6B=?NuNe8d0*j{U=v-iO7reJr zq~c7(tX6m#^h)7K;c!maZ_~?moGzwIwwqqbQ@Uu!wuimG9bw+U5Bp>XWUrH$o7M@1Z4U`q&PI{hHfJSM2bA-U|D@vtT2$O4uJzX6*69m4UVm{>wG6 z*|qD?2RviI#z$h&55@H_qj zMSHH1uCQNi_d7zwHTPzqt&7hBa^OAguuaa1bV<06XdOE6jijrBbK=gB{`+#dIreno Kgtd*cw#B~-3C2(W literal 0 HcmV?d00001 diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po new file mode 100644 index 0000000..172fa47 --- /dev/null +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -0,0 +1,103 @@ +# # This file is a PO Template file. +# # +# # "msgid"s here are often extracted from source code. +# # Add new messages manually only if they're dynamic +# # messages that can't be statically extracted. +# # +# # Run "mix gettext.extract" to bring this file up to +# # date. Leave "msgstr"s empty as changing them here has no +# # effect: edit them in PO (.po) files instead. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.2\n" + +#: lib/exmr_web/controllers/page_html/home.html.heex:51 +msgid "A simple, modern, and fast exam management system." +msgstr "Простая, современная и быстрая система управления экзаменами." + +#: lib/exmr_web/components/core_components.ex:489 +msgid "Actions" +msgstr "Действия" + +#: lib/exmr_web/components/core_components.ex:164 +msgid "Attempting to reconnect" +msgstr "Попытка восстановить соединение" + +#: lib/exmr_web/controllers/page_html/home.html.heex:54 +msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" +msgstr "Создано с использованием Phoenix LiveView, Ecto и TailwindCSS в исполнении @vavakado" + +#: lib/exmr_web/live/exam_live/index.html.heex:39 +msgid "Edit" +msgstr "Изменить" + +#: lib/exmr_web/components/core_components.ex:155 +msgid "Error!" +msgstr "Ошибка!" + +#: lib/exmr_web/controllers/page_html/home.html.heex:96 +msgid "Exams" +msgstr "Экзамены" + +#: lib/exmr_web/components/core_components.ex:176 +msgid "Hang in there while we get back on track" +msgstr "Держитесь, пока мы не вернемся в строй" + +#: lib/exmr_web/live/exam_live/index.html.heex:12 +msgid "New Exam" +msgstr "Новый экзамен" + +#: lib/exmr_web/live/exam_live/index.html.heex:46 +msgid "Remove" +msgstr "Удалить" + +#: lib/exmr_web/components/core_components.ex:171 +msgid "Something went wrong!" +msgstr "Что-то пошло не так!" + +#: lib/exmr_web/live/exam_live/index.html.heex:7 +msgid "Sort by Date" +msgstr "Сортировать по дате" + +#: lib/exmr_web/live/exam_live/index.html.heex:4 +msgid "Sort by Subject" +msgstr "Сортировать по предмету" + +#: lib/exmr_web/components/core_components.ex:154 +msgid "Success!" +msgstr "Успех!" + +#: lib/exmr_web/live/exam_live/index.html.heex:26 +msgid "Today" +msgstr "Сегодня" + +#: lib/exmr_web/live/exam_live/index.html.heex:27 +msgid "Tomorrow" +msgstr "Завтра" + +#: lib/exmr_web/components/core_components.ex:159 +msgid "We can't find the internet" +msgstr "Мы не можем найти интернет" + +#: lib/exmr_web/components/core_components.ex:80 +#: lib/exmr_web/components/core_components.ex:134 +msgid "close" +msgstr "закрыть" + +#: lib/exmr_web/live/exam_live/index.html.heex:28 +msgid "days left" +msgstr "дней осталось" + +#: lib/exmr_web/live/exam_live/index.html.heex:29 +msgid "days passed" +msgstr "дней прошло" diff --git a/priv/gettext/ru/LC_MESSAGES/errors.po b/priv/gettext/ru/LC_MESSAGES/errors.po new file mode 100644 index 0000000..66e9a13 --- /dev/null +++ b/priv/gettext/ru/LC_MESSAGES/errors.po @@ -0,0 +1,111 @@ +## "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: ru\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100 != 11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10||n%100>=20) ? 1 : 2);\n" + +msgid "can't be blank" +msgstr "" + +msgid "has already been taken" +msgstr "" + +msgid "is invalid" +msgstr "" + +msgid "must be accepted" +msgstr "" + +msgid "has invalid format" +msgstr "" + +msgid "has an invalid entry" +msgstr "" + +msgid "is reserved" +msgstr "" + +msgid "does not match confirmation" +msgstr "" + +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be %{count} byte(s)" +msgid_plural "should be %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at least %{count} byte(s)" +msgid_plural "should be at least %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "should be at most %{count} byte(s)" +msgid_plural "should be at most %{count} byte(s)" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" From 9e9d8ffdafb6a1eb77e0a79650e1b291ec2cb8e4 Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Wed, 11 Dec 2024 22:18:34 +0200 Subject: [PATCH 2/6] trans: settings and new exam modal translated those to russian --- .../components/layouts/root.html.heex | 4 +- lib/exmr_web/live/exam_live/form_component.ex | 12 +- lib/exmr_web/live/exam_live/index.ex | 2 +- lib/exmr_web/live/exam_live/index.html.heex | 3 +- lib/exmr_web/live/user_settings_live.ex | 33 ++++-- lib/exmr_web/router.ex | 2 +- priv/gettext/default.pot | 108 +++++++++++++++++ priv/gettext/en/LC_MESSAGES/default.po | 108 +++++++++++++++++ priv/gettext/ru/LC_MESSAGES/default.po | 109 +++++++++++++++++- 9 files changed, 353 insertions(+), 28 deletions(-) diff --git a/lib/exmr_web/components/layouts/root.html.heex b/lib/exmr_web/components/layouts/root.html.heex index 520a812..1d1e3c9 100644 --- a/lib/exmr_web/components/layouts/root.html.heex +++ b/lib/exmr_web/components/layouts/root.html.heex @@ -30,7 +30,7 @@ href={~p"/users/settings"} class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700 dark:text-zinc-300 dark:hover:text-zinc-100" > - Settings + <%= gettext("Settings") %>
  • @@ -39,7 +39,7 @@ method="delete" class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700 dark:text-zinc-300 dark:hover:text-zinc-100" > - Log out + <%= gettext("Log out") %>
  • <% else %> diff --git a/lib/exmr_web/live/exam_live/form_component.ex b/lib/exmr_web/live/exam_live/form_component.ex index f6a3642..998b77f 100644 --- a/lib/exmr_web/live/exam_live/form_component.ex +++ b/lib/exmr_web/live/exam_live/form_component.ex @@ -9,7 +9,9 @@ defmodule ExmrWeb.ExamLive.FormComponent do
    <.header> <%= @title %> - <:subtitle>Use this form to manage exam records in your database. + <:subtitle> + <%= gettext("Use this form to manage exam records in your database.") %> + <.simple_form @@ -19,11 +21,11 @@ defmodule ExmrWeb.ExamLive.FormComponent do phx-change="validate" phx-submit="save" > - <.input field={@form[:subject]} type="text" label="Subject" /> - <.input field={@form[:description]} type="text" label="Description" /> - <.input field={@form[:date]} type="date" label="Date" /> + <.input field={@form[:subject]} type="text" label={gettext("Subject")} /> + <.input field={@form[:description]} type="text" label={gettext("Description")} /> + <.input field={@form[:date]} type="date" label={gettext("Date")} /> <:actions> - <.button phx-disable-with="Saving...">Save Exam + <.button phx-disable-with={gettext("Saving...")}><%= gettext("Save Exam") %>
    diff --git a/lib/exmr_web/live/exam_live/index.ex b/lib/exmr_web/live/exam_live/index.ex index 3326460..d304dbc 100644 --- a/lib/exmr_web/live/exam_live/index.ex +++ b/lib/exmr_web/live/exam_live/index.ex @@ -29,7 +29,7 @@ defmodule ExmrWeb.ExamLive.Index do defp apply_action(socket, :new, _params) do socket - |> assign(:page_title, "New Exam") + |> assign(:page_title, gettext("New Exam")) |> assign(:exam, %Exam{}) end diff --git a/lib/exmr_web/live/exam_live/index.html.heex b/lib/exmr_web/live/exam_live/index.html.heex index 6940612..ab560ea 100644 --- a/lib/exmr_web/live/exam_live/index.html.heex +++ b/lib/exmr_web/live/exam_live/index.html.heex @@ -1,5 +1,5 @@ <.header> - Listing Exams + <%= gettext("Listing Exams") %>
    | @@ -20,6 +20,7 @@
    <%= exam.subject %>
    + <%= exam.date %> | <%= case Date.diff(exam.date, Date.utc_today()) do diff --git a/lib/exmr_web/live/user_settings_live.ex b/lib/exmr_web/live/user_settings_live.ex index c1a832a..09feec2 100644 --- a/lib/exmr_web/live/user_settings_live.ex +++ b/lib/exmr_web/live/user_settings_live.ex @@ -6,8 +6,8 @@ defmodule ExmrWeb.UserSettingsLive do def render(assigns) do ~H""" <.header class="text-center"> - Account Settings - <:subtitle>Manage your account email address and password settings + <%= gettext("Account Settings") %> + <:subtitle><%= gettext("Manage your account email address and password settings") %>
    @@ -18,18 +18,20 @@ defmodule ExmrWeb.UserSettingsLive do phx-submit="update_email" phx-change="validate_email" > - <.input field={@email_form[:email]} type="email" label="Email" required /> + <.input field={@email_form[:email]} type="email" label={gettext("Email")} required /> <.input field={@email_form[:current_password]} name="current_password" id="current_password_for_email" type="password" - label="Current password" + label={gettext("Current password")} value={@email_form_current_password} required /> <:actions> - <.button phx-disable-with="Changing...">Change Email + <.button phx-disable-with={gettext("Changing...")}> + <%= gettext("Change Email") %> +
    @@ -49,23 +51,30 @@ defmodule ExmrWeb.UserSettingsLive do id="hidden_user_email" value={@current_email} /> - <.input field={@password_form[:password]} type="password" label="New password" required /> + <.input + field={@password_form[:password]} + type="password" + label={gettext("New password")} + required + /> <.input field={@password_form[:password_confirmation]} type="password" - label="Confirm new password" + label={gettext("Confirm new password")} /> <.input field={@password_form[:current_password]} name="current_password" type="password" - label="Current password" + label={gettext("Current password")} id="current_password_for_password" value={@current_password} required /> <:actions> - <.button phx-disable-with="Changing...">Change Password + <.button phx-disable-with={gettext("Changing...")}> + <%= gettext("Change Password") %> +
    @@ -77,10 +86,10 @@ defmodule ExmrWeb.UserSettingsLive do socket = case Users.update_user_email(socket.assigns.current_user, token) do :ok -> - put_flash(socket, :info, "Email changed successfully.") + put_flash(socket, :info, gettext("Email changed successfully.")) :error -> - put_flash(socket, :error, "Email change link is invalid or it has expired.") + put_flash(socket, :error, gettext("Email change link is invalid or it has expired.")) end {:ok, push_navigate(socket, to: ~p"/users/settings")} @@ -127,7 +136,7 @@ defmodule ExmrWeb.UserSettingsLive do &url(~p"/users/settings/confirm_email/#{&1}") ) - info = "A link to confirm your email change has been sent to the new address." + info = gettext("A link to confirm your email change has been sent to the new address.") {:noreply, socket |> put_flash(:info, info) |> assign(email_form_current_password: nil)} {:error, changeset} -> diff --git a/lib/exmr_web/router.ex b/lib/exmr_web/router.ex index 2db5542..eb1d7ef 100644 --- a/lib/exmr_web/router.ex +++ b/lib/exmr_web/router.ex @@ -54,7 +54,7 @@ defmodule ExmrWeb.Router do pipe_through [:browser, :redirect_if_user_is_authenticated] live_session :redirect_if_user_is_authenticated, - on_mount: [{ExmrWeb.UserAuth, :redirect_if_user_is_authenticated}, Exmrweb.LiveHelpers] do + on_mount: [{ExmrWeb.UserAuth, :redirect_if_user_is_authenticated}, ExmrWeb.LiveHelpers] do if Exmr.enable_registration() != "false" do live "/users/register", UserRegistrationLive, :new end diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 91c4d4e..767d0d5 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -51,6 +51,7 @@ msgstr "" msgid "Hang in there while we get back on track" msgstr "" +#: lib/exmr_web/live/exam_live/index.ex:32 #: lib/exmr_web/live/exam_live/index.html.heex:12 #, elixir-autogen, elixir-format msgid "New Exam" @@ -111,3 +112,110 @@ msgstr "" #, elixir-autogen, elixir-format msgid "days passed" msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:139 +#, elixir-autogen, elixir-format +msgid "A link to confirm your email change has been sent to the new address." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:9 +#, elixir-autogen, elixir-format +msgid "Account Settings" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:33 +#, elixir-autogen, elixir-format +msgid "Change Email" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:76 +#, elixir-autogen, elixir-format +msgid "Change Password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:32 +#: lib/exmr_web/live/user_settings_live.ex:75 +#, elixir-autogen, elixir-format +msgid "Changing..." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:63 +#, elixir-autogen, elixir-format +msgid "Confirm new password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:27 +#: lib/exmr_web/live/user_settings_live.ex:69 +#, elixir-autogen, elixir-format +msgid "Current password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:21 +#, elixir-autogen, elixir-format +msgid "Email" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Email change link is invalid or it has expired." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:89 +#, elixir-autogen, elixir-format +msgid "Email changed successfully." +msgstr "" + +#: lib/exmr_web/components/layouts/root.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Log out" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:10 +#, elixir-autogen, elixir-format +msgid "Manage your account email address and password settings" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:57 +#, elixir-autogen, elixir-format +msgid "New password" +msgstr "" + +#: lib/exmr_web/components/layouts/root.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Settings" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:26 +#, elixir-autogen, elixir-format +msgid "Date" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Description" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:24 +#, elixir-autogen, elixir-format +msgid "Subject" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:13 +#, elixir-autogen, elixir-format +msgid "Use this form to manage exam records in your database." +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:2 +#, elixir-autogen, elixir-format +msgid "Listing Exams" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "Save Exam" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index b6987d9..440865d 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -51,6 +51,7 @@ msgstr "" msgid "Hang in there while we get back on track" msgstr "" +#: lib/exmr_web/live/exam_live/index.ex:32 #: lib/exmr_web/live/exam_live/index.html.heex:12 #, elixir-autogen, elixir-format msgid "New Exam" @@ -111,3 +112,110 @@ msgstr "" #, elixir-autogen, elixir-format msgid "days passed" msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:139 +#, elixir-autogen, elixir-format +msgid "A link to confirm your email change has been sent to the new address." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:9 +#, elixir-autogen, elixir-format +msgid "Account Settings" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:33 +#, elixir-autogen, elixir-format +msgid "Change Email" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:76 +#, elixir-autogen, elixir-format +msgid "Change Password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:32 +#: lib/exmr_web/live/user_settings_live.ex:75 +#, elixir-autogen, elixir-format +msgid "Changing..." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:63 +#, elixir-autogen, elixir-format +msgid "Confirm new password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:27 +#: lib/exmr_web/live/user_settings_live.ex:69 +#, elixir-autogen, elixir-format +msgid "Current password" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:21 +#, elixir-autogen, elixir-format +msgid "Email" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:92 +#, elixir-autogen, elixir-format +msgid "Email change link is invalid or it has expired." +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:89 +#, elixir-autogen, elixir-format +msgid "Email changed successfully." +msgstr "" + +#: lib/exmr_web/components/layouts/root.html.heex:42 +#, elixir-autogen, elixir-format +msgid "Log out" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:10 +#, elixir-autogen, elixir-format +msgid "Manage your account email address and password settings" +msgstr "" + +#: lib/exmr_web/live/user_settings_live.ex:57 +#, elixir-autogen, elixir-format +msgid "New password" +msgstr "" + +#: lib/exmr_web/components/layouts/root.html.heex:33 +#, elixir-autogen, elixir-format +msgid "Settings" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:26 +#, elixir-autogen, elixir-format +msgid "Date" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Description" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:24 +#, elixir-autogen, elixir-format +msgid "Subject" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:13 +#, elixir-autogen, elixir-format +msgid "Use this form to manage exam records in your database." +msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:2 +#, elixir-autogen, elixir-format +msgid "Listing Exams" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +#, elixir-autogen, elixir-format, fuzzy +msgid "Save Exam" +msgstr "" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +#, elixir-autogen, elixir-format +msgid "Saving..." +msgstr "" diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po index 172fa47..41cf9cf 100644 --- a/priv/gettext/ru/LC_MESSAGES/default.po +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -7,19 +7,22 @@ # # Run "mix gettext.extract" to bring this file up to # # date. Leave "msgstr"s empty as changing them here has no # # effect: edit them in PO (.po) files instead. +# Vladimir Rubin , 2024. # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: unnamed project\n" "POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" +"PO-Revision-Date: 2024-12-11 22:16+0200\n" +"Last-Translator: Vladimir Rubin \n" +"Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.4.2\n" +"X-Generator: Gtranslator 47.1\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: lib/exmr_web/controllers/page_html/home.html.heex:51 msgid "A simple, modern, and fast exam management system." @@ -35,7 +38,9 @@ msgstr "Попытка восстановить соединение" #: lib/exmr_web/controllers/page_html/home.html.heex:54 msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" -msgstr "Создано с использованием Phoenix LiveView, Ecto и TailwindCSS в исполнении @vavakado" +msgstr "" +"Создано с использованием Phoenix LiveView, Ecto и TailwindCSS в исполнении " +"@vavakado" #: lib/exmr_web/live/exam_live/index.html.heex:39 msgid "Edit" @@ -53,6 +58,7 @@ msgstr "Экзамены" msgid "Hang in there while we get back on track" msgstr "Держитесь, пока мы не вернемся в строй" +#: lib/exmr_web/live/exam_live/index.ex:32 #: lib/exmr_web/live/exam_live/index.html.heex:12 msgid "New Exam" msgstr "Новый экзамен" @@ -101,3 +107,94 @@ msgstr "дней осталось" #: lib/exmr_web/live/exam_live/index.html.heex:29 msgid "days passed" msgstr "дней прошло" + +#: lib/exmr_web/live/user_settings_live.ex:139 +msgid "A link to confirm your email change has been sent to the new address." +msgstr "" +"На новый адрес отправлена ссылка для подтверждения изменения электронной " +"почты." + +#: lib/exmr_web/live/user_settings_live.ex:9 +msgid "Account Settings" +msgstr "Настройки аккаунта" + +#: lib/exmr_web/live/user_settings_live.ex:33 +msgid "Change Email" +msgstr "Изменить электронную почту" + +#: lib/exmr_web/live/user_settings_live.ex:76 +msgid "Change Password" +msgstr "Изменить пароль" + +#: lib/exmr_web/live/user_settings_live.ex:32 +#: lib/exmr_web/live/user_settings_live.ex:75 +msgid "Changing..." +msgstr "Меняется..." + +#: lib/exmr_web/live/user_settings_live.ex:63 +msgid "Confirm new password" +msgstr "Подтвердите новый пароль" + +#: lib/exmr_web/live/user_settings_live.ex:27 +#: lib/exmr_web/live/user_settings_live.ex:69 +msgid "Current password" +msgstr "Текущий пароль" + +#: lib/exmr_web/live/user_settings_live.ex:21 +msgid "Email" +msgstr "Электронная почта" + +#: lib/exmr_web/live/user_settings_live.ex:92 +msgid "Email change link is invalid or it has expired." +msgstr "" +"Ссылка для изменения электронной почты недействительна или срок ее действия " +"истек." + +#: lib/exmr_web/live/user_settings_live.ex:89 +msgid "Email changed successfully." +msgstr "Электронная почта успешно изменена." + +#: lib/exmr_web/components/layouts/root.html.heex:42 +msgid "Log out" +msgstr "Выйти из системы" + +#: lib/exmr_web/live/user_settings_live.ex:10 +msgid "Manage your account email address and password settings" +msgstr "Управление адресом электронной почты и настройками пароля" + +#: lib/exmr_web/live/user_settings_live.ex:57 +msgid "New password" +msgstr "Новый пароль" + +#: lib/exmr_web/components/layouts/root.html.heex:33 +msgid "Settings" +msgstr "Настройки" + +#: lib/exmr_web/live/exam_live/form_component.ex:26 +msgid "Date" +msgstr "Дата" + +#: lib/exmr_web/live/exam_live/form_component.ex:25 +msgid "Description" +msgstr "Описание" + +#: lib/exmr_web/live/exam_live/form_component.ex:24 +msgid "Subject" +msgstr "Предмет" + +#: lib/exmr_web/live/exam_live/form_component.ex:13 +msgid "Use this form to manage exam records in your database." +msgstr "" +"Используйте эту форму для управления записями экзаменов в вашей базе данных." + +#: lib/exmr_web/live/exam_live/index.html.heex:2 +msgid "Listing Exams" +msgstr "Список Экзаменов" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +msgid "Save Exam" +msgstr "Сохранить экзамен" + +#: lib/exmr_web/live/exam_live/form_component.ex:28 +msgid "Saving..." +msgstr "Сохранение..." From 094b0f03247b61ff29e0bf089ada9bfc540dc5b5 Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Wed, 11 Dec 2024 22:22:40 +0200 Subject: [PATCH 3/6] style: mix format --- lib/exmr_web/components/layouts/root.html.heex | 2 +- lib/exmr_web/live/exam_live/index.html.heex | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/exmr_web/components/layouts/root.html.heex b/lib/exmr_web/components/layouts/root.html.heex index 1d1e3c9..5682470 100644 --- a/lib/exmr_web/components/layouts/root.html.heex +++ b/lib/exmr_web/components/layouts/root.html.heex @@ -39,7 +39,7 @@ method="delete" class="text-[0.8125rem] leading-6 text-zinc-900 font-semibold hover:text-zinc-700 dark:text-zinc-300 dark:hover:text-zinc-100" > - <%= gettext("Log out") %> + <%= gettext("Log out") %> <% else %> diff --git a/lib/exmr_web/live/exam_live/index.html.heex b/lib/exmr_web/live/exam_live/index.html.heex index ab560ea..4201d2e 100644 --- a/lib/exmr_web/live/exam_live/index.html.heex +++ b/lib/exmr_web/live/exam_live/index.html.heex @@ -1,10 +1,14 @@ <.header> <%= gettext("Listing Exams") %>
    - + | - +
    <:actions> <.link patch={~p"/exams/new"}> @@ -27,7 +31,7 @@ 0 -> gettext("Today") 1 -> gettext("Tomorrow") x when x > 1 -> "#{x} #{gettext("days left")}" - x when x < 0 -> "#{x*-1} #{gettext("days passed")}" + x when x < 0 -> "#{x * -1} #{gettext("days passed")}" end %>
    From 7380d3da3c41ed6617b4c3447c4ccd6758adebf8 Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Thu, 12 Dec 2024 18:19:53 +0200 Subject: [PATCH 4/6] trans: switch to ngettext for "n days left" --- lib/exmr_web/live/exam_live/index.html.heex | 27 +++++++------- priv/gettext/default.pot | 40 +++++++++++---------- priv/gettext/en/LC_MESSAGES/default.po | 40 +++++++++++---------- priv/gettext/ru/LC_MESSAGES/default.po | 40 ++++++++++++--------- 4 files changed, 80 insertions(+), 67 deletions(-) diff --git a/lib/exmr_web/live/exam_live/index.html.heex b/lib/exmr_web/live/exam_live/index.html.heex index 4201d2e..6b9b2c7 100644 --- a/lib/exmr_web/live/exam_live/index.html.heex +++ b/lib/exmr_web/live/exam_live/index.html.heex @@ -1,19 +1,19 @@ <.header> - <%= gettext("Listing Exams") %> + {gettext("Listing Exams")}
    |
    <:actions> <.link patch={~p"/exams/new"}> <.button class="dark:bg-sky-300 text-white dark:text-black/80 dark:hover:bg-sky-400"> - <%= gettext("New Exam") %> + {gettext("New Exam")} @@ -22,17 +22,16 @@
    -
    <%= exam.subject %>
    +
    {exam.subject}
    - - <%= exam.date %> | + {exam.date} | - <%= case Date.diff(exam.date, Date.utc_today()) do + {case Date.diff(exam.date, Date.utc_today()) do 0 -> gettext("Today") - 1 -> gettext("Tomorrow") - x when x > 1 -> "#{x} #{gettext("days left")}" - x when x < 0 -> "#{x * -1} #{gettext("days passed")}" - end %> + 1 -> gettext("Tommorow") + x when x > 1 -> ngettext("Tomorrow", "%{count} days left", x) + x when x < 0 -> ngettext("Yesterday", "%{count} days passed", x * -1) + end}
    @@ -41,14 +40,14 @@ phx-value-id={exam.id} class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-3 rounded-md" > - <%= gettext("Edit") %> + {gettext("Edit")}
    diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 767d0d5..53b473c 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -31,7 +31,7 @@ msgstr "" msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:39 +#: lib/exmr_web/live/exam_live/index.html.heex:44 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" @@ -52,12 +52,12 @@ msgid "Hang in there while we get back on track" msgstr "" #: lib/exmr_web/live/exam_live/index.ex:32 -#: lib/exmr_web/live/exam_live/index.html.heex:12 +#: lib/exmr_web/live/exam_live/index.html.heex:16 #, elixir-autogen, elixir-format msgid "New Exam" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:46 +#: lib/exmr_web/live/exam_live/index.html.heex:51 #, elixir-autogen, elixir-format msgid "Remove" msgstr "" @@ -67,12 +67,12 @@ msgstr "" msgid "Something went wrong!" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:7 +#: lib/exmr_web/live/exam_live/index.html.heex:10 #, elixir-autogen, elixir-format msgid "Sort by Date" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:4 +#: lib/exmr_web/live/exam_live/index.html.heex:5 #, elixir-autogen, elixir-format msgid "Sort by Subject" msgstr "" @@ -82,15 +82,17 @@ msgstr "" msgid "Success!" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:26 +#: lib/exmr_web/live/exam_live/index.html.heex:31 #, elixir-autogen, elixir-format msgid "Today" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:27 +#: lib/exmr_web/live/exam_live/index.html.heex:33 #, elixir-autogen, elixir-format msgid "Tomorrow" -msgstr "" +msgid_plural "%{count} days left" +msgstr[0] "" +msgstr[1] "" #: lib/exmr_web/components/core_components.ex:159 #, elixir-autogen, elixir-format @@ -103,16 +105,6 @@ msgstr "" msgid "close" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:28 -#, elixir-autogen, elixir-format -msgid "days left" -msgstr "" - -#: lib/exmr_web/live/exam_live/index.html.heex:29 -#, elixir-autogen, elixir-format -msgid "days passed" -msgstr "" - #: lib/exmr_web/live/user_settings_live.ex:139 #, elixir-autogen, elixir-format msgid "A link to confirm your email change has been sent to the new address." @@ -219,3 +211,15 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Saving..." msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Yesterday" +msgid_plural "%{count} days passed" +msgstr[0] "" +msgstr[1] "" + +#: lib/exmr_web/live/exam_live/index.html.heex:32 +#, elixir-autogen, elixir-format +msgid "Tommorow" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 440865d..ac311cc 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -31,7 +31,7 @@ msgstr "" msgid "Built using Phoenix LiveView, Ecto, and TailwindCSS by @vavakado" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:39 +#: lib/exmr_web/live/exam_live/index.html.heex:44 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" @@ -52,12 +52,12 @@ msgid "Hang in there while we get back on track" msgstr "" #: lib/exmr_web/live/exam_live/index.ex:32 -#: lib/exmr_web/live/exam_live/index.html.heex:12 +#: lib/exmr_web/live/exam_live/index.html.heex:16 #, elixir-autogen, elixir-format msgid "New Exam" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:46 +#: lib/exmr_web/live/exam_live/index.html.heex:51 #, elixir-autogen, elixir-format msgid "Remove" msgstr "" @@ -67,12 +67,12 @@ msgstr "" msgid "Something went wrong!" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:7 +#: lib/exmr_web/live/exam_live/index.html.heex:10 #, elixir-autogen, elixir-format msgid "Sort by Date" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:4 +#: lib/exmr_web/live/exam_live/index.html.heex:5 #, elixir-autogen, elixir-format msgid "Sort by Subject" msgstr "" @@ -82,15 +82,17 @@ msgstr "" msgid "Success!" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:26 +#: lib/exmr_web/live/exam_live/index.html.heex:31 #, elixir-autogen, elixir-format msgid "Today" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:27 +#: lib/exmr_web/live/exam_live/index.html.heex:33 #, elixir-autogen, elixir-format msgid "Tomorrow" -msgstr "" +msgid_plural "%{count} days left" +msgstr[0] "" +msgstr[1] "" #: lib/exmr_web/components/core_components.ex:159 #, elixir-autogen, elixir-format @@ -103,16 +105,6 @@ msgstr "" msgid "close" msgstr "" -#: lib/exmr_web/live/exam_live/index.html.heex:28 -#, elixir-autogen, elixir-format -msgid "days left" -msgstr "" - -#: lib/exmr_web/live/exam_live/index.html.heex:29 -#, elixir-autogen, elixir-format -msgid "days passed" -msgstr "" - #: lib/exmr_web/live/user_settings_live.ex:139 #, elixir-autogen, elixir-format msgid "A link to confirm your email change has been sent to the new address." @@ -219,3 +211,15 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Saving..." msgstr "" + +#: lib/exmr_web/live/exam_live/index.html.heex:34 +#, elixir-autogen, elixir-format +msgid "Yesterday" +msgid_plural "%{count} days passed" +msgstr[0] "" +msgstr[1] "" + +#: lib/exmr_web/live/exam_live/index.html.heex:32 +#, elixir-autogen, elixir-format, fuzzy +msgid "Tommorow" +msgstr "" diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po index 41cf9cf..d79c99d 100644 --- a/priv/gettext/ru/LC_MESSAGES/default.po +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2024-12-11 22:16+0200\n" +"PO-Revision-Date: 2024-12-12 18:19+0200\n" "Last-Translator: Vladimir Rubin \n" "Language-Team: Russian\n" "Language: ru\n" @@ -42,7 +42,7 @@ msgstr "" "Создано с использованием Phoenix LiveView, Ecto и TailwindCSS в исполнении " "@vavakado" -#: lib/exmr_web/live/exam_live/index.html.heex:39 +#: lib/exmr_web/live/exam_live/index.html.heex:44 msgid "Edit" msgstr "Изменить" @@ -59,11 +59,11 @@ msgid "Hang in there while we get back on track" msgstr "Держитесь, пока мы не вернемся в строй" #: lib/exmr_web/live/exam_live/index.ex:32 -#: lib/exmr_web/live/exam_live/index.html.heex:12 +#: lib/exmr_web/live/exam_live/index.html.heex:16 msgid "New Exam" msgstr "Новый экзамен" -#: lib/exmr_web/live/exam_live/index.html.heex:46 +#: lib/exmr_web/live/exam_live/index.html.heex:51 msgid "Remove" msgstr "Удалить" @@ -71,11 +71,11 @@ msgstr "Удалить" msgid "Something went wrong!" msgstr "Что-то пошло не так!" -#: lib/exmr_web/live/exam_live/index.html.heex:7 +#: lib/exmr_web/live/exam_live/index.html.heex:10 msgid "Sort by Date" msgstr "Сортировать по дате" -#: lib/exmr_web/live/exam_live/index.html.heex:4 +#: lib/exmr_web/live/exam_live/index.html.heex:5 msgid "Sort by Subject" msgstr "Сортировать по предмету" @@ -83,13 +83,16 @@ msgstr "Сортировать по предмету" msgid "Success!" msgstr "Успех!" -#: lib/exmr_web/live/exam_live/index.html.heex:26 +#: lib/exmr_web/live/exam_live/index.html.heex:31 msgid "Today" msgstr "Сегодня" -#: lib/exmr_web/live/exam_live/index.html.heex:27 +#: lib/exmr_web/live/exam_live/index.html.heex:33 msgid "Tomorrow" -msgstr "Завтра" +msgid_plural "%{count} days left" +msgstr[0] "%{count} день остался" +msgstr[1] "%{count} дня осталось" +msgstr[2] "%{count} дней осталось" #: lib/exmr_web/components/core_components.ex:159 msgid "We can't find the internet" @@ -100,14 +103,6 @@ msgstr "Мы не можем найти интернет" msgid "close" msgstr "закрыть" -#: lib/exmr_web/live/exam_live/index.html.heex:28 -msgid "days left" -msgstr "дней осталось" - -#: lib/exmr_web/live/exam_live/index.html.heex:29 -msgid "days passed" -msgstr "дней прошло" - #: lib/exmr_web/live/user_settings_live.ex:139 msgid "A link to confirm your email change has been sent to the new address." msgstr "" @@ -198,3 +193,14 @@ msgstr "Сохранить экзамен" #: lib/exmr_web/live/exam_live/form_component.ex:28 msgid "Saving..." msgstr "Сохранение..." + +#: lib/exmr_web/live/exam_live/index.html.heex:34 +msgid "Yesterday" +msgid_plural "%{count} days passed" +msgstr[0] "%{count} день прошёл" +msgstr[1] "%{count} дня прошло" +msgstr[2] "%{count} дней прошло" + +#: lib/exmr_web/live/exam_live/index.html.heex:32 +msgid "Tommorow" +msgstr "Завтра" From f7f0ebbb25dc58aa28fbe173e3a2defc3d59dc8a Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Thu, 12 Dec 2024 18:52:07 +0200 Subject: [PATCH 5/6] trans: errors.po --- priv/gettext/ru/LC_MESSAGES/errors.po | 113 ++++++++++++++------------ 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/priv/gettext/ru/LC_MESSAGES/errors.po b/priv/gettext/ru/LC_MESSAGES/errors.po index 66e9a13..3a15de9 100644 --- a/priv/gettext/ru/LC_MESSAGES/errors.po +++ b/priv/gettext/ru/LC_MESSAGES/errors.po @@ -1,111 +1,122 @@ -## "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"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. +# Vladimir Rubin , 2024. +# msgid "" msgstr "" "Language: ru\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100 != 11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10||n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"MIME-Version: 1.0\n" +"Project-Id-Version: unnamed project\n" +"Last-Translator: Vladimir Rubin \n" +"Language-Team: Russian\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2024-12-12 18:52+0200\n" +"X-Generator: Gtranslator 47.1\n" msgid "can't be blank" -msgstr "" +msgstr "не может быть пустым" msgid "has already been taken" -msgstr "" +msgstr "уже забрали" msgid "is invalid" -msgstr "" +msgstr "недействителен" msgid "must be accepted" -msgstr "" +msgstr "должен быть принят" msgid "has invalid format" -msgstr "" +msgstr "имеет неправильный формат" msgid "has an invalid entry" -msgstr "" +msgstr "имеет недопустимую запись" msgid "is reserved" -msgstr "" +msgstr "зарезервирован" msgid "does not match confirmation" -msgstr "" +msgstr "не соответствует подтверждению" msgid "is still associated with this entry" -msgstr "" +msgstr "по-прежнему связана с этой записью" msgid "are still associated with this entry" -msgstr "" +msgstr "по-прежнему связаны с этой записью" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен иметь %{count} элементов" +msgstr[1] "должен иметь %{count} элемента" +msgstr[2] "должен иметь %{count} элементов" msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должен быть %{count} символов" +msgstr[1] "должен быть %{count} символа" +msgstr[2] "должен быть %{count} символов" msgid "should be %{count} byte(s)" msgid_plural "should be %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть %{count} байт" +msgstr[1] "должно быть %{count} байта" +msgstr[2] "должно быть %{count} байтов" msgid "should have at least %{count} item(s)" msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть не менее %{count} элементов" +msgstr[1] "должно быть не менее %{count} элемента" +msgstr[2] "должно быть не менее %{count} элементов" msgid "should be at least %{count} character(s)" msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть не менее %{count} символов" +msgstr[1] "должно быть не менее %{count} символа" +msgstr[2] "должно быть не менее %{count} символов" msgid "should be at least %{count} byte(s)" msgid_plural "should be at least %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть хотя бы %{count} байт" +msgstr[1] "должно быть хотя бы %{count} байта" +msgstr[2] "должно быть хотя бы %{count} байтов" msgid "should have at most %{count} item(s)" msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно содержать не более %{count} элементов" +msgstr[1] "должно содержать не более %{count} элементов" +msgstr[2] "должно содержать не более %{count} элементов" msgid "should be at most %{count} character(s)" msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть не более %{count} символа(ов)" +msgstr[1] "должно быть не более %{count} символа(ов)" +msgstr[2] "должно быть не более %{count} символа(ов)" msgid "should be at most %{count} byte(s)" msgid_plural "should be at most %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "должно быть не более %{count} байт(ов)." +msgstr[1] "должно быть не более %{count} байт(ов)." +msgstr[2] "должно быть не более %{count} байт(ов)." msgid "must be less than %{number}" -msgstr "" +msgstr "должно быть меньше, чем %{number}" msgid "must be greater than %{number}" -msgstr "" +msgstr "должно быть больше, чем %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "должно быть меньше или равно %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "должно быть больше или равно %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "должно быть равно %{number}" From 65308f8bdaea968f2b6a4de510d467b4ff5794ca Mon Sep 17 00:00:00 2001 From: Vladimir Rubin Date: Thu, 12 Dec 2024 18:52:36 +0200 Subject: [PATCH 6/6] style: mix format --- lib/exmr_web/components/core_components.ex | 60 +++++++++---------- lib/exmr_web/components/layouts/app.html.heex | 4 +- .../components/layouts/root.html.heex | 10 ++-- .../controllers/page_html/home.html.heex | 8 +-- lib/exmr_web/live/exam_live/form_component.ex | 6 +- lib/exmr_web/live/exam_live/show.html.heex | 8 +-- lib/exmr_web/live/user_settings_live.ex | 8 +-- 7 files changed, 52 insertions(+), 52 deletions(-) diff --git a/lib/exmr_web/components/core_components.ex b/lib/exmr_web/components/core_components.ex index b55293d..8640e92 100644 --- a/lib/exmr_web/components/core_components.ex +++ b/lib/exmr_web/components/core_components.ex @@ -83,7 +83,7 @@ defmodule ExmrWeb.CoreComponents do
    - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)}
    @@ -128,9 +128,9 @@ defmodule ExmrWeb.CoreComponents do

    <.icon :if={@kind == :info} name="hero-information-circle-mini" class="h-4 w-4" /> <.icon :if={@kind == :error} name="hero-exclamation-circle-mini" class="h-4 w-4" /> - <%= @title %> + {@title}

    -

    <%= msg %>

    +

    {msg}

    @@ -161,7 +161,7 @@ defmodule ExmrWeb.CoreComponents do phx-connected={hide("#client-error")} hidden > - <%= gettext("Attempting to reconnect") %> + {gettext("Attempting to reconnect")} <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" /> @@ -173,7 +173,7 @@ defmodule ExmrWeb.CoreComponents do phx-connected={hide("#server-error")} hidden > - <%= gettext("Hang in there while we get back on track") %> + {gettext("Hang in there while we get back on track")} <.icon name="hero-arrow-path" class="ml-1 h-3 w-3 animate-spin" /> @@ -207,12 +207,12 @@ defmodule ExmrWeb.CoreComponents do ~H""" <.form :let={f} for={@for} as={@as} {@rest}>
    - <%= render_slot(@inner_block, f) %> + {render_slot(@inner_block, f)}
    - <%= render_slot(action, f) %> + {render_slot(action, f)}
    @@ -244,7 +244,7 @@ defmodule ExmrWeb.CoreComponents do ]} {@rest} > - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)} """ end @@ -328,9 +328,9 @@ defmodule ExmrWeb.CoreComponents do class="rounded border-zinc-300 text-zinc-900 focus:ring-0" {@rest} /> - <%= @label %> + {@label} - <.error :for={msg <- @errors}><%= msg %> + <.error :for={msg <- @errors}>{msg} """ end @@ -338,7 +338,7 @@ defmodule ExmrWeb.CoreComponents do def input(%{type: "select"} = assigns) do ~H"""
    - <.label for={@id}><%= @label %> + <.label for={@id}>{@label} - <.error :for={msg <- @errors}><%= msg %> + <.error :for={msg <- @errors}>{msg}
    """ end @@ -357,7 +357,7 @@ defmodule ExmrWeb.CoreComponents do def input(%{type: "textarea"} = assigns) do ~H"""
    - <.label for={@id}><%= @label %> + <.label for={@id}>{@label} - <.error :for={msg <- @errors}><%= msg %> + <.error :for={msg <- @errors}>{msg}
    """ end @@ -377,7 +377,7 @@ defmodule ExmrWeb.CoreComponents do def input(assigns) do ~H"""
    - <.label for={@id}><%= @label %> + <.label for={@id}>{@label} - <.error :for={msg <- @errors}><%= msg %> + <.error :for={msg <- @errors}>{msg}
    """ end @@ -404,7 +404,7 @@ defmodule ExmrWeb.CoreComponents do def label(assigns) do ~H""" """ end @@ -418,7 +418,7 @@ defmodule ExmrWeb.CoreComponents do ~H"""

    <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)}

    """ end @@ -437,13 +437,13 @@ defmodule ExmrWeb.CoreComponents do

    - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)}

    - <%= render_slot(@subtitle) %> + {render_slot(@subtitle)}

    -
    <%= render_slot(@actions) %>
    +
    {render_slot(@actions)}
    """ end @@ -484,9 +484,9 @@ defmodule ExmrWeb.CoreComponents do - + @@ -504,7 +504,7 @@ defmodule ExmrWeb.CoreComponents do
    - <%= render_slot(col, @row_item.(row)) %> + {render_slot(col, @row_item.(row))}
    @@ -515,7 +515,7 @@ defmodule ExmrWeb.CoreComponents do :for={action <- @action} class="relative ml-4 font-semibold leading-6 text-zinc-900 hover:text-zinc-700" > - <%= render_slot(action, @row_item.(row)) %> + {render_slot(action, @row_item.(row))} @@ -545,8 +545,8 @@ defmodule ExmrWeb.CoreComponents do
    -
    <%= item.title %>
    -
    <%= render_slot(item) %>
    +
    {item.title}
    +
    {render_slot(item)}
    @@ -571,7 +571,7 @@ defmodule ExmrWeb.CoreComponents do class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700" > <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> - <%= render_slot(@inner_block) %> + {render_slot(@inner_block)} """ diff --git a/lib/exmr_web/components/layouts/app.html.heex b/lib/exmr_web/components/layouts/app.html.heex index 9b83af0..07b1b9d 100644 --- a/lib/exmr_web/components/layouts/app.html.heex +++ b/lib/exmr_web/components/layouts/app.html.heex @@ -5,7 +5,7 @@

    - v<%= Application.spec(:exmr, :vsn) %> + v{Application.spec(:exmr, :vsn)}

    @@ -13,6 +13,6 @@
    <.flash_group flash={@flash} /> - <%= @inner_content %> + {@inner_content}
    diff --git a/lib/exmr_web/components/layouts/root.html.heex b/lib/exmr_web/components/layouts/root.html.heex index 5682470..41529b3 100644 --- a/lib/exmr_web/components/layouts/root.html.heex +++ b/lib/exmr_web/components/layouts/root.html.heex @@ -5,7 +5,7 @@ <.live_title suffix=" · Phoenix Framework"> - <%= assigns[:page_title] || "Exmr" %> + {assigns[:page_title] || "Exmr"}
    <%= col[:label] %>{col[:label]} - <%= gettext("Actions") %> + {gettext("Actions")}