چگونه گزارشی خودکار از داده‌ها، به چند زبان‌ مختلف ایجاد کنیم؟

شکل ۱: زبان‌های مختلف
شکل ۱: زبان‌های مختلف


منتشر‌شده در towardsdatascience به تاریخ ۱۲ مارس ۲۰۲۱
لینک منبع How to create automatic data report in multiple languages

گاهی اوقات به عنوان یک محقق داده، کار شما ممکن است این باشد که گزارشی تهیه کنید که بتوانید به ذینفعان ایمیل بزنید و یا از طریق اینترانت آن را به اشتراک بگذارید. اسناد ممکن است کمی قدیمی به نظر برسند، اما هنوز مواردی وجود دارد که استفاده از آن‌ها کوتاه‌ترین مسیر برای رسیدن به این هدف است. هر زمان که اتوماسیون مورد بحث قرار می‌گیرد، پایتون یک ابزار انتخاب است. ایجاد یک گزارش خودکار با استفاده از آن یک مهارت نسبتا استاندارد برای یک دانشمند داده است.

اما همه چیز جالب و سرگرم‌کننده است تا زمانی که زبان‌های دیگر ظاهر شوند.

در تئوری، تهیه نسخه زبانی دیگر پیچیده به نظر نمی‌رسد. به هر حال، ترجمه برچسب‌ها و توصیفات فردی به زبان دیگر و سپس هارد کد کردن آن‌ها در نسخه بعدی سند کافی است. در عمل، این رویکرد ساده زمان‌بر و مستعد خطا است، به خصوص زمانی که نیاز ثابتی به اصلاح برخی پیام‌ها وجود دارد. لازم به ذکر نیست که کار کردن با مترجمان غیر‌فنی با استفاده از این روش مشکل است.

این مقاله نشان می‌دهد که چگونه با ترجمه گزارش داده ایجاد شده توسط پایتون با استفاده از Gettext و Localazy در وقت صرفه‌جویی کنیم. من به شما نشان خواهم داد که چگونه پیام‌ها را از کد منبع (Gettext) استخراج کنید، آن‌ها را در فایل‌های جداگانه ذخیره کنید و چگونه آن‌ها را در یک ابزار ترجمه مشترک در دسترس قرار دهید (Localazy). همچنین یاد خواهید گرفت که چطور با مشکلات در ترجمه رشته‌های f مقابله کنید. چرا؟

تصور کنید که شما در تیم تحلیل در یک شرکت بین‌المللی کار می‌کنید که سه شعبه در کشورهای مختلف دارد (انگلستان، آلمان، لهستان). شما یک گزارش توصیفی جالب ایجاد کرده‌اید، که نتایج آن می‌تواند به طور قابل‌توجهی عملکرد هر شاخه را بهبود بخشد.

شکل ۲. نقشه جهان
شکل ۲. نقشه جهان

شکل ۳. این گزارش در قالب docx برای توزیع آسان ایمیل ایجاد شده است. شما می‌خواهید به وسیع‌ترین مخاطب ممکن برسد، اما شرکت شما منحصرا به زبان انگلیسی کار نمی‌کند.
شکل ۳. این گزارش در قالب docx برای توزیع آسان ایمیل ایجاد شده است. شما می‌خواهید به وسیع‌ترین مخاطب ممکن برسد، اما شرکت شما منحصرا به زبان انگلیسی کار نمی‌کند.

از آنجا که گزارش شما به صورت خودکار هر روز تولید می‌شود، هر بار ترجمه آن به صورت دستی به زبان‌های ملی امکان‌پذیر نیست. اما اگر شما می‌توانید نسل گزارش را خودکار کنید، چرا همین کار را با ترجمه انجام ندهید؟

مطالعه مقاله آیا هوش مصنوعی می‌تواند احساسات داشته باشد؟ توصیه می‌شود.

شروع پروژه

در ابتدا، پروژه شما یک فایل با سند اصلی و پایگاه‌داده به فرمت CSV است. کدنوشته کاملا خود-تبیینی است. با استفاده از داده‌های بارگذاری شده از فایل CSV، آمارهای مختلف را محاسبه می‌کند، یک نمودار میله‌ای ایجاد می‌کند و همه چیز را در یک سندWord بسته‌بندی می‌کند. استفاده از سند ساده است.

شکل ۴. فرمت‌ها
شکل ۴. فرمت‌ها

تنها کاری که باید انجام دهید این است که شهر و تاریخ آن را مشخص کنید.

شکل ۵. کدها
شکل ۵. کدها

نکته: هدف این پروژه آموزش بومی‌سازی برنامه‌های کاربردی پایتون است، بنابراین من جنبه‌هایی مانند معتبر‌سازی متغیرهای ورودی یا جالب بودن را نادیده می‌گیرم. شاید بتوانیم پیام‌ها را به زبان‌های دیگر ترجمه کنیم و از «if» بیانیه‌ها برای تغییر آن‌ها با توجه به خواست کاربر استفاده کنیم، اما این رویکرد خسته‌کننده و مستعد خطا خواهد بود.

ابزار Gettext

در اصل GNU gettext یک مجموعه جهانی از ابزارها برای تولید پیام‌های چندزبانه است. چارچوبی را برای پشتیبانی از رشته‌های پیام ترجمه‌شده فراهم می‌کند. این زبان از بسیاری از زبان‌های برنامه‌نویسی، از جمله پایتون، پشتیبانی می‌کند. ماژول gettext با کتابخانه استاندارد پایتون ارسال می‌شود. بهترین چیز در مورد gettext این است که به ما کمک خواهد کرد تا پیام‌های متنی را به صورت یکپارچه در فایل‌های جداگانه استخراج کنیم.

همانطور که گزارش ما برای داده‌های لندن، ورشو و برلین آماده می‌شود، ما نسخه‌های زبان انگلیسی، لهستانی و آلمانی را آماده خواهیم کرد. ابتدا باید ساختار دایرکتوری را آماده کنیم.

mkdir -p locales/{de,pl}/LC_MESSAGES

سپس، ما باید پیام‌ها را از کد استخراج کنیم.

xgettext -d base -o locales/base.pot

یا به عبارت دیگر:

/Library/Frameworks/Python.framework/Versions/3.8/share/doc/python3.8/examples/Tools/i18n/pygettext.py -d base -o locales/base.pot report.py

برای پیدا کردن فایل pygettext.py می‌توانید از دستور زیر استفاده کنید: pygettext.py و آن را را پیدا کنید.

نکته: استفاده از دستور انتقال متن ساده شما را مجبور خواهد کرد تا فایل نتیجه را با اضافه کردن سرصفحه نویسهSET تغییر دهید. “Content-Type: text/plain; charset=UTF-8\n”

که در پوشه موضعی یک فایلbase.pot با رشته‌های گرفته‌شده از فایل report.py گزارش ایجاد می‌کند.

متاسفانه، همانطور که می‌توانید ببینید، base.pot تولید شده هیچ رشته‌ای ندارد. برای رفع این مشکل، باید report.py را با علامت‌گذاری پیام‌ها برای ترجمه تغییر دهیم.

پس از تولید دوباره base.pot، دو رشته در آن ظاهر می‌شوند.

بعد از این پاراگراف، پروژه باید به این شکل باشد:

https://github.com/fischarbach/python_allization_toorial/tree/۰۰۲-gettext

از این منبع استفاده کنید: https://github.com/fischarbach/python_zation_tutorial

شکل ۶. تغییر شاخه‌ها
شکل ۶. تغییر شاخه‌ها

شاخه‌ها حاوی مراحل زیر هستند که در این مقاله مورد بحث قرار گرفته‌اند.

شاید به مطالعه مقاله آیا openSUSE برای اینکه CentOS جدید باشد آماده است؟ علاقمند باشید.

اولین ترجمه‌ها

اکنون اجازه دهید اولین ترجمه‌ها را آماده کنیم. نسخه‌برداری و تغییر نام base.pot در هر پوشه زبانی:

cp locales/base.pot locales/de/LC_MESSAGES/base.pocp locales/base.pot locales/pl/LC_MESSAGES/base.po

بیایید تک‌تک فایل‌های زبان را اصلاح کنیم:

برای استفاده از ترجمه در برنامه ما، ما نیاز به تولید فایل‌های MO داریم. فایل‌های MO فایل‌های داده باینری هستند که توسط ماژول متنی پوتون گتون تجزیه می‌شوند و در برنامه استفاده می‌شوند.

msgfmt -o locales/de/LC_MESSAGES/base.mo locales/de/LC_MESSAGES/basemsgfmt -o locales/pl/LC_MESSAGES/base.mo locales/pl/LC_MESSAGES/base

حالا می‌توانیم سند را برای تولید گزارش‌ها به زبان‌های مختلف تغییر دهیم. از این به بعد، ما همچنین تابع ترجمه مناسب را به تابع تولید-گزارش منتقل خواهیم کرد. بیایید آزمایش کنیم:

python3 report.py sales.csv Warsaw 2019-01-04 pl

شکل ۷. نتیجه
شکل ۷. نتیجه

جمله در پاراگراف میانی جایگزین شده است! اگر آخرین پارامتر را به de تغییر دهیم، یک نسخه به زبان آلمانی به دست می‌آوریم.

شکل ۸. نتیجه
شکل ۸. نتیجه

یک جمله در این گزارش ترجمه شد، زمان استراحت است. روند کار مشابه است. هر بار که یک رشته با یک پیام در کد منبع ظاهر می‌شود، آن را با تابع احاطه می‌کند _(‘This is a string’) پس از انجام این کار، فایل POT را از ابتدا ایجاد کنید، آن را در محل هر زبان کپی کنید، آن را ترجمه کنید و فایل‌های باینری را ایجاد کنید.

اما قرار بود راحت‌تر باشد.

بنابراین در تکرار بعدی راه‌حل خود، دو کدنوشته کمکی ایجاد می‌کنیم (تولید _ po.sh و تولید _ mo.sh). شما در اینجا همه تغییرات را دارید:

https://github.com/fischerbach/python_localization_tutorial/tree/004-gettext-generators

بیایید یکی از فایل‌های زبانی را بررسی کنیم:

https://github.com/fischarbach/python_allization_toorial/blb/۰۰۴-gettext-reits/oles/pl/LC_MouAGES/base.

همانطور که می‌بینید، حتی یک گزارش نسبتا ساده می‌تواند منجر به تعداد نسبتا قابل‌توجهی از برچسب‌ها برای ترجمه شود. علاوه بر این، با هر تغییر، ما باید مراقب ادغام تغییرات با استفاده از ادغام چند لایه باشیم. اما ما از یک چیز بهتر استفاده خواهیم کرد.

نرم‌افزار Localazy

ابزار Localazy نرم‌افزار فوق‌العاده‌ای است که باعث می‌شود این تجربه ترجمه وحشتناک، قابل‌تحمل و حتی تقریبا لذت‌بخش باشد. از بسیاری از چارچوب‌ها و فرمت‌های فایل پشتیبانی می‌کند و ابزارهای CLI را برای ساخت اتوماسیون فراهم می‌کند. ویژگی‌های مورد علاقه من امکان ترجمه تعاونی و مدیریت خودکار تغییرات در فایل‌های ترجمه‌شده است.

پس بیایید گزارش خود را باLocalazy ادغام کنیم. اول، یک حسابLocalazy ایجاد کرده و CLI Localazy را نصب کنید. سپس، یک برنامه کاربردی جدید ایجاد کنید.

شکل ۹. ادغام با لوکالازی
شکل ۹. ادغام با لوکالازی


شکل ۱۰. اپ جدید
شکل ۱۰. اپ جدید

اطمینان حاصل کنید که برنامه کاربردی نوع را بر روی برنامه کاربردی خصوصی تنظیم کنید. اگر برنامه شما حاوی داده‌های حساس نباشد، می‌توانید با خیال راحت آن را به صورت عمومی بگذارید. با این حال، بنا به دلایلی که در بخش آخر «مشکل رشته‌های f» این مقاله توضیح داده شد، آن را برای بخش خصوصی تنظیم خواهیم کرد. سپس، فایل‌های POT را از فرمت های فایل موجود انتخاب کنید.

شکل ۱۱. فرمت‌ها
شکل ۱۱. فرمت‌ها

شما یک فایل پیکره‌بندی الگو به صورت موضعی localazy.json را خواهید دید. آن را در پوشه اصلی پروژه کپی کنید.

شکل ۱۲. آپلود رشته‌ها
شکل ۱۲. آپلود رشته‌ها

به یاد داشته باشید که مسیر پوشه موضعی را تغییر دهید. به برنامه خود در Localazy بروید و چند زبان جدید اضافه کنید.

شکل ۱۳. لوکالازی
شکل ۱۳. لوکالازی

حالا می‌توانید دوباره فایل‌هایPO را ایجاد کرده و آن‌ها را درLocalazy بارگذاری کنید:

bash generate_po.shlocalazy upload

شکل ۱۴. کدها
شکل ۱۴. کدها

بعد از مدتی، شما لیستی از عبارات را خواهید دید که به هر زبان برنامه شما ترجمه می‌شوند.

شکل ۱۵. لیست شما
شکل ۱۵. لیست شما

و نکته مهم در بالا، ترجمه ماشینی هر جمله است.

شکل ۱۶. ترجمه ماشینی
شکل ۱۶. ترجمه ماشینی

هنگامی که تمام ترجمه‌ها پذیرفته یا ایجاد شدند، می‌توانید آن‌ها را در برنامه خود دانلود کرده و فایل‌های MO باینری را دوباره ایجاد کنید:

localazy downloadbash generate_mo.sh

شکل ۱۷. کدها
شکل ۱۷. کدها

بیایید این گزارش را به زبان لهستانی بررسی کنیم:

شکل ۱۸. بررسی زبان لهستانی
شکل ۱۸. بررسی زبان لهستانی

به عنوان کسی که کمی با زبان لهستانی آشنایی دارد، باید بگویم که کاملا قابل‌قبول است. در نهایت، بیایید به یک مساله دیگر بپردازیم.

مشکل f-string‌ها

این پروژه از رشته‌های f به طور گسترده استفاده می‌کند. متاسفانه، ما نمی‌توانیم از آن‌ها به عنوان آرگومان تابع _ () استفاده کنیم، گیرنده یک خطا را باز می‌گرداند. این مشکل را می‌توان با تغییر رشته‌های f به a حل کرد. قالب () عبارت یا الحاق رشته. اما من رشته‌های f را دوست دارم و تولید گزارش‌های متنی در مدل‌های موردی برای استفاده نیاز هستند.

ما فقط رشته f را در تابعی که آن را ارزیابی می‌کند، پنهان می‌کنیم. به همین دلیل است که ما این برنامه را به صورت خصوصی در Localazy پیاده کردیم تا کد فیلتر نشده را از کاربران اجرا نکنیم.

شکل ۱۹. لوکالازی ژلیسهولدرها را در کروشه می‌گذارد.
شکل ۱۹. لوکالازی ژلیسهولدرها را در کروشه می‌گذارد.

محدودیت دیگر این است که هر بار که می‌خواهید عبارت داخل رشته را تغییر دهید، باید آن را به‌روزرسانی کنید. با این حال، به لطف Localazy، این کار بدون زحمت است.

نتیجه‌گیری

همانطور که می‌بینید، دوگانگی Gettext و Localazy یک راه‌حل انعطاف‌پذیر برای مسائل مکان‌یابی است. هر کدام به منابع مختلف حجم کار می‌پردازند و یکدیگر را به طرز شگفت انگیزی تکمیل می‌کنند.

مساله رشته f باید حل شود، به خصوص در زمینه ترجمه‌های اجتماعی. همچنین ارزش در نظر گرفتن این را دارد که با برچسب‌هایی که در مجموعه داده ظاهر می‌شوند چه کار باید کرد.

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