Android Multi Language ( Çoklu Dil )
Uygulama Helper Kullanaılarak Yapılmısdır.
LoceleHelper.java
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import java.util.Locale;
/**
* Helper Sınıfları Yardımcı Sınıflardı</br>
* Default Locale :Locale.getDefault().getLanguage()
*/
public class LocaleHelper {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
static SharedPreferencesManager sharedPreferencesManager;
static Context context;
/**
* LocaleHelper Constructor
* @param context
*/
public LocaleHelper(Context context) {
sharedPreferencesManager=new SharedPreferencesManager(context);
}
/**
* LocaleHelper Context Oluşturma
* @apiNote Bu Method İle MainActivity de override attachBaseContext Kullanarak Bşlangiçda Calısmasını sağlıyoruz
* @param con
* @return
*/
public static Context onAttach(Context con) {
context=con;
sharedPreferencesManager=new SharedPreferencesManager(context);
return getLocale();
}
/**
* LocaleHelper Context Oluşturma
* @apiNote Bu Method İle MainActivity de override attachBaseContext Kullanarak Bşlangiçda Calısmasını sağlıyoruz</br>
* Aynı zamanda defaultLanguage Yeni Dili Seçmek İçin Kullanılıyor
* @param con
* @param defaultLanguage
* @return
*/
public Context onAttach(Context con, String defaultLanguage) {
context=con;
setLocale(defaultLanguage);
return getLocale();
}
/**
* Dil Geri Dönüşü
* @return
*/
public static String getLanguage() {
return sharedPreferencesManager.getLanguage();
}
// Çalışma zamanında dili ayarlama yöntemi
/**
* Yeni Dil Ayarlama
* @param language
*/
public void setLocale(String language) {
sharedPreferencesManager.setLanguage(language);
}
/**
* Dil Ayarını Geri Dönüşle Getiriyor
* @return Context
*/
public static Context getLocale() {
String language=getLanguage();
// Android Nougat'ın üstündeki cihazlar için dilin güncellenmesi
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
return updateResources(language);
// Eski Sürümler İcin Kullanılıyor
return updateResourcesLegacy( language);
}
/**
* Uygulamanın dilini, yerleşik Locale sınıfının bir nesnesini oluşturarak ve </br>
* ona dil argümanını geçirerek güncelleme yöntemi
* @param language
* @return
*/
private static Context updateResources( String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
context.getResources();
return context.createConfigurationContext(configuration);
}
/**
* @deprecated Kullanımdan Kaldırıldı
* Uygulamanın dilini, yerleşik Locale sınıfının bir nesnesini oluşturarak ve </br>
* ona dil argümanını geçirerek güncelleme yöntemi
* @param language
* @return
*/
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
// configuration.locale = locale; Daha Eski Bir Şekilde Kullanılıyor
configuration.setLocale(locale);
configuration.setLayoutDirection(locale);
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
}
// SharedPreferencesManager.java
import android.content.Context;
import android.content.SharedPreferences;
public class SharedPreferencesManager {
// Bunun Yerine context.getPackageName() Kullanabiliriz
private final String LOCALE_PREF = "Locale Preference";
SharedPreferences sharedPref;
SharedPreferences.Editor editor;
Context context;
// Language : Dil Ayarı
String language;
// darkMode : Karanlık Mode Ayarı (System)
boolean systemDarkMode;
// darkMode : Karanlık Mode Ayarı
boolean darkMode;
public SharedPreferencesManager(Context context)
{
this.context= context;
/*
MODE_PRIVATE: Dosya oluşturma modu: varsayılan mod, oluşturulan dosyaya yalnızca çağıran uygulama
(veya aynı kullanıcı kimliğini paylaşan tüm uygulamalar) tarafından erişilebilir.
MODE_WORLD_READABLE: Dosya oluşturma modu: diğer tüm uygulamaların oluşturulan dosyaya okuma
erişimi olmasına izin ver.
MODE_WORLD_WRITEABLE : Dosya oluşturma modu: diğer tüm uygulamaların oluşturulan dosyaya yazma
erişimi olmasına izin ver.
*/
/*
getSharedPreferences(String name, int mode)
name = İstenilen tercihler dosyası.
Kullanılabilir :
context.getPackageName() Package İsmine Denk Geliyor com.example.mysetting
*/
String packageName=context.getPackageName();
sharedPref= context.getSharedPreferences(packageName,Context.MODE_PRIVATE);
editor = sharedPref.edit();
}
public String getLanguage() {
language = sharedPref.getString("language","tr");
return language;
}
public void setLanguage(String language) {
editor.putString("language",language);
// editor.commit();
editor.apply();
this.language = language;
}
}
// .xml Eklenen Spinner
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:entries="@array/reply_entries" />
// Control Sınıfından
Spinner custom_spinner=v.findViewById(R.id.custom_spinner);
SpinnerAdapter adapter= new MySpinnerAdapter(getContext(), settingManager.getLanguageList());
custom_spinner.setAdapter(adapter);
custom_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if(i>0) GetSelectedLanguage(adapterView,i,l);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
// TODO Auto-generated method stub
// GetSelectedLanguage(adapterView,0,0);
}
});
// LanguageSpinnerModel Adapter de Kullanıldığı icin
// code Değeri Alınıyor "en,tr,..."Gibi Kodelar
SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(context);
void GetSelectedLanguage(AdapterView<?> adapterView,int i,long l){
LanguageSpinnerModel model= (LanguageSpinnerModel) adapterView.getItemAtPosition(i);
sharedPreferencesManager.setLanguage(model.getCode());
// Sonra Uygulama Yeniden Başlıyor
Intent intent = new Intent(getContext(), MainActivity.class);
startActivity(intent);
}
MainActivty.java
// En Basından Language Almamız Lazım
// Helper sınıfından Doğrudan Başlatması İçin Kullanıyoruz ilk Çalısan Kod
// Bu Kod İle Uygulama Yükler Yüklemez Dil Ayarlaması Yapıyor
// Burda base Context Olduğundan En Basda Resources Ayarlamıs Olur
// Uygulama Her Başladığında Kontrol Sağlarız
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext( LocaleHelper.onAttach(base));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context=getBaseContext();
// Mainde Kullanıldığında Resources'leri Burdan Devam Etmeli
res=context.getResources();
// Actionbar Title Değişim için Kullanılıyor
setTitle(res.getString(R.string.app_name));
}
Yorumlar
Yorum Gönder