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;
}
#endregionKullanı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