همانطور که که میدونید روش تغییر زبان در اپلیکیشن های اندرویدی فرق کرده و روش زیر که قبلا از آن استفاده میشده و در بیشتر سایتها ها هم این روش رو آموزش دادند از طرف گوگل منسوخ شده :
1 |
getBaseContext().getResources().updateConfiguration(configuration,metrix); |
درسته که همچنان میشه از این روش استفاده کرد ولی کم کم این روش در اندروید های جدید کاراییش رو از دست میده و بهتره که همیشه به روز باشید و متد های منسوخ شده استفاده نکنید .
برای تغییر زبان در برنامه نویسی اندروید به صورت زیر عمل میکنیم :
-
تعریف کلاس ContextWrapper :
برای اینکه بتونیم به راحتی در هر اکتیویتی از این کلاس استفاده کنیم این کلاس رو با یک متد استاتیک wrap تعریف میکنیم :
1 2 3 4 5 6 7 8 9 10 11 |
public class ContextWrapper { public static Context wrap(Context context){ SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(context); String lang=sharedPreferences.getString("lang_prefs_name","en"); Locale locale=new Locale(lang); Locale.setDefault(locale); Configuration configuration=context.getResources().getConfiguration(); configuration.setLocale(locale); return context.createConfigurationContext(configuration); } } |
خط چهارم کد بالا یک مقدار از sharedPreferences میخونه که این مقدار زبان تعیین شده توسط ما رو مشخص میکنه . “en” برای زبان انگلیسی و “fa” برای زبان فارسی .پارامتر دوم متد ()sharedPreferences.getString رو برابر “en” گذاشتم که ینی مقدار پیشفرض در صورتی که از قبل چیزی برای sharedPreferences تعیین نکرده باشیم انگلیسی قرار داده بشه . شما برای تعیین زبان دلخواه میتونید از یک ListPreferences استفاده کنید یا هر روش دیگه ای و مقدار “lang_prefs_name” رو در sharedPreferences برابر کد زبان دلخواه خود قرار دهید .
-
استفاده کلاس ContextWrapper :
تا اینجا ما کلاس مورد نظر خودمونو برای تغییر زبان نوشتیم . حالا چطوری باید ازش استفاده کنیم و چطوری زبان برنامه رو عوض کنیم ؟
برای استفاده از این کلاس باید متد
1 |
attachBaseContext(Context base) |
مربوط به هر اکتیویتی رو override کنیم :
1 2 3 4 |
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(ContextWrapper.wrap(base)); } |
این متد رو باید برای هر کدوم از activity هایی که میخواهیم زبانش تغییر پیدا کنه override کنیم . در واقع باید در تمام اکتیویتی ها این کار رو انجام بدیم .
نکته : در خود اندروید هم کلاس ContextWrapper وجود داره و هنگام استفاده از این کلاس دقت کنید که کلاس ContextWrapper مربوط به پکیج خودتونو استفاده کنید یا اینکه میتونید اسم این کلاس رو چیز دیگه ای هم بذارید. |
تا اینجای کار 90 درصد کار انجام شده تنها کاری که مونده اینه که بعد از اینکه مقدار “lang_prefs_name” رو در sharedPreferences تغییر دادیم در واقع زبان رو عوض کردیم باید برنامه رو ریستارت کنیم تا تغییر زبان در همه جای برنامه اعمال بشه:
برای ریستارت کردن برنامه از روشهای مختلفی میشه استفاده کرد که ساده ترینش اینه :
1 2 3 4 5 |
Intent intent=new Intent(getBaseContext(),MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); |
خیلی ساده میشه این مشکل رو متوجه شد که اگر بدون بررسی شرط اکتیویتی ریستارت بشه این فرآیند توی لوپ میفته و هیچوقت متوقف نمیشه.
نمیدونم منظورتون از شرط چیه ولی خیر این اتفاق نمیفته .
سلام.
خیلی ممنون بابت اشتراک کد. وقت زیادی برای پیدا کردن روشی بودم که برنامه فقط به زبان فارسی نمایش داده بشه حتی اگر زبان گوشی انگلیسی باشه. سپاس