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
Kullanımı
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. } }
2 yorum