بهترین روش جمع آوری کل عبارت و ترجمه آن ها در برنامه های چند زبانه الکسیر

با درود خدمت شما . در برنامه ای که در حال توسعه آن هستم . هر وب سرویس من باید چند فایل به زبان های مختلف داشته باشد به عنوان مثال en, fa, … که حال تجربه من در جوملا به این صورت می باشد که یک فولدر درست می شود به نام lang و در آن هر زبانی باز فولدر خودش را دارد و در این فولدر ممکن هست ۱۰ فایل وجود داشته باشند که همگی برای یک زبان هستند .

مثلا زبان انگلیسی

lang/en/user.ini
lang/en/back_upuser.ini

نمونه :

COM_AJAX="Ajax Interface"
COM_AJAX_XML_DESCRIPTION="An extendable Ajax interface for Joomla."
COM_AJAX_SPECIFY_FORMAT="Please specify a valid response format, other than that of HTML, such as json, raw, debug, etc."

نمونه فراخوانی :

<?php echo JText::_('COM_AJAX'); ?>

خوب حالا شما چه راهی رو پیشنهاد می کنید در الکسیر انجام بدهم و به صورتی درست کنم که یک ماژول شود به راحتی بتوانم فایل های زبانم را مستقل کنم و هرجا نیاز شد فقط با یک خط ساده عبارت مورد نظر را لود کنم و فاکتوری بسیار مهم نیز تو فکرم هست اینکه به شدت سرعت در این بخش برام مهمه .

در آخر ممنون از شما دوستان و اساتید گرامی یافته های خودمم همین پست می زارم که اگر به پاسخی مناسبی برسم برای دوستان تازه واردی مثل بنده به الکسیر نیز کارا باشد

پیوست :

https://hexdocs.pm/gettext/Gettext.html

1 پسندیده

شما خودت Get text نوشتی که کتابخانه اصلی این کاره

1 پسندیده

درود سام عزیز من این آموزش و داکیومنت گت تسکت رو دیدم ولی یکمی گنگه مثلا من می یام ترجمه رو می ریزم مثل این

<h2><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h2>

بعد این می یاد ازش یک فایل درست می کنه ؟

با این دستور

mix gettext.extract

درسته ؟

بعد اومد گفته

msgid "Welcome to %{name}!"
msgstr "Howdy from %{name}!"

بعد از این مورد خودش خودکار می سازه درسته ؟ این گزینه خوب متوجه نشدم msgstr یعنی بخوام در متن اصلی که نوشتم تغییر بدم اونجا می نویسم درسته ؟ یا می خوام از یک متن دو نمونه داشته باشم

حالا برای زبان دیگه باز باید بیام مثلا به این صورت انجام بدم ؟

mix gettext.merge priv/gettext --locale ru

اینجا یک فایل ru می سازه ؟ بعد توی msgstr باید بیام ترجمشو بنویسم ؟

کلا اینجا گیج شدم من در سایت ۳ زبان دارم فارسی انگلیسی و آلمانی . حالا می خوام سه زبان رو کامل بسازم چیکار باید بکنم ؟

ممنونم سام عزیز . از راهنماییت این مشکلم حل بشه فکر کنم این بخش رو می تونم ویدیو هم بکنم.

1 پسندیده

بله برای هر زبان باید یک فولدر اینطوری باشه و تمامه ترجمه ها رو بنویسی

1 پسندیده

درود سام عزیز خوبید شما ؟

آقا من یک مشکلی پیدا کردم نمی تونم حل بکنم من طبق اون آموزش هم رفتم جلو تازه یک پستی هم تو انجمن الکسیر هم زدم متوجه نشدم چی می گه طرف .

مشکل من اینکه هر زمانی که صفحه رو لود می کنم en دیفالت بالا می یاد در صورتی که من می خوام fa دیفالت بیاد بالا ولی نتونستم این مورد رو انجام بدم

سورسم رو هم اینجا قرار دادم

تو کانفیگ هم من اومدم این موارد در آموزش رو قرار دادم


config :multi_lang, MultiLangWeb.Gettext,
    default_locale: "fa"

config :gettext, :default_locale, "fa"

ولی زیاد افاقه نکرد.

با تشکر

سلام
وقتی اینو بگزاری تو کانفیگ درست نمیشه ؟

Gettext.put_locale("fa")

اینجا نوشته باید از default pot استفاده کنی

Extracted priv/gettext/default.pot
1 پسندیده

درود و تشکر ازت سام عزیز , کجای کانفیگ باید بزارم ؟

Gettext.put_locale("fa")

زیر مجموعه کانفیگ گزاشتم که کلا می گفت این فانکشن رو نمی شناسه و اومدم همینجوری گزاشتم که تاثیری نداشت مورد دوم شما رو هنوز تست نکردم . به زودی تستش می کنم

سلام
منظور استفاده از default pot این هست
که وقتی دستور mix gettext.extract زده بشه در برنامه جستجو میکنه و هر جا که رشته ای با تابع gettext استفاده شده اونا رو داخل فایل default.pot قرار میده .
داخل این فایل هم برای هر رشته دو خط وجود داره یکی شامل همون رشته هست که بعنوان کلید در نظر گرفته میشه و دیگری هم رشته ای برای ترجمه هست البته اینجا ترجمه زبان مورد نظر قرار داده نمیشه و باید برای اینکه زبان مورد نظر ایجاد بشه دستور
mix gettext.merge priv/gettext --locale fa
باید زده بشه تا در مسیر prive/gettext/fa فایل default.pot ایجاد بشه حالا میشه داخل این فایل ترجمه فارسی برای رشته مورد رو قرار داد .

طبق این راهنما
https://elixirforum.com/t/how-to-change-default-locale-in-gettext/13695/4

باید زبان برای پروسس عوض بشه اگر توی تنظیمات اعمال نمیشه
من در زمانیکه سرور فونیکس ران بود . دستور

Gettext.get_locale(MultiLangWeb.Gettext)

رو زدم و مقدار “en” رو داد بعد دستور زیر رو زدم

Gettext.put_locale(MultiLangWeb.Gettext, "fa")

دوباره تست کردم با دستور
Gettext.get_locale(MultiLangWeb.Gettext)
چک کردم و مقدار پیشفرض تغییر کرده بود شد
“fa”

ولی وقتی باز صفحه رو لود میکردم مقدار پیشفرض en میشد . حالا این خطوط بالا رو باید در جای مناسب بزارم تا مشکل حل بشه . فقط جاشو نمیدونم :sweat_smile:

1 پسندیده

من یه بررسی کردم . برای استفاده از Gettext.put_locale(“fa”) باید پلاگ رو به صورت سفارشی درست کنیم و توابع init و call رو براش استفاده کنیم ولی بازم مقدار پیشفرض در config.exs ست میشه :thinking:

سلام
من کدهای این کتابخونه رو نگاه کردم و با آزمون و خطا متوجه شدم که اگر http header رو ست نکنیم از کوکی یا کانفیگ زبان پیشفرض رو نمیخونه برای همین یک پلاگ درست کردم تا قبل از ارسال conn به این کتابخونه header رو دست کاری کنم

def call(conn, _params) do
        conn =  conn  |> put_req_header("accept-language", "fa")
        conn
	end

اما سوال اینجاست چرا از کوکی یا کانفیگ نمیخونه در صورتیکه خودش در تابع به این صورت نوشته :thinking:

defp determine_locale(conn, nil, config) do
    get_locale_from_cookie(conn, config)
    || get_locale_from_header(conn, config)
    || config.default_locale
  end
1 پسندیده

اگر با کوکی کار نمیکنه میتونید یک پلاگ تعریف کنید که header بخونه و local
set کنه
default.po اگر فارسی بگذارید هم کار نمیکنه ؟

1 پسندیده