atVSG

0011001000110100

وحید امیری مطلق

توسعه دهنده وب و موبایل

تغییر زبان اپ در زمان اجرا در Xamarin.Android


android-localization_298x244یکی از ویژگی های مثبت اندروید پشتیبانی کامل اون از محلی سازی است. اندروید با توجه به اهمیت پشتیبانی از زبان های مختلف از ابتدا با ویژگی های منحصر به فردی همراه شده. به طور پیش فرض شما باید در تمام قسمت های برنامه ی خودتون و هر جا نیاز به استفاده از یک رشته (string) دارید به جای hard code کردن اون ها، از resource ها استفاده کنید. برای زبان های مختلف فولدر های مختلفی رو در برنامه در نظر بگیرید. خود سیستم عامل در زمان اجرای برنامه با توجه به تنظیمات دستگاه، فایل های زبانی رو load میکنه. مثلا اگر من یک فولدر به نام values و یکی دیگه به نام values-fa داشته باشم، و زبان دستگاه انگلیسی (یا یک زبان دیگر که فولدر خاص اون در برنامه ی من موجود نیست) باشه، اندروید فایل های درون پوشه ی values رو load میکنه. به همین صورت در صورتی که زبان دستگاه فارسی باشه، فایل های درون values-fa لود میشن.

این خیلی خوبه اما شاید گاهی اوقات بخواهید یک اپشن (option) در برنامه داشته باشید که به کاربر اجازه ی تغییر زبان برنامه رو بدون نیاز به تغییر زبان دستگاه بده. چیزی که در سیستم عامل ویندوز (Windows) خیلی استفاده میشه. این کار در اندروید هم امکان پذیر هست.

در اینجا این کار رو در #C و Xamarin.Android انجام میدم. کد مقابل یک method هست که باید یا در یک Activity یا Application Class فراخوانی بشه (به خاطر اینکه به context احتیاج داریم):

public void SetLocale (string lang)
{
	Java.Util.Locale locale = new Java.Util.Locale (lang);
	Java.Util.Locale.Default = locale;
	Android.Content.Res.Configuration config = new Android.Content.Res.Configuration ();
	config.SetLocale (locale);
	this.Resources.UpdateConfiguration (config, null);
}

من ترجیح میدهم اون رو در کلاس Application قرار بدم. بنابراین در متود OnCreate از کلاس Application این متود رو call میکنیم:

using System;
using System.Threading.Tasks;

using Android.Runtime;
using Android.App;
using Android.Content;
using Android.OS;

namespace MyApplication
{
	[Application]
	public class MyApplication : Application
	{
		private string language = "fa";
	
		public MyApplication (IntPtr handle, JniHandleOwnership transfer) : base (handle, transfer)
		{
			//
		}

		public override void OnCreate ()
		{
			this.SetLocale (this.language);
		}
		
		public void SetLocale (string lang)
		{
			Java.Util.Locale locale = new Java.Util.Locale (lang);
			Java.Util.Locale.Default = locale;
			Android.Content.Res.Configuration config = new Android.Content.Res.Configuration ();
			config.SetLocale (locale);
			this.Resources.UpdateConfiguration (config, null);
		}
	}
}

چون از کلاس Application استفاده کردیم، زبان برنامه موقع اجرای اولیه (cold start)، به فارسی تغییر میکنه. به جای فارسی از هر کد دو حرفی locale جاوا میتونید استفاده کنید.

برای استفاده در Activity هم مثل بالا عمل کنید به ولی متود SetLocale رو در Activity قرار بدید.



 برچسب ها: ، ، ، ، ، ، ،

 دیدگاه ها:
سوال یا دیدگاه؟

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