Android Values Dosyaları – 2 : Çoklu Dil Desteği

Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız/yayınladığımız Android Eğitimleri yazı serimizde bu dersimizde Android Values Dosyaları -2 Çoklu Dil Desteği ile devam ediyoruz.

Uygulamalarımızda birden fazla dil desteği verme ihtiyacımız olabilir. Kendimden örnek verecek olursam 2017 yılında yazdığım bir uygulama, dünyanın 180 ülkesinde kullanılıyor ve 26 farklı dili destekliyordu. İşte bu yazımızda, birden fazla dil deteğini nasıl vereceğimizi anlatacağım.

Her dersimizde olduğu gibi Android Studio üzerinde yeni bir proje oluşturuyoruz.  Projemizde values klasörü altında strings.xml dosyamız default olarak oluşturuluyor. Biz ekleyeceğimiz her bir dil desteği için yeni bir values klasörü oluşturacağız. Bunun için “res” klasörüne sağ tıklayarak New–>Android Resource Directory yolunu takip ediyoruz.
Açılan pencereden “Locale” başlığını seçip, eklemek istediğimiz dili seçiyoruz. Aşağıdaki örnekte English – Any Region seçtik. Eğer farklı lehçeler seçmek isterseydik “Specific Region Only” başlığı altındaki seçeneklerden birisini seçebilirdik. Sonraki ekleyeceğimiz dil seçeneklerini ise, alfabe farklılığından dolayı Rusça ve Arapça olarak belirlemek istedim.

Rusça için:

Arapça için:
Klasörlerimizi oluşturduktan sonra, her bir values klasörümüze sağ tıklayarak, New–>Values Resource File seçeneği ile,  strings.xml dosyalarımızı oluşturuyoruz. Strings.xml dosyalarımızı oluşturduktan sonra “res” klasörümüzün yapısı aşağıdaki gibi olacaktır:

Strings.xml Dosyalarının İçeriği

Burada önemli bir nokta, herhangi bir dil için ek almayan “values” folderımızdaki strings.xml dosyamız, uygulama tarafından default dil olarak seçilecektir. Bu durum her hangi bir sorun durumunda default dilin yüklenmesi için gereklidir.

Strings.xml dosyalarımızı oluşturduktan sonra sıra içeriklerini oluşturmaya geldi. Default strings.xml’de olan her bir string tanımı, mutlaka diğer dil dosyalarının da içerisinde bulunmalıdır. Çeviri işlemlerini yaparken bilmediğiniz diller için Google Translate‘den faydalanabilirsiniz.  Çeviriler yapıldıktan sonra strings.xml dosyaları aşağıdaki gibi olmalıdır:

<resources>
    <string name="app_name">مثال متعدد اللغات</string>
    <string name="hello_world">مرحبا بالعالم</string>
    <string name="title">هذا هو تطبيق نموذج متعدد اللغات</string>
    <string name="selected_laguage">اللغة المختارة: العربية</string>
</resources>
<resources>
    <string name="app_name">Multi Language Example</string>
    <string name="hello_world">Hello World</string>
    <string name="title">This is a Multi-Language Sample Application</string>
    <string name="selected_laguage">Selected Language: English</string>
</resources>
<resources>
    <string name="app_name">Многоязычный пример</string>
    <string name="hello_world">Привет, мир</string>
    <string name="title">Это многоязычный пример приложения</string>
    <string name="selected_laguage">Выбранный язык: русский</string>
</resources>

Önemli nokta: Bu işlemleri yaptıktan sonra, Arapça dilinin ters yazımının desteklenmesi için, manifest dosyamızda “application” tag’ı altına şu satırı ekliyoruz:

android:supportsRtl="true"

AndroidManifest dosyamızın son hali:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.mobilhanem.multilanguageexample">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivityJava">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".MainActivityKotlin">
        </activity>
    </application>

</manifest>

Layout Oluşturulması

String’lerimizi oluşturduğumuza göre, layout dosyamızı düzenleyebiliriz. Dil seçimi için 4 adet buton, mesajları yazmak için de 3 tane textview’ımız olacak.

Layout kodlarımız aşağıdaki gibi:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:gravity="center"

        android:layout_height="match_parent">

        <TextView
            android:text="@string/hello_world"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:id="@+id/textViewHelloWorld"/>
        <TextView
            android:text="@string/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textViewTitle"/>
        <TextView
            android:text="@string/selected_laguage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textViewSelectedLaguage"/>
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <Button
                android:text="Türkçe"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:id="@+id/buttonTurkce"
                android:layout_weight="1"/>
        <Button
                android:text="Englısh"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:id="@+id/buttonEnglish" 
                android:layout_weight="1"/>
        <Button
                android:text="русский"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:id="@+id/buttonRussian" 
                android:layout_weight="1"/>
        <Button
                android:text="الروسية"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" 
                android:id="@+id/buttonArabic" 
                android:layout_weight="1"/>
    </LinearLayout>

</LinearLayout>

Java ve Kotlin’de Kodların Yazılması

Activity’lerimizi de daha önceki derslerimiz gibi java ve kotlin’de ayrı ayrı yazdım. Uygulamanın başlatılması için gerekli activity’i AndroidManifest dosyasından değiştirebilirsiniz.

package com.mobilhanem.multilanguageexample;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.Locale;

public class MainActivityJava  extends AppCompatActivity {

   Button buttonTurkce,buttonEnglish,buttonArabic,buttonRussian;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Locale locale = new Locale(getLocaleSharedPreferances());// shared preferances'a en son hangi dil değerini yazmışsak, uygulamayı o dilde açıyor, uygulama ilk defa açılıyorsa, default olan Türkçe ile açılıyor.
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config,
                getBaseContext().getResources().getDisplayMetrics());



        setContentView(R.layout.activity_main);


        buttonTurkce= (Button)findViewById(R.id.buttonTurkce);

        buttonEnglish= (Button)findViewById(R.id.buttonEnglish);

        buttonArabic= (Button)findViewById(R.id.buttonArabic);

        buttonRussian=(Button)findViewById(R.id.buttonRussian);

        buttonEnglish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                setLocale("en");//ingilizce dili için gerekli parametreyi gönderdik.
            }
        });

        buttonTurkce.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setLocale("");// default olan türkçe seçeneğini seçtik.
            }
        });

        buttonArabic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setLocale("ar");//arapça dili için gerekli parametreyi gönderdik.
            }
        });
        buttonRussian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setLocale("ru");//rusça dili için gerekli parametreyi gönderdik.
            }
        });
    }

    public void setLocale(String selectedLocale)
    {
        Locale locale = new Locale(selectedLocale); //butonlar içerisinden fonksiyonumuz çağırılırken, gönderdiğimiz parametreye göre lokalimizi ayarladık.
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config,
                getBaseContext().getResources().getDisplayMetrics());
        writeLocaleSharedPreferances(selectedLocale);//dil seçimini cihaza kaydedecek fonksiyonu çağırıyoruz.
        finish();//mevcut acivity i bitir.
        startActivity(getIntent());//activity i baştan yükle
        Toast.makeText(getApplicationContext(), R.string.selected_laguage, Toast.LENGTH_LONG).show();
    }

    public  void writeLocaleSharedPreferances(String selectedLocale)
    {
        SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("selectedLocale", selectedLocale);// seçilen dili shared preferances'a yazıyoruz ki, uygulamamız sonraki açılışlarda en son seçilen dil ile açılsın.
        editor.commit();
    }
    public String getLocaleSharedPreferances()
    {
        SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
        String savedString = sharedPref.getString("selectedLocale","");//shared preferances'a yazılan dili getiriyor, eğer uygulama ilk defa açılmışsa, çift tırnak yani default dil değerini döndürüyor
        return savedString;
    }




}
package com.mobilhanem.multilanguageexample

import android.content.Context
import android.content.res.Configuration
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import java.util.*

class MainActivityKotlin : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val locale = Locale(getLocaleSharedPreferances())// shared preferances'a en son hangi dil değerini yazmışsak, uygulamayı o dilde açıyor, uygulama ilk defa açılıyorsa, default olan Türkçe ile açılıyor.
        Locale.setDefault(locale)
        val config = Configuration()
        config.locale = locale
        baseContext.resources.updateConfiguration(config,baseContext.resources.displayMetrics)


        setContentView(R.layout.activity_main)
        val buttonTurkce =  findViewById<Button>(R.id.buttonTurkce)
        val buttonEnglish = findViewById<Button>(R.id.buttonEnglish)
        val buttonArabic = findViewById<Button>(R.id.buttonArabic)
        val buttonRussian = findViewById<Button>(R.id.buttonRussian)


        buttonTurkce.setOnClickListener{ //buton click listener, içerisinden dil değiştirecek fonksiyonumuzu parametre ile çağıracağız
            setLocale("") 
        }
        buttonEnglish.setOnClickListener {//buton click listener, içerisinden dil değiştirecek fonksiyonumuzu parametre ile çağıracağız
            setLocale("en")
        }
        buttonArabic.setOnClickListener {//buton click listener, içerisinden dil değiştirecek fonksiyonumuzu parametre ile çağıracağız
            setLocale("ar")
        }
        buttonRussian.setOnClickListener {//buton click listener, içerisinden dil değiştirecek fonksiyonumuzu parametre ile çağıracağız
            setLocale("ru")
        }


    }

    fun setLocale(selectedLocale: String) {
        val locale =
            Locale(selectedLocale) //butonlar içerisinden fonksiyonumuz çağırılırken, gönderdiğimiz parametreye göre lokalimizi ayarladık.
        Locale.setDefault(locale)
        val config = Configuration()
        config.locale = locale
        baseContext.resources.updateConfiguration(
            config,
            baseContext.resources.displayMetrics
        )
        writeLocaleSharedPreferances(selectedLocale)//dil seçimini cihaza kaydedecek fonksiyonu çağırıyoruz.
        finish()//mevcut acivity i bitir.
        startActivity(intent)//activity i baştan yükle
        Toast.makeText(applicationContext, R.string.selected_laguage, Toast.LENGTH_LONG).show() //seçilen dili toast mesaj olarak yaz
    }


    fun writeLocaleSharedPreferances(selectedLocale: String) {
        val sharedPref = this.getPreferences(Context.MODE_PRIVATE)
        val editor = sharedPref.edit()
        editor.putString("selectedLocale",selectedLocale)// seçilen dili shared preferances'a yazıyoruz ki, uygulamamız sonraki açılışlarda en son seçilen dil ile açılsın.
        editor.commit()
    }


    fun getLocaleSharedPreferances(): String? {
        val sharedPref = this.getPreferences(Context.MODE_PRIVATE)
        return sharedPref.getString("selectedLocale", "")
    }


}

 

Evet arkadaşlar Android Çoklu Dil Desteği‘ni sizlere detaylıca anlatmaya çalıştım. Umarım hepiniz için faydalı olmuştur.

Sıfırdan android dersleri için tıklayınız.

Mobilhanem.com üzerinden anlattığımız android uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir daha ki dersimizde görüşmek dileğiyle..

60

Yakup Yazar

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?