Unity Çoklu Dil Sistemi Yapımı

Unity Çoklu Dil Sistemi Yapımı


Unity Çoklu Dil Sistemi Yapımı

 Hepinize merhaba arkadaşlar bu yazımda sizlere Unity ile nasıl çoklu dil sistemi yapabileceğinizden bahsedeceğim. Uygulamalarınızda cihazın diline göre otomatik olarak dil seçimi yapmayı veya kullanıcının yani oyuncunun seçtiği dili gösterme işleminin nasıl yapılacağından bahsedeceğim.


Çalışma Prensibi

İlk olarak sistemin çalışma mantığından bahsetmek istiyorum.

Bu sistem oldukça basit bir çalışma prensibi ile çalışıyor, kelime grupları için sınıflar oluşturuyor ve daha sonrasında oluşturduğumuz dil sistemi sınıfında bu kelime gruplarını çekip sistem diline göre veya oyuncunun seçtiği dile göre kelimelerini yerleştiriyoruz.

Unity sahnesinde bu dosyanın silinmesini engelliyor ve bütün sahnelerde kullandığımız yazıları bu sistem üzerinden çekiyoruz.

Hatta Unity üzerinde dil sistemini attığınız objeye bir etiket (tag) atarsanız bu etiket üzerinden dil sistemine ulaşmanız daha kolay olabilir.


Kodlar

// Kütüphanelerimizi çekiyoruz
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Dil sistemi sınıfımız
public class DilSistemi : MonoBehaviour
{
    #region Değişkenler
    public const int kacDilVar = 2; // İleride kaç dil olduğunu bilmemiz gerekir ise diye böyle bir değişken ekledim
    public KelimelerGirisEkrani kelimelerGirisEkrani = new KelimelerGirisEkrani(); // Aşağıdaki oluşturduğumuz kelime sınıfını public olarak burada çekiyoruz

    #endregion
    #region Sistem Fonksiyonları
    void Awake()
    {
        SistemDilAlgilama(); // Sistem dilini algılamak için olan fonksiyon çağrılıyor
        DilGuncelle(); // Dil güncelle ile seçili olan dil getiriliyor
        DontDestroyOnLoad(this.gameObject); // Objeyi her sahnede tekrar tekrar atmak ile uğraşmak yerine sahne geçişlerinde yok olmasını engelliyoruz
    }
    #endregion
    #region Özel Fonksiyonlar
    public void DilGuncelle()
    {
        /*
        * Seçili dili alıyoruz ve ona göre kelimeleri yerleştirmek için olan fonksiyonu çekiyoruz
         */
        Debug.Log(PlayerPrefs.GetInt("Dil")); // Seçili dili aldık
        if (PlayerPrefs.GetInt("Dil") == 0) // Seçili dil 0 ise 
        {
            Turkce(); // Türkçe olan kelimeleri yerleştirdik
        }
        else if(PlayerPrefs.GetInt("Dil") == 1) // Seçili dil 1 ise 
        {
            Ingilizce(); // İngilizce olan kelimeleri yerleştirdik
        }
    }

    // Tek sefer çalışan sistem dilini algılayan kod parçacığı
    public void SistemDilAlgilama()
    {
        if (PlayerPrefs.GetInt("FTDD") == 0) // FTDD  0 ise dil tespit işlemi yapıyoruz (FTDD benim saçma İngilizce Türkçe kelime karma çabalarımın sonucu doğan First Time Dil Detect in kısaltımı)
        {
            // Switch / Case ile sistem dilini alıyoruz
            switch (Application.systemLanguage) 
            {
                case SystemLanguage.English: // Sistem dili İngilizce ise 
                    PlayerPrefs.SetInt("Dil", 1); // PlayerPrefs "Dil" i 1 e eşitliyoruz, 1 İngilizceyi temsil ediyor
                    PlayerPrefs.SetInt("FTDD", 1); // Sistem dil algılamanın her oyun açıldığında çalışmaması için FTDD yi 1 e eşitliyoruz, eğer bunu yapmazsak oyuncu dili oyun içinden değiştirse bile oyunu kapatıp açtığı zaman oyun sistem diline dönecektir.
                    Debug.Log("İlk zaman dil algılama sistemi çalışıyor.." + "\nAlgılanan dil: " + Application.systemLanguage.ToString()); // Konsola çıktı veriyoruz
                    break;
                case SystemLanguage.Turkish:
                    PlayerPrefs.SetInt("Dil", 0); // Sistem dili Türkçe ise "Dil" i 0 a eşitliyoruz, 0 Türkçeyi temsil ediyor
                    PlayerPrefs.SetInt("FTDD", 1); // Sistem dil algılamanın her oyun açıldığında çalışmaması için FTDD yi 1 e eşitliyoruz, eğer bunu yapmazsak oyuncu dili oyun içinden değiştirse bile oyunu kapatıp açtığı zaman oyun sistem diline dönecektir.
                    Debug.Log("İlk zaman dil algılama sistemi çalışıyor.." + "\nAlgılanan dil: " + Application.systemLanguage.ToString()); // Konsola çıktı veriyoruz
                    break;
                default:
                    PlayerPrefs.SetInt("Dil", 1); // Eğer ki Sistem dili yukarıdakilerden herhangi birine eşit değil ise varsayılan dil olarak İngilizceye ayarlıyoruz
                    PlayerPrefs.SetInt("FTDD", 1); // Sistem dil algılamanın her oyun açıldığında çalışmaması için FTDD yi 1 e eşitliyoruz, eğer bunu yapmazsak oyuncu dili oyun içinden değiştirse bile oyunu kapatıp açtığı zaman oyun sistem diline dönecektir.
                    Debug.Log("İlk zaman dil algılama sistemi çalışıyor.." + "\nAlgılanan dil: " + Application.systemLanguage.ToString()); // Konsola çıktı veriyoruz
                    break;
            }
        }
        else
        {
            Debug.Log("Daha önce otomatik olarak dil algılanmış."); // Daha önce dil sistemi çalıştırılmış ise bu konsol çıktısını veriyoruz
        }
    }
    #endregion
    #region Türkçe Kelimeler
    // Türkçe kelimeleri yerleştiriyoruz
    private void Turkce()
    {
        kelimelerGirisEkrani.girisYap = "Giriş Yap";
        kelimelerGirisEkrani.ePostaAdresiniz = "E-Posta Adresiniz";
        kelimelerGirisEkrani.sifreniz = "Şifreniz";
        kelimelerGirisEkrani.digerGirisSecenekleri = "Diğer Giriş Seçenekleri";
        kelimelerGirisEkrani.hesapOlustur = "Hesap Oluştur";
        kelimelerGirisEkrani.girisYapilirkenSorunileKarsilasildi = "Giriş yapılırken bir sorun ile karşılaşıldı!";
        kelimelerGirisEkrani.hesapOlusturulurkenSorunileKarsilasildi = "Hesap oluşturulurken bir sorun ile karşılaşıldı!";
        kelimelerGirisEkrani.lutfenBosYerBirakmayin = "Lütfen boş alan bırakmayın!";
        kelimelerGirisEkrani.hesapOlusturuldu = "Başarılı bir şekilde hesap oluşturuldu.";
        kelimelerGirisEkrani.girisBasarili = "Başarılı bir şekilde hesaba giriş yapıldı.";        
    }
    #endregion

    #region İngilizce Kelimeler
    // İngilizce kelimeleri yerleştiriyoruz
    private void Ingilizce()
    {
        kelimelerGirisEkrani.girisYap = "Sign in";
        kelimelerGirisEkrani.ePostaAdresiniz = "E-mail";
        kelimelerGirisEkrani.sifreniz = "Password";
        kelimelerGirisEkrani.digerGirisSecenekleri = "Other sign in options";
        kelimelerGirisEkrani.hesapOlustur = "Create Account";
        kelimelerGirisEkrani.girisYapilirkenSorunileKarsilasildi = "Giriş yapılırken bir sorun ile karşılaşıldı!";
        kelimelerGirisEkrani.hesapOlusturulurkenSorunileKarsilasildi = "Hesap oluşturulurken bir sorun ile karşılaşıldı!";
        kelimelerGirisEkrani.lutfenBosYerBirakmayin = "Lütfen boş alan bırakmayın!";
        kelimelerGirisEkrani.hesapOlusturuldu = "Başarılı bir şekilde hesap oluşturuldu.";
        kelimelerGirisEkrani.girisBasarili = "Başarılı bir şekilde hesaba giriş yapıldı.";
    }
    #endregion

}

#region Kelime Temelleri
/*
Kelimelerin birbiri ile karışmaması için ben sahneye göre, veya kullanım alanına göre kelimeleri gruplandırmayı tercih ediyorum.
Bu şekilde sınıflar haline getirdiğimiz zaman bir nevi Java da kod yazar gibi dil sistemini kullanabiliyoruz.
 */
public class KelimelerGirisEkrani
{
    public string girisYap;
    public string ePostaAdresiniz;
    public string sifreniz;
    public string digerGirisSecenekleri;
    public string hesapOlustur;
    public string girisYapilirkenSorunileKarsilasildi;
    public string hesapOlusturulurkenSorunileKarsilasildi;
    public string lutfenBosYerBirakmayin;
    public string hesapOlusturuldu;
    public string girisBasarili;
}
#endregion

Kodlar ile ilgili aslında her şeyi üzerinde açıklamaya çalıştım. Bu yüzden gelelim kullanımına.


Kullanımı

İlk olarak oyunun açıldığı ilk sahnede boş bir obje oluşturuyor ve içine dil sistemini yazdığımız script dosyamızı atıyoruz.

Unity Çoklu Dil Sistemi Yapımı

Şimdi bu objeye diğer scriptlerden erişmek için bir etiket(tag) atamamız gerekiyor.

Unity Çoklu Dil Sistemi Yapımı

Şimdi dil sistemi üzerinde bulunan kelimelere nasıl erişeceğimizi anlamak için yeni bir script oluşturup dil sisteminden kelime çekeceğim.

"DilSistemiKelimeCekme" adında bir c# dosyası oluşturdum ve tekrardan boş bir obje oluşturup içine attım, objeme "DilSistemiKelimeCek" adını verdim.

Unity Çoklu Dil Sistemi Yapımı

Şimdi kod kısmına gelelim.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DilSistemiKelimeCekme : MonoBehaviour
{
    DilSistemi dilSistemi; // Dil sistemini çekmek için değişken tanımlıyoruz
    private void Awake()
    {
        dilSistemi = GameObject.FindGameObjectWithTag("DilSistemi").GetComponent<DilSistemi>(); // Dil sistemini tag ile çekiyoruz
    }
    private void Start()
    {
        Debug.Log(DilSistemi.kacDilVar.ToString()); // Kaç dil olduğunu getirecektir. Burada ufak bir not gireyim kacDilVar const olduğu için atanmış yerden çekilemez.
        KonsolaGirisYapYazdir(); // Bilgisayar dilim ingilizce olduğu için ilk olarak tespit edilen dil İngilizce olduğu için İngilizce yazacaktır, ancak bu ingilizce çıktı dil güncellendikten sonra güncellenen dilde olacaktır.
        DilDegistir(0); // Dili Türkçe olarak ayarlıyoruz (0 Türkçeyi temsil ediyoru)
        KonsolaGirisYapYazdir(); // Artık dil değiştiği için Türkçe olarak çıktı verecektir.
    }

    // Kelimeleri çekmek
    void KonsolaGirisYapYazdir()
    {
        Debug.Log(dilSistemi.kelimelerGirisEkrani.girisYap); // Ekrana giriş yap yazısını bastırdık.
        // Eğer ki başka bir şey yazdırmak isteseydik dilSistemi.+Kelime sınıfı.+Kelime değişkeni
    }

    // Dil değiştirmek
    void DilDegistir(int secilenDil)
    {
        PlayerPrefs.SetInt("Dil", secilenDil); // Fonksiyon çağırıldığı zaman "secilenDil" kısmına sayılar girilerek istenilen dile geçiş yapılabilir.
        dilSistemi.DilGuncelle(); // Dil verilerini güncelledik.
    }
}

Şimdi bu kodların çıktılarına bir bakalım.

Oyun ilk defa açıldığı zaman.


Unity Çoklu Dil Sistemi Yapımı


Oyun dili oyuncu tarafından değiştirildikten ve daha sonraki girişlerde


Unity Çoklu Dil Sistemi Yapımı

Evet arkadaşlar gördüğünüz gibi sistemimiz sorunsuz bir şekilde çalışıyor ve oldukça kolay bir kullanıma sahip. Aklınıza herhangi bir soru takılırsa çekinmeden aşağıdan bana sorabilirsiniz, iyi günler dilerim.

Bu projenin dosyalarına GitHub üzerinden ulaşabilirsiniz.