ক্যালিগ্রাফি দ্বারা অনুপ্রাণিত হয়ে আমি একটি প্রসঙ্গের মোড়ক তৈরি করে শেষ করেছি। আমার ক্ষেত্রে, আমার অ্যাপ্লিকেশন ব্যবহারকারীদের অ্যাপ্লিকেশনটির ভাষা পরিবর্তন করার বিকল্পটি সরবরাহ করতে আমার সিস্টেমের ভাষাটি ওভাররাইট করা দরকার তবে এটি আপনাকে প্রয়োগ করতে হবে এমন কোনও যুক্তির সাথে কাস্টমাইজ করা যায়।
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;
import java.util.Locale;
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
return new MyContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
এবং আপনার মোড়ক ইনজেক্ট করতে প্রতিটি ক্রিয়াকলাপে নিম্নলিখিত কোড যুক্ত করুন:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr"));
}
আপডেট 22/12/2020
অন্ধকার মোড সমর্থন করার জন্য অ্যান্ড্রয়েড ম্যাটারিয়াল লাইব্রেরি কনটেক্সট থেরাপ্র্যাপার প্রয়োগের পরে, ভাষা সেটিংটি ভেঙে যাবে এবং ভাষা সেটিংটি নষ্ট হবে। মাস কয়েক মাথা স্ক্র্যাচিংয়ের পরে, ক্রিয়াকলাপ এবং ফ্রেগমেন্ট অনক্রিট পদ্ধতিতে নিম্নলিখিত কোড যুক্ত করে সমস্যার সমাধান করা হয়েছিল
Context context = MyContextWrapper.wrap(this, "fr");
getResources().updateConfiguration(context.getResources().getConfiguration(), context.getResources().getDisplayMetrics());
আপডেট 10/19/2018
কখনও কখনও ওরিয়েন্টেশন পরিবর্তনের পরে বা ক্রিয়াকলাপটি বিরতি / পুনরারম্ভের পরে কনফিগারেশন অবজেক্টটি ডিফল্ট সিস্টেম কনফিগারেশনে পুনরায় সেট করে এবং ফলস্বরূপ আমরা ফরাসি "ফরাসী" লোকেলের সাথে প্রসঙ্গটি আবৃত করেও ইংরেজী "এন" পাঠ্য প্রদর্শনকারী অ্যাপটি দেখতে পাব result । সুতরাং এবং একটি ভাল অনুশীলন হিসাবে, ক্রিয়াকলাপ বা ক্রিয়াকলাপে ক্রিয়াকলাপ / ক্রিয়াকলাপের অবজেক্টটি কোনও বিশ্বব্যাপী পরিবর্তনশীল বা টুকরো টুকরো করে রাখবেন না।
তদতিরিক্ত, একটি মাইবেসফ্র্যাগমেন্ট বা মাইবেসঅ্যাক্টিভিটিতে নিম্নলিখিতটি তৈরি এবং ব্যবহার করুন:
public Context getMyContext(){
return MyContextWrapper.wrap(getContext(),"fr");
}
এই অনুশীলনটি আপনাকে 100% বাগ মুক্ত সমাধান সরবরাহ করবে।