به نام خدا

خیلی از پروژه های بزرگ لازم دارند که به چندزبان روز دنیا اجرا بشن. به خصوص این موضوع توی آی او اس دیده میشه چون انتشار برنامه ها در اپ استور هست که یه استور جهانیه و با داشتن این فرصت میتونیم تا حد ممکن کاربر جمع کنیم :)

در بحث چندزبانه بودن برنامه دو نکته وجود داره که باید بهش توجه بشه:

  • ترجمه برنامه به زبان جدید
  • هندل کردن لایوت ها برای چپ چین و راست چین بودن برنامه

برای اضافه کردن زبان جدید به برنامه ابتدا وارد پروژتون رو باز کنید و از قسمت Project Navigator روی پروژه کلیک کنید و از منوی سمت چپ در بخش PROJECT روی اسم پروژه کلیک کنید حالا سمت راستتون یه بخش به اسم Localization میبینید

اول تیک این گزینه رو پر کنید

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

بعد از اضافه کردن یه فایل جدید به شما لیستی از فایل های xib و storyboard نشون میده و میگه قصد دارید برای کدومشون طرح دوزبانه بریزید

بعد از کلیک کردن روی دکمه finish به استوری برد هاتون فایل هایی رو اضافه میکنه که فرمتشون .string هست.

توجه کنید که هر ویویی که شما توی اینترفیس بیلدرتون استفاده میکنید دارای یه آیدی به اسم آبجکت آیدی هست که منحصر به فرده (این آیدی رو میتونید از توی Identity Inspector ببینید)

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

 

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

مثلا یه کد میخوایم بنویسیم که وضعیت کاربر رو مشخص کنه (آنلاین یا آفلاین) در این صورت باید یه فایل string بسازیم و هرموقع هم که خواستیم از ویژگی دوزبانه توی کدهامون استفاده کنیم باید حتما استرینگ خودمون رو به این شکل بنویسیم

NSLocalizedString("You Are Offline", comment: "")

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

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

خب بریم فایل استرینگ رو بسازیم.

روی پروژه راست کلیک کنید و بزنید New File از همونجا به دنبال string بگردید بعد از اینکه پیدا کردید و یه اسم بهش دادید، روش کلیک کنید و از منوی سمت راستتون یعنی File Inspector بخش Localization رو پیدا کنید و زبان های دیگه رو اضافه کنید، هر زبانی رو که اضافه نکنید از خود اون کلید استفاده میکنه و جای نگرانی نیست.

 

چجوری زبان برنامه رو از توی خود برنامه با کد تغییر بدیم؟

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

برای این کار ما چند روش داریم

راه اول)

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

extension String {
func localized(_ lang:String) ->String {

    let path = Bundle.main.path(forResource: lang, ofType: "lproj")
    let bundle = Bundle(path: path!)

    return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
}}

و به شکل زیر هم استفاده میشه:

var val = "MY_LOCALIZED_STRING".localized("de")

 

راه دوم)

استفاده از UserDefault که با اینکار ما زبان رو واقعا تغییر میدیم ولی کاربر برای تغییر زبان باید برنامه رو ببنده و از اول مجددا باز کنه:

UserDefaults.standard.set("en", forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

نکته: کد بالا روی توی فایل appDelegate و توی تابع application(_ application, didFinishLaunchingWithOptions launchOptions: قرار بدید

 

راه سوم‌)

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