تبلیغات
تبلیغات

آموزش چند زبانه کردن نرم افزار در برنامه نویسی اندروید

Android MultiLanguage | چندزبانه

آموزش چند زبانه کردن نرم افزار در برنامه نویسی اندروید
حل مشکل کار نکردن در اندرویدهای جدید (25 یا N به بالا)


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

همانطور که می‌دانید، رشته‌ها را بایستی در فایل strings.xml بنویسیم و داخل کد از آن‌ها استفاده کنیم؛ ولی آیا تا به حال پرسیده‌اید چرا؟!
انجام این کار دو مزیت مهم دارد که عبارتند از:

  1. تغییر یک جای مقدار رشته و اعمال شدن آن به کل اپلیکیشن
  2. چندزبانه کردن اپلیکیشن

مراحل انجام کار

1- در مسیر res پروژه‌ی خود، از پوشه‌ی values یک کپی گرفته  و نام آن را به values-fa تغییر دهید.

2- برای نمونه، کد زیر را در Layout اکتیویتی اصلی خود بنویسید:
در اینجا ما یک TextView و Button در اختیار داریم که متن آن‌ها، قرار است از رشته‌های hello و btnChangeLang موجود در values/string.xml تغذیه کند.

3- فایل strings.xml موجود در پوشه‌ی values اصلی را به صورت زیر تکمیل کنید:

4- فایل strings.xml موجود در پوشه‌ی values-fa را هم به صورت زیر تکمیل کنید: (که در واقع، ترجمه‌ی فایل قبلی به فارسی می‌باشد)

5- به کد جاوای اکتیویتی رفته و آن را به صورت زیر تکمیل کنید:

شرح کد:

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


– زبان فعلی را در متغیر currentLang نگه میداریم.


– متد attachBaseContext اکتیویتی را override می‌کنیم. این متد قبل از onCreate و در زمان اختصاص Context اکتیویتی اجرا می‎‌شود! همانطور که می‌بینید، Context پیشفرضی با نام newBase، به داخل آن ارسال شده است؛ سپس ما در این متد، preferences را مقداردهی کرده‌ایم و پس از خواندن زبان فعلی از داخل آن، متد changeLanguage (تغییر زبان) را فراخوانی کرده‌ایم. این متد یک context و زبانی که می‌خواهیم را در ورودی دریافت کرده و یک ContextWrapper برمی‌گرداند که قرار است آن را به داخل متد اصلی super به جای newBase ارسال کنیم تا با زبان فعلی تنظیم شود و سپس onCreate فراخوانی خواهد شد.

توجه
بدیهی است که در اولین اجرا، چیزی در preferences وجود ندارد و باید زبان پیش‌فرض را مشخص کنیم؛ که در بالا این زبان پیش‌فرض فارسی انتخاب شده است؛ اما بهتر است که زبان دستگاه را داخل کد تشخیص داده و از آن به عنوان زبان پیش‌فرض استفاده کنیم. این کار را در ادامه یاد می‌گیریم.

– متد changeLanguage که قرار است خودمان آن را پیاده کنیم، همانطور که گفته شد، context و کد زبان را دریافت کرده و باتوجه به کد زبان، context را تغییر می‌دهد. در این متد:

  • ابتدا Local فعلی را دریافت می‌کنیم! اما از آنجایی که روش دریافت آن در اندروید N به بعد متفاوت است؛ لذا پس از بررسی نسخه‌ی فعلی گوشی، آن را مقداردهی خواهیم کرد.
  • متغیر Resources و سپس Configuration را نیز دریافت می‌کنیم.
  • بررسی می‌کنیم که در صورت خالی نبودن مقدار کد زبان و همسان نبودن کد زبان درخواستی با کد زبان فعلی اپلیکیشن، عملیات تغییر زبان روی context رخ دهد.
  • برای تغییر زبان نیز یک Local جدید از روی کد زبان ساخته و سپس از طریق متد استاتیک کلاس Local، آن را به عنوان local پیشفرض تنیم می‌‌کنیم!
  • برای اندروید N به بالا و پایین، روش تنظیم Local روی Configuration متفاوت است! بنابراین ابتدا بررسی کرده و سپس این کار را انجام می‌دهیم.
  • متد createConfigurationContext که برای ساخت Context جدید از روی تنظیمات داده شده است، در نسخه‌های مختلف نیز متفاوت است. بنابراین پس از بررسی نسخه اندروید دستگاه، این کار را انجام می‌دهیم.
  • در نهایت، ContextWrapperرا از روی Context تغییر یافته ایجاد کرده و به بیرون برمی‌گردانیم.

همچنین با استفاده از یک دکمه در روی صفحه، زبان فعلی را تغییر داده و مقدار جدید را داخل preferences ذخیره می‌کنیم. سپس با استفاده از متد recreate اکتیوتی را به روز می‌کنیم؛ تا نیازی به بستن و اجرای مجدد برنامه نباشد.

گرفتن مقدار زبان فعلی دستگاه

طبیعتا بایستی کاری کنیم که برنامه زبان فعلی دستگاه را تشخیص داده و سپس در صورت وجود آن زبان در لیست زبان‌های فعلی، آن را به عنوان زبان پیشفرض در نظر بگیرید! برای به دست آوردن زبان فعلی دستگاه می‌توان از متد زیر استفاده کرد:

پست‌های مرتبط

کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک‌گذاری اطلاعات در هر زمینه‌ای
برنامه‌نویس فول استک

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده 30 دیدگاه

    1. حمزه کاربر مهمان گفت:

      خیلی عالیی

      فقط یه سئوال :
      چطور می تونیم اسم برنامه رو هم فارسی کنیم یا تغییر بدیم ( منظورم توی لیست نرم افزار ها هستش : جایی که روی برنامه ضربه می زنیم تا باز بشه )

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        مقدار app_name رو از strings.xml تغییر بدین

        1. حمزه کاربر مهمان گفت:

          نه منظورم این نبود دوست عزیز

          برنامه من دو زبانه هستش

          وقتی زبان گوشی انگلیسی هست نام برنامه(همونی که در لیست برنامه های نصب شده نمایش داده میشه) هم مقدار انگلیسی رو انتخاب می کنه و بر عکس

          کاربر می تونه زبان برنامه رو به دلخواه انتخاب کنه و برنامه زبانش عوض میشه اما نام برنامه همچنان مقدارش رو از string ای میگیره که هم زبان با زبان گوشی باشه.

          می خوام فارق از اینکه زبان گوشی انگلیسی یا فارسی هست ، بعد از تغییر زبان برنامه نام برنامه هم عوض بشه .

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            ولی چیزی که نوشته بودین اون منظورو میرسوند 😀

            این کاری که می‌خواین انجام بدین به دلیل این‌که محتوای داخل لانچر از زبان گوشی گرفته می‌شه با این روش امکان پذیر نیست تا جایی که من می‌دونم
            اما به روش دیگه‌ای و از داخل خود برنامه شاید بشه دورش زد… فردا شب پستی در این مورد منتشر می‌کنم و به این پست لینک می‌کنم.

            1. حمزه کاربر مهمان گفت:

              ممنون لطف می کنید

              00
              1. هادی اکبرزاده مدیر سایت گفت:

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

                در صورتی که این روش پیدا شده رو میخواین قرار بدیم اطلاع رسانی کنین

            2. حمزه کاربر مهمان گفت:

              سلام

              بله دوست عزیز

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

              00
              1. هادی اکبرزاده مدیر سایت گفت:

                به انتهای پست لینک شد

    2. عرفان کاربر مهمان گفت:

      سلام میشه با آلریت دیالوگ از دو زبان بیشتر را تغییر داد
      یک دکمه را فشار داده دیالوگ نمایش داده بشه خیلی ضرورت دارم. ممنون

      00
      1. هادی اکبرزاده مدیر سایت گفت:

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

        1. عرفان کاربر مهمان گفت:

          سلام دوست عزیز

          ممنون میشم اگر آموزشش رو بزارید.

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            مجموعه آموزش‌های آلرت دیالوگ تو سایت قرار دادیم که بخش سوم رو هم منتشر کردم
            تو این بخش می‌تونید طریقه‌ی ساخت گزینه‌های انتخاب تو آلرت دیالوگ رو یاد بگیرین
            ساخت گزینه انتخابی در AlertDialog اندروید

            1. عرفان کاربر مهمان گفت:

              ممنون از راهنمایی تون

              00
    3. شهاب الدین کاربر مهمان گفت:

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

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        میتونین یه اکتیویتی پدر بسازین و کدارو برای یه بار توی این اکتیویتی قرار بدین و و بقیه‌ی اکتیویتی‌‎هارو از اون به ارث ببرین.

        1. علی کاربر مهمان گفت:

          سلام. ممنون از آموزش خوبتون .منم به این مورد نیاز دارم. میشه آموزش بدین؟

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            سلام. در اسرع وقت تهیه میشه.

        2. ali کاربر مهمان گفت:

          سلام میتونید یه توضیحی بدید خیلی واجبه برام اگه هم میشه شماره تماس بدم و هزینه را هم پرداخت میکنم

          من الان برنامه در صفجه اصلی زبان تغییر میکنه ولی در بقیه اکتیویتی ها این تغییرات انجام نمیشه

          00
          1. هادی اکبرزاده مدیر سایت گفت:

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

    4. الیاس کاربر مهمان گفت:

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

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ زبان فعلی انتخاب شده توسط کاربر رو توی preferences قرار دادیم و میتونیم قبل ارسال درخواست اون رو بررسی کنیم.
        بهترین کار اینه که شما en, fa و … رو توی preferences و داخل یک رشته نگهدارید و سپس موقع درخواست، مقدار رو در داخل پارامترها به سرور ارسال کنید؛ سرور خودش تشخیص بده و متن مربوط به اون زبان رو برای ما برگردونه.

    5. محمد کاربر مهمان گفت:

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

      00
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام دوست من
        لطفا نمونه‌ای که این مشکل روش پیش میاد رو برامون ارسال کنین تا بررسی کنم.

        1. محمد کاربر مهمان گفت:

          سلام
          وقتی گوشی رو از طریق تنظیمات گوشی روی زبان فارسی قرار می دهیم برنامه بدون مشکل فارسی نمایش داده میشه . اما وقتی گوشی روی انگلیسی هست و می خواهیم به صورت دستی یک اکتیویتی رو فارسی نمایش دهیم اکثر متن ها فارسی نمایش داده نمی شوند . اما باقی المان ها راست چین می شوند .
          از طریق فراخوانی کد زیر در متد on create در اکتیویتی اصلی برنامه .

          00
          1. هادی اکبرزاده مدیر سایت گفت:

            بله درسته تو اندرویدای جدید updateconfiguration با مشکل مواجه میشه چون منسوخ شده!
            تا یکی دو ساعت دیگه مطلب رو به روز می‌کنم.
            سپاس از همراهی

            1. محمد کاربر مهمان گفت:

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

              00
              1. محمد کاربر مهمان گفت:

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

                00
                1. هادی اکبرزاده مدیر سایت گفت:

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

                  1. پوریا کاربر مهمان گفت:

                    میشه آموزش این رو بزارید

                    00
    6. پوریا کاربر مهمان گفت:

      سلام میشه آموزش چند زبانه کردن برنامه اندروید با کلاس helper رو بزارید ؟

      00