অ্যান্ড্রয়েডে প্রোগ্রামের মতো অ্যাপ্লিকেশন ভাষা পরিবর্তন করুন


448

অ্যানড্রয়েড রিসোর্সগুলি ব্যবহার করার পরেও কি কোনও অ্যাপ্লিকেশনটির প্রোগ্রাম প্রোগ্রামিক্যালি পরিবর্তন করা সম্ভব?

যদি তা না হয়, তবে কি কোনও নির্দিষ্ট ভাষায় কোনও সংস্থার জন্য অনুরোধ করা সম্ভব?

আমি ব্যবহারকারীকে অ্যাপ থেকে অ্যাপটির ভাষা পরিবর্তন করতে চাই।


4
আপনি নিম্নলিখিত গ্রন্থাগার, কোন ভাষায় তালিকা উপলব্ধ করা, আপনার সেটিংস পর্দা জন্য অগ্রাধিকার ব্যবহার করতে পারেন, এবং আপনার অ্যাপ্লিকেশান ভাষা অগ্রাহ্য: github.com/delight-im/Android-Languages
কাকের ডাক

@MarcoW। আপনি কি জানেন যে অ্যান্ড্রয়েড-ভাষাগুলি অ্যান্ড্রয়েড 5.0 ললিপপ নিয়ে কাজ করে?
neu242

1
@ neu242 হ্যাঁ, এটি কোনও সমস্যা ছাড়াই অ্যান্ড্রয়েড 5.0 এ চলে।
কাও

1
আপনি নিম্নলিখিত লাইব্রেরিটি ব্যবহার করতে পারেন: github.com/zeugma-solutions/locale-helper-android
josue.0

1
@ josue.0 যে লাইব্রেরিটি এটির জন্য প্রায় পরিষ্কার সমাধান
amitavk

উত্তর:


376

এটা সম্ভব. আপনি লোকেল সেট করতে পারেন। তবে, আমি এটি সুপারিশ করব না। আমরা প্রাথমিক পর্যায়ে এটি চেষ্টা করেছি, এটি মূলত সিস্টেমটির সাথে লড়াই করছে।

ভাষা পরিবর্তনের জন্য আমাদের একই প্রয়োজনীয়তা রয়েছে তবে ইউআই ফোন ফোনের মতই হওয়া উচিত এই সিদ্ধান্তে স্থির হওয়ার সিদ্ধান্ত নিয়েছে। এটি লোকেল নির্ধারণের মাধ্যমে কাজ করছিল তবে খুব বাগী ছিল। এবং প্রতিবার আমার অভিজ্ঞতা থেকে আপনি কার্যকলাপ (প্রতিটি ক্রিয়াকলাপ) প্রবেশ করার সময় আপনাকে এটি সেট করতে হবে। আপনার যদি এখনও এটির প্রয়োজন হয় তবে এখানে একটি কোড রয়েছে (আবার, আমি এটির প্রস্তাব দিই না)

Resources res = context.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(language_code.toLowerCase())); // API 17+ only.
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm);

আপনার যদি ভাষা নির্দিষ্ট সামগ্রী থাকে - আপনি সেটিংসের সেই বেসটি পরিবর্তন করতে পারেন।


2020 মার্চ 26 তারিখে আপডেট

public static void setLocale(Activitycontext) {
        Locale locale;
        Sessions session = new Sessions(context);
        //Log.e("Lan",session.getLanguage());
            locale = new Locale(langCode);
        Configuration config = new Configuration(context.getResources().getConfiguration());
        Locale.setDefault(locale);
        config.setLocale(locale);

       context.getBaseContext().getResources().updateConfiguration(config,
              context.getBaseContext().getResources().getDisplayMetrics());
    }

329
বিশ্বাস করা যায় না যে অ্যান্ড্রয়েড এটিকে এত শক্ত করে তোলে। ফোনের লোকাল এবং অ্যাপ্লিকেশনগুলির মধ্যে কেন একটি শক্ত সমিতি থাকা উচিত তা আমি সত্যিই দেখতে পাই না। আমি সবসময় আমার ফোনটি ইংরেজি ভাষা ব্যবহার করে থাকি যদিও আমি স্থানীয় ইংরেজী স্পিকার নই। কারণটি হ'ল অনুবাদকৃত আধা-প্রযুক্তিগত শব্দগুলি কেবল আমার নিজের ভাষায় খুব অদ্ভুত হয়ে যায় তাই ইংরেজিটি এত সহজ। নেট থেকে পরামর্শ অনুসরণ করাও আমার পক্ষে সহজ করে তোলে। তবে এর অর্থ এই নয় যে আমি আমার ফোনে প্রতিটি অ্যাপ্লিকেশনটি ইংরাজী ব্যবহার করতে চাই (যদিও পুরোপুরি ঠিক আছে এটি ডিফল্ট is আমি বেছে নিতে সক্ষম হতে চাই !!!
পিটার

9
ওহ, দেখে মনে হচ্ছে এপিআই লেভেল 17 টি প্রবর্তিত হয়েছে Context.createConfigurationContext(), যা স্থানীয়-নির্দিষ্ট কনফিগারেশনের সাথে ডিফল্ট প্রসঙ্গটি মোড়ানোর জন্য ব্যবহার করা যেতে পারে এবং তারপরে getResourcesসংস্থাগুলির নিজস্ব সামগ্রীতে কনফিগারেশন আপডেট না করে কল করতে পারে।
জ্যাব

8
আপনার প্রতিটি ক্রিয়াকলাপের এটি তৈরি করতে হবে। অন্যথায় এটি সিস্টেমে ওভাররাইড হয়ে যেতে পারে - উদাহরণস্বরূপ আপনি যখন আপনার ডিভাইসটিকে ল্যান্ডস্কেপে পরিণত করেন এবং আপনার ক্রিয়াকলাপটি নতুন (সিস্টেম সরবরাহিত) কনফিগারেশন দিয়ে পুনরায় তৈরি করা হয়।
জসোল্ট সাফরানি

14
আপনি যদি "আর" এর মতো আরটিএল লোকেল সেট করেন এবং আপনার -ldrtl রিসোর্স ফোল্ডারগুলিকে পাশাপাশি কাজ করতে চান তবে কনফার্টও সেট করুন লেআউটডাইরেশন (লোকেল);
জসোল্ট সাফরানি

3
@ZsoltSafrany - একটি কলে যোগ পরিবর্তে conf.setLayoutDirection(locale), আপনি প্রতিস্থাপন করতে পারেন conf.locale = new Locale(...))সঙ্গে conf.setLocale(new Locale(...))। এটি অভ্যন্তরীণ কল করবে setLayoutDirection
টেড হপ

180

এই কোডটি সত্যই কাজ করে:

ফা = পার্সিয়ান, এন = ইংরেজি

আপনার ভাষার কোডটি languageToLoadভেরিয়েবলের মধ্যে প্রবেশ করান :

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;

public class Main extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String languageToLoad  = "fa"; // your language
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    getBaseContext().getResources().updateConfiguration(config, 
      getBaseContext().getResources().getDisplayMetrics());
    this.setContentView(R.layout.main);
  }
}

2
আমি আপনার কোডটিতে রানটাইমের সময় লোকেলটি পরিবর্তন করতে চাই, আপনি আপনার কোড সেটকন্টেন্টভিউ () পদ্ধতির আগে রেখে দিয়েছেন। সুতরাং আপনার কোডটি আমার পক্ষে কার্যকর নয়, সুতরাং চলমান সময়ে ভাষাটি কীভাবে পরিবর্তন করা যায়, আমার আবেদনে, দুটি রেডিও বোতাম রয়েছে, ইংরেজির জন্য এবং অন্যটি আরবি
ভাষাতে

2
@ বুফালো, এটি Resources.updateConfigurationপদ্ধতির জন্য দ্বিতীয় যুক্তি । আমি আরও স্পষ্ট করার জন্য কোডটি যুক্ত করেছি ented
সিজনপ্রযুক্তি

5
এটি চালু করার ক্রিয়াকলাপটি স্থাপনের পরে সমস্ত ক্রিয়াকলাপের জন্য ভালভাবে কাজ করছে। তবে, অ্যাকশন বারের শিরোনামটি অকার্যকর বলে মনে হচ্ছে এবং এখনও এটি ডিফল্ট ভাষাটি প্রদর্শন করে। কোন ধারণা কি আমি মিস করেছি?
অ্যান্ড্রয়েডমেচানিক - ভাইরাল প্যাটেল

8
কনফিগার.লোকেল অবহেলা করা হয়েছে
জো

2
পরিবর্তে "config.locale = লোকাল;" ব্যবহারের "যদি (Build.VERSION.SDK_INT> = 17) {config.setLocale (লোকেল);} অন্য {config.locale = LOCALE;}
roghayeh hosseini

36

আমি প্রোগ্রামের পদ্ধতিতে সিস্টেমের ভাষা পরিবর্তন করার একটি উপায় খুঁজছিলাম। যদিও আমি পুরোপুরি বুঝতে পারি যে কোনও সাধারণ অ্যাপ্লিকেশনটি কখনই এর পরিবর্তে না হয়:

  • ব্যবহারকারীর এটিকে ম্যানুয়ালি পরিবর্তন করতে সিস্টেম সেটিংসে (একটি অভিপ্রায় মাধ্যমে) নির্দেশ করা উচিত
  • অ্যালেক্সের উত্তরে বর্ণিত ঠিক একইভাবে অ্যাপ্লিকেশনটির নিজস্ব স্থানীয়করণ হ্যান্ডেল করা উচিত

প্রকৃতপক্ষে প্রোগ্রামের ভাষায় সিস্টেমটির ভাষা পরিবর্তন করার প্রয়োজন ছিল।

এটি অননুমোদিত API এবং এইভাবে বাজার / শেষ-ব্যবহারকারী অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা উচিত নয়!

যাইহোক, আমি খুঁজে পেয়েছি সমাধান heres:

  Locale locale = new Locale(targetLocaleAsString);

  Class amnClass = Class.forName("android.app.ActivityManagerNative");
  Object amn = null;
  Configuration config = null;

  // amn = ActivityManagerNative.getDefault();
  Method methodGetDefault = amnClass.getMethod("getDefault");
  methodGetDefault.setAccessible(true);
  amn = methodGetDefault.invoke(amnClass);

  // config = amn.getConfiguration();
  Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
  methodGetConfiguration.setAccessible(true);
  config = (Configuration) methodGetConfiguration.invoke(amn);

  // config.userSetLocale = true;
  Class configClass = config.getClass();
  Field f = configClass.getField("userSetLocale");
  f.setBoolean(config, true);

  // set the locale to the new value
  config.locale = locale;

  // amn.updateConfiguration(config);
  Method methodUpdateConfiguration = amnClass.getMethod("updateConfiguration", Configuration.class);
  methodUpdateConfiguration.setAccessible(true);
  methodUpdateConfiguration.invoke(amn, config);

2
ব্যতিক্রম অনুরোধের ব্যতিক্রম দিন
রবি

1
ভাল নির্ভর করে যেখানে আমন্ত্রণটি টার্গেটএক্সেপশন নিক্ষেপ করা হবে। তারপরে আপনার ক্লাসটি পরিবর্তন করা উচিত তা জানা উচিত।
আইকিয়ারাসর

1
@ রেট-এ-ট্যাট-এ-ট্যাট রাতাতৌলিল, অ্যান্ড্রয়েড ৪.২ থেকে শুরু করে android.permission.CHANGE_CONFIGURATIONকেবল পারফর্ম কী দ্বারা স্বাক্ষরিত অ্যাপ্লিকেশন দিয়ে দেওয়া যেতে পারে।
ইয়েং

3
আমি আমার অ্যাপ্লিকেশনটিকে / সিস্টেম / বেসরকারী-অ্যাপে অ্যান্ড্রয়েড 6.0 ইস্যুতে কাজ করার জন্য রেখেছি। বিশদ এখানে
ওয়েইন

1
@ রাভি আমাকে এটিকে কাজ করার জন্য আমার অ্যাপ্লিকেশনটিকে / সিস্টেম / অ্যাপ থেকে / সিস্টেম / বেসরকারী-অ্যাপ্লিকেশানে নিয়ে যেতে হয়েছিল
alexislg

31

আপনি যদি আপনার সমস্ত অ্যাপ্লিকেশানের উপর ভাষা পরিবর্তিত করতে চান তবে আপনাকে দুটি জিনিস করতে হবে।

প্রথমে একটি বেস ক্রিয়াকলাপ তৈরি করুন এবং আপনার সমস্ত ক্রিয়াকলাপ এটি থেকে প্রসারিত করুন:

public class BaseActivity extends AppCompatActivity {

    private Locale mCurrentLocale;

    @Override
    protected void onStart() {
        super.onStart();

        mCurrentLocale = getResources().getConfiguration().locale;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Locale locale = getLocale(this);

        if (!locale.equals(mCurrentLocale)) {

            mCurrentLocale = locale;
            recreate();
        }
    }

    public static Locale getLocale(Context context){
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

        String lang = sharedPreferences.getString("language", "en");
        switch (lang) {
            case "English":
                lang = "en";
                break;
            case "Spanish":
                lang = "es";
                break;
        }
        return new Locale(lang);
    }
}

মনে রাখবেন যে আমি নতুন ভাষাটি একটি ভাগ করা পছন্দ হিসাবে সংরক্ষণ করি।

দ্বিতীয়ত, অ্যাপ্লিকেশনটির এভাবে এক্সটেনশন তৈরি করুন:

    public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        setLocale();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        setLocale();
    }

    private void setLocale() {

        final Resources resources = getResources();
        final Configuration configuration = resources.getConfiguration();
        final Locale locale = getLocale(this);
        if (!configuration.locale.equals(locale)) {
            configuration.setLocale(locale);
            resources.updateConfiguration(configuration, null);
        }
    }
}

লক্ষ্য করুন যে getLocale () এটি উপরের মতই।

এখানেই শেষ! আমি আশা করি এটি কারও সাহায্য করতে পারে।


অ্যাপ ক্রিয়াকলাপ এটি একটি প্রাথমিক ক্রিয়াকলাপ, একটি মেইনএকটিভিটির মতো? উদাহরণস্বরূপ, আমি সেটলোকল () এ আমার পদ্ধতি অনক্রিয়েট () এ সমাধান করতে পারি?
মোরোজভ

অ্যাপ্লিকেশনটি অ্যাপ্লিকেশনটির একটি এক্সটেনশন, এটি কোনও ক্রিয়াকলাপ নয়। তোমার কী দরকার আমি বুঝতে পারছি না, দুঃখিত। হতে পারে আপনি আবার আমাকে ব্যাখ্যা করার চেষ্টা করতে পারেন :)
ড্যানিয়েল এস

1
আমার মতো অ্যান্ড্রয়েড নুবসের জন্য, কী Applicationকী এবং কীভাবে ব্যবহার করতে হয় তা জানতে এখানে আসুন । mobomo.com/2011/05/how-to-use-application-object-of-android
শেন 申思维

2
configuration.locateঅবচয় করা হয়েছে, সেটলোকেলের জন্য এপিআই 17+ প্রয়োজন এবং আপডেট কনফিগারেশনটি অবচিত হয়েছে
জো

19

এই নিবন্ধ অনুযায়ী । আপনার LocaleHelper.javaনিবন্ধে রেফারেন্স ডাউনলোড করতে হবে ।

  1. MyApplicationবর্ধিত হবে এমন বর্গ তৈরি করুনApplication
  2. attachBaseContext()ভাষা আপডেট করতে ওভাররাইড করুন ।
  3. এই ক্লাসটি ম্যানিফেস্টে নিবন্ধভুক্ত করুন।

    public class MyApplication extends Application {
       @Override
       protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
       }
    }
    
    <application
         android:name="com.package.MyApplication"
         .../>
  4. ভাষা আপডেট করার জন্য তৈরি BaseActivityএবং ওভাররাইড করুন onAttach()অ্যান্ড্রয়েড 6+ এর জন্য প্রয়োজন

    public class BaseActivity extends Activity {
      @Override
      protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base));
      }
    }
  5. আপনার অ্যাপ্লিকেশনটিতে সমস্ত ক্রিয়াকলাপ থেকে প্রসারিত করুন BaseActivity

    public class LocaleHelper {
    
    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
    
    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }
    
    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }
    
    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }
    
    public static Context setLocale(Context context, String language) {
        persist(context, language);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }
    
        return updateResourcesLegacy(context, language);
    }
    
    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }
    
    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();
    
        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
    
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);
    
        return context.createConfigurationContext(configuration);
    }
    
    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
    
        Resources resources = context.getResources();
    
        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale);
        }
    
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    
        return context;
    }
    }

সুপার.আটচবেস কনটেক্সট (লোকালহেল্পার.অনট্যাচ (নিউবেস)) ব্যবহার করতে পারছি না কারণ আমি ইতিমধ্যে সুপার.আটচব্যাসকন্টেক্সট (ক্যালিগ্রাফি কনটেক্সটওয়্যার্পার.আর্যাপ (নতুনবেস)) ব্যবহার করছি
রাসেল

1
আপনি একে অপরের সাথে মোড়ানো করতে পারেন। super.attachBaseContext (CalligraphyContextWrapper.wrap (LocaleHelper.onAttach (newBase)))
Yeahia2508

15

কেবলমাত্র একটি অতিরিক্ত টুকরো যোগ করুন যা আমাকে ট্রিপ করেছে।

অন্য উত্তরগুলি উদাহরণস্বরূপ "ডি" দিয়ে ভাল কাজ করে

String lang = "de";
Locale locale = new Locale(lang); 
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
    getBaseContext().getResources().getDisplayMetrics());

উপরের অভ্যাসটি উদাহরণস্বরূপ "fr_BE"লোকেলের সাথে কাজ করে যাতে এটি values-fr-rBEফোল্ডার বা অনুরূপ ব্যবহার করে ।

কাজ করতে নিম্নলিখিত সামান্য পরিবর্তন প্রয়োজন "fr_BE"

String lang = "fr";

//create a string for country
String country = "BE";
//use constructor with country
Locale locale = new Locale(lang, country);

Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
    getBaseContext().getResources().getDisplayMetrics());

1
যদি আপনি বর্তমান খোলা ক্রিয়াকলাপ কলটিতে লোকাল পরিবর্তন প্রয়োগ করতে চানactivity.recreate()
ক্রা

আমি জানি আমি পার্টিতে দেরি করেছি, তবে নতুন লোকালে (ল্যাং, দেশ) আমার যা দরকার ছিল!
জ্যাকব হোলোয়ে

কার্যকলাপ.recreate () এটি কীভাবে কাজ করে বা যদি আমরা এটিকে কল করি তবে স্ট্রিং ল্যাং = "ফ্রি"; স্ট্রিং কান্ট্রি = "বিই"; সময়টি কীভাবে চলবে তা কখনই ওভাররাইড করবে না
অমিতসর্মা

android.content.res.Configuration conf = res.getConfiguration();নতুন Configurationউদাহরণ তৈরির পরিবর্তে ব্যবহার সম্পর্কে কী ? তাজা ব্যবহার করার জন্য কি কোনও উপকার আছে?
বিয়ানকা ড্যানিসিক

14

আমার অ্যাপ্লিকেশন শুরু হওয়ার জন্য আমি জার্মান ভাষার পরিবর্তিত হয়েছি।

এখানে আমার সঠিক কোড। যে কেউ আমার জন্য এটি ব্যবহার করতে চান .. (অ্যান্ড্রয়েড প্রোগ্রামায়মে ভাষা কীভাবে পরিবর্তন করবেন)

আমার কোড:

Configuration config ; // variable declaration in globally

// this part is given inside onCreate Method starting and before setContentView()

public void onCreate(Bundle icic) 
{
    super.onCreate(icic);
    config = new Configuration(getResources().getConfiguration());
    config.locale = Locale.GERMAN ;
    getResources().updateConfiguration(config,getResources().getDisplayMetrics());

    setContentView(R.layout.newdesign);
}

1
@ হরিকৃষ্ণন এটি আমার পক্ষে কাজ করছে না এবং কীবোর্ড নির্দিষ্ট ভাষায় পরিবর্তন করছে না .. আপনি কীভাবে ম্যানিফেস্টে কার্যকলাপ ঘোষণা করেছেন?
অবোধনী ওয়াই

13

আমি জানি উত্তর দিতে দেরি হয়েছে তবে আমি এই নিবন্ধটি এখানে পেয়েছি । যা পুরো প্রক্রিয়াটি খুব ভালভাবে ব্যাখ্যা করে এবং আপনাকে একটি ভাল কাঠামোগত কোড সরবরাহ করে।

স্থানীয় সাহায্যকারী শ্রেণি:

import android.annotation.TargetApi;
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 java.util.Locale;

/**
 * This class is used to change your application locale and persist this change for the next time
 * that your app is going to be used.
 * <p/>
 * You can also change the locale of your application on the fly by using the setLocale method.
 * <p/>
 * Created by gunhansancar on 07/10/15.
 */
public class LocaleHelper {

    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }

    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }

    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }

    public static Context setLocale(Context context, String language) {
        persist(context, language);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }

        return updateResourcesLegacy(context, language);
    }

    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }

    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);

        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale);
        }

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return context;
    }
}

আপনার অ্যাপ্লিকেশনটিতে লোকাল সেটিংস শুরু করার জন্য আপনাকে সংযুক্তিবেসকন্টেক্সট ওভাররাইড করতে হবে এবং লোকালহেল্পার.অনট্যাচ () কল করুন।

import android.app.Application;
import android.content.Context;

import com.gunhansancar.changelanguageexample.helper.LocaleHelper;

public class MainApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
    }
}

আপনাকে যা করতে হবে তা হল যুক্ত করা to

LocaleHelper.onCreate(this, "en");

আপনি যেখানেই লোকেলটি পরিবর্তন করতে চান


লোকালহেল্পার নিবন্ধ থেকে একটি বর্গ। যে কোনও লিঙ্কগুলি নামানোর ঝুঁকি রয়েছে। আপনার উত্তরে কোডটি যুক্ত করুন।
জো

আমি আমার অ্যাপ পুনরায় চালু করতে চাই না কারণ অ্যাপ্লিকেশনটি স্ক্রিন রেকর্ড করার মতো কিছু কাজ করছে। সুতরাং অ্যাপ্লিকেশন পুনরায় চালু না করে অ্যান্ড্রয়েড 7.0 এর কোনও সমাধান নেই
প্রিয়াঙ্কাচৌহান

1
@ প্রিয়াঙ্কাচৌহান আমার মনে হয় নিবন্ধটি এই কেসটিকে অন্তর্ভুক্ত করেছে: আপনার কাছে বর্তমানে দৃশ্যমান লেআউটটি আপডেট করার জন্য দুটি বিকল্প রয়েছে: প্রথমত , আপনি কেবল একটি করে পাঠ্য বা অন্য কোনও ভাষা নির্ভর সম্পদ আপডেট করতে পারবেন।
মাকসিম তুরাইভ

নতুন যুক্ত করার জন্য ধন্যবাদ createConfigurationContext, এটি সহায়ক ছিল
জ্যাকোবালেনউড

1
onCreate বা onAtach কল করতে?
ভ্যানস্টে 25

12

একটি শ্রেণি প্রসারিত করুন Applicationএবং স্ট্যাটিক পদ্ধতি তৈরি করুন। তারপরে আপনি এই পদ্ধতিটিকে আগে যাবতীয় ক্রিয়াকলাপে কল করতে পারেন setContentView()

public class MyApp extends Application {

@Override
public void onCreate() {
    super.onCreate();
}

public static void setLocaleFa (Context context){
    Locale locale = new Locale("fa"); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    context.getApplicationContext().getResources().updateConfiguration(config, null);
}

public static void setLocaleEn (Context context){
    Locale locale = new Locale("en_US"); 
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    context.getApplicationContext().getResources().updateConfiguration(config, null);
}

}

ক্রিয়াকলাপে ব্যবহার:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyApp.setLocaleFa(MainActivity.this);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
}

10

অ্যান্ড্রয়েড .0.০ নুগাটের জন্য (এবং নিম্ন) এই নিবন্ধটি অনুসরণ করুন:

অ্যান্ড্রয়েডে প্রোগ্রামারমেটিক ভাষা পরিবর্তন করুন

পুরানো উত্তর
এর মধ্যে আরটিএল / এলটিআর সমর্থন অন্তর্ভুক্ত:

public static void changeLocale(Context context, Locale locale) {
    Configuration conf = context.getResources().getConfiguration();
    conf.locale = locale;
    Locale.setDefault(locale);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       conf.setLayoutDirection(conf.locale);
    }

    context.getResources().updateConfiguration(conf, context.getResources().getDisplayMetrics());
}

1
আপডেট কনফিগারেশন অবচিত করা হয়েছে। লিঙ্কটি দরকারী, দয়া করে এটি আপনার উত্তরে যুক্ত করুন। (লিঙ্কটি কেবলমাত্র উত্তর হিসাবে লিংক সরিয়ে নেওয়া হতে পারে, ভাল হয় না যদি এটি ঘটে তবে এই উত্তর অনর্থক।)
Zoe

8

আমার জন্য সম্পূর্ণরূপে কাজ করা একমাত্র সমাধান হ'ল অ্যাপ্লিকেশন পুনঃসূচনা প্রক্রিয়াটির সাথে অ্যালেক্স ভলভয়ের কোডের সংমিশ্রণ:

void restartApplication() {
    Intent i = new Intent(MainTabActivity.context, MagicAppRestart.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    MainTabActivity.context.startActivity(i);
}


/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        finish();
    }

    protected void onResume() {
        super.onResume();
        startActivityForResult(new Intent(this, MainTabActivity.class), 0);         
    }
}

2
স্থানীয় পরিবর্তনের পরে আপনি কল করতেও পারেনactivity.recreate()
ক্রা

1
আমি আমার অ্যাপ পুনরায় চালু করতে চাই না কারণ অ্যাপ্লিকেশনটি স্ক্রিন রেকর্ড করার মতো কিছু কাজ করছে। সুতরাং অ্যাপ্লিকেশন পুনরায় চালু না করে অ্যান্ড্রয়েড 7.0 এর কোনও সমাধান নেই
প্রিয়াঙ্কাচৌহান

7

আমি একই সমস্যা ছিল। গিটহাব-এ আমি অ্যান্ড্রয়েড-লোকালাইজেশনঅ্যাক্টিভিটি লাইব্রেরি পেয়েছি ।

আপনি নীচের কোডের নমুনাতে দেখতে পাচ্ছেন এই লাইব্রেরিটি রানটাইমের সময় আপনার অ্যাপের ভাষা পরিবর্তন করা খুব সহজ করে তোলে। নীচে নমুনা কোড সহ আরও একটি নমুনা প্রকল্প এবং আরও তথ্য গিথুব পৃষ্ঠায় পাওয়া যাবে।

লোকালাইজেশন অ্যাক্টিভিটি অ্যাপকম্প্যাটঅ্যাক্টিভিটি প্রসারিত করে, তাই আপনি যখন খণ্ডগুলি ব্যবহার করছেন তখন আপনি এটি ব্যবহার করতে পারেন।

public class MainActivity extends LocalizationActivity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);

        findViewById(R.id.btn_th).setOnClickListener(this);
        findViewById(R.id.btn_en).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_en) {
            setLanguage("en");
        } else if (id == R.id.btn_th) {
            setLanguage("th");
        }
    }
}

7

একটি নির্ধারিত আপডেটের জন্য সময়।

প্রথমে, এপিআই-এর সাথে অবহেলিত তালিকাটি যেখানে এটি হ্রাস করা হয়েছিল:

  • configuration.locale (এপিআই 17)
  • updateConfiguration(configuration, displaymetrics) (এপিআই 17)

সম্প্রতি কোনও প্রশ্নের উত্তরের যে জিনিসটি সঠিকভাবে অর্জন করেছে তা হ'ল নতুন পদ্ধতির ব্যবহার

#ConfigrationContext আপডেট কনফিগারেশনের নতুন পদ্ধতি।

কেউ কেউ এটিকে এককভাবে ব্যবহার করেছেন:

Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
createConfigurationContext(overrideConfiguration);

... কিন্তু কাজ করে না কেন? পদ্ধতিটি একটি প্রসঙ্গ ফেরত দেয়, যা স্ট্রিংস.এক্সএমএল অনুবাদ এবং অন্যান্য স্থানীয়ীকৃত সংস্থানসমূহ (চিত্র, বিন্যাস, যাই হোক না কেন) হ্যান্ডেল করতে ব্যবহৃত হয়।

সঠিক ব্যবহারটি হ'ল:

Configuration overrideConfiguration = ctx.getResources().getConfiguration();
Locale locale = new Locale("en_US");
overrideConfiguration.setLocale(locale);
//the configuration can be used for other stuff as well
Context context  = createConfigurationContext(overrideConfiguration);
Resources resources = context.getResources();

যদি আপনি কেবল এটির আইডিইতে অনুলিপি করে থাকেন তবে আপনি একটি সতর্কতা দেখতে পাবেন যে এপিআই আপনার 17 বা ততোধিকের উপরে লক্ষ্যবস্তু করা উচিত। এটিকে কোনও পদ্ধতিতে রেখে এবং টীকা যুক্ত করে কাজ করা যেতে পারে@TargetApi(17)

কিন্তু অপেক্ষা করো. পুরানো এপিআই এর কী হবে?

টার্গেটএপি টীকা ছাড়াই আপনাকে আপডেট কনফিগারেশন ব্যবহার করে অন্য একটি পদ্ধতি তৈরি করতে হবে।

Resources res = YourApplication.getInstance().getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale("th");
res.updateConfiguration(conf, dm);

আপনাকে এখানে কোনও প্রসঙ্গে ফেরত দেওয়ার দরকার নেই।

এখন, এগুলি পরিচালনা করা কঠিন হতে পারে। স্থানীয়করণের উপর ভিত্তি করে উপযুক্ত সংস্থান পেতে আপনার এপিআই 17+ এ প্রসঙ্গ তৈরি করা (বা তৈরি করা প্রসঙ্গ থেকে সংস্থানগুলি) দরকার। তুমি কীভাবে এটা পরিচালনা করো?

ঠিক আছে, আমি এইভাবেই এটি করি:

/**
 * Full locale list: /programming/7973023/what-is-the-list-of-supported-languages-locales-on-android
 * @param lang language code (e.g. en_US)
 * @return the context
 * PLEASE READ: This method can be changed for usage outside an Activity. Simply add a COntext to the arguments
 */
public Context setLanguage(String lang/*, Context c*/){
    Context c = AndroidLauncher.this;//remove if the context argument is passed. This is a utility line, can be removed totally by replacing calls to c with the activity (if argument Context isn't passed)
    int API = Build.VERSION.SDK_INT;
    if(API >= 17){
        return setLanguage17(lang, c);
    }else{
        return setLanguageLegacy(lang, c);
    }
}

/**
 * Set language for API 17
 * @param lang
 * @param c
 * @return
 */
@TargetApi(17)
public Context setLanguage17(String lang, Context c){
    Configuration overrideConfiguration = c.getResources().getConfiguration();
    Locale locale = new Locale(lang);
    Locale.setDefault(locale);
    overrideConfiguration.setLocale(locale);
    //the configuration can be used for other stuff as well
    Context context  = createConfigurationContext(overrideConfiguration);//"local variable is redundant" if the below line is uncommented, it is needed
    //Resources resources = context.getResources();//If you want to pass the resources instead of a Context, uncomment this line and put it somewhere useful
    return context;
}

public Context setLanguageLegacy(String lang, Context c){
    Resources res = c.getResources();
    // Change locale settings in the app.
    DisplayMetrics dm = res.getDisplayMetrics();//Utility line
    android.content.res.Configuration conf = res.getConfiguration();

    conf.locale = new Locale(lang);//setLocale requires API 17+ - just like createConfigurationContext
    Locale.setDefault(conf.locale);
    res.updateConfiguration(conf, dm);

    //Using this method you don't need to modify the Context itself. Setting it at the start of the app is enough. As you
    //target both API's though, you want to return the context as you have no clue what is called. Now you can use the Context
    //supplied for both things
    return c;
}

এই কোডটি এমন একটি পদ্ধতি রেখে কাজ করে যা কোন এপিআই এর উপর ভিত্তি করে উপযুক্ত পদ্ধতিতে কল করে। এটি এমন অনেক কিছু যা আমি হ'ল প্রচুর অবহেলিত কল (Html.fromHtml সহ) দিয়ে। আপনার কাছে একটি পদ্ধতি রয়েছে যা প্রয়োজনীয় আর্গুমেন্টগুলি গ্রহণ করে যা এরপরে এটিকে দুটি (বা তিন বা ততোধিক) পদ্ধতির মধ্যে বিভক্ত করে এবং এপিআই স্তরের ভিত্তিতে উপযুক্ত ফলাফল প্রদান করে returns এটি নমনীয় যেহেতু আপনাকে একাধিকবার পরীক্ষা করতে হবে না, "এন্ট্রি" পদ্ধতিটি এটি আপনার জন্য করে। এখানে প্রবেশ-পদ্ধতিটিsetLanguage

এটি ব্যবহারের পূর্বে দয়া করে পড়ুন

আপনি যখন রিসোর্সগুলি পাবেন তখন আপনার প্রসঙ্গে ফিরে আসা প্রসঙ্গটি ব্যবহার করতে হবে। কেন? আমি এখানে অন্যান্য উত্তরগুলি দেখেছি যারা ক্রেডিট কনফিগারেশন কনটেক্সট ব্যবহার করে এবং যে প্রসঙ্গে ফিরে আসে তা ব্যবহার করে না। এটি এর মতো কাজ করতে, আপডেট কনফিগারেশন কল করতে হবে। যা অবমূল্যায়িত হয়। রিসোর্স পেতে পদ্ধতিতে ফিরে আসা প্রসঙ্গটি ব্যবহার করুন।

ব্যবহারের উদাহরণ :

নির্মাতা বা অন্য কোথাও অনুরূপ:

ctx = getLanguage(lang);//lang is loaded or generated. How you get the String lang is not something this answer handles (nor will handle in the future)

এবং তারপরে, আপনি যেখানেই রিসোর্স পেতে চান:

String fromResources = ctx.getString(R.string.helloworld);

অন্য কোনও প্রসঙ্গ ব্যবহার করা (তত্ত্বীয়ভাবে) এটি ভেঙে দেবে।

এএআইএআইএকি ডায়ালগ বা টোস্টগুলি দেখানোর জন্য আপনাকে এখনও কোনও ক্রিয়াকলাপের প্রসঙ্গ ব্যবহার করতে হবে। তার জন্য আপনি কোনও ক্রিয়াকলাপের উদাহরণ ব্যবহার করতে পারেন (যদি আপনি বাইরে থাকেন)


এবং পরিশেষে, recreate()সামগ্রীটি রিফ্রেশ করার জন্য ক্রিয়াকলাপটিতে ব্যবহার করুন। রিফ্রেশ করার জন্য একটি উদ্দেশ্য তৈরি করতে হবে না শর্টকাট।


1
কেউ কেউ ভাবতে পারে যে তৈরি করা প্রসঙ্গটি আপনার মেমরির জন্য ব্যয় করবে কিনা। তবে অ্যান্ড্রয়েড অফিশিয়াল ডকুমেন্টেশন অনুসারে: "এই পদ্ধতিতে প্রতিটি কল একটি প্রাসঙ্গিক অবজেক্টের একটি নতুন উদাহরণ দেয়; প্রসঙ্গ বিষয়গুলি ভাগ করা হয় না, তবে সাধারণ অবস্থা (ক্লাসলোডার, একই কনফিগারেশনের জন্য অন্যান্য সংস্থানসমূহ) হতে পারে তাই প্রসঙ্গটি নিজেই মোটামুটি হতে পারে লাইটওয়েট। " সুতরাং আমি মনে করি অ্যান্ড্রয়েড আশা করে আপনি স্থানীয় জিনিসগুলির জন্য পৃথক প্রসঙ্গ বস্তুটি ব্যবহার করবেন।
সিরা লাম

7

যদি লিখি

android:configChanges="locale"

প্রতিটি ক্রিয়াকলাপে (ম্যানিফেস্ট ফাইলটিতে) তারপরে প্রতিবার প্রবেশ করার পরে এটি সেট করার দরকার নেই Activity


11
যদি এটি ম্যানিফেস্টে থাকে তবে এটি রানটাইমের সময়ে কীভাবে একটি পরিবর্তন গঠন করবে, যা ওপি যা চেয়েছিল তা প্রদর্শিত হয়েছিল?
ব্যবহারকারী316117

1
@ ব্যবহারকারী316117 এটি অ্যান্ড্রয়েডের প্রতি ইঙ্গিত দেয় যে অ্যাপলটি লোকেল কনফিগারেশন সম্পর্কিত সমস্ত বিষয় অভ্যন্তরীণভাবে পরিচালনা করবে, লোকেল স্থির নয় not আমি নিশ্চিত নই যে ক্রিয়াকলাপগুলির মধ্যে পরিবর্তন করার সময় এটি অ্যান্ড্রয়েডকে লোকাল সেট করা থেকে বিরত রাখবে, যদিও আমি কেবল configChangesঘূর্ণন / ইত্যাদির ক্রিয়াকলাপের অবস্থা রক্ষার জন্য একটি হ্যাক ব্যবহার করেছি ।
জ্যাব

কীভাবে শুধুমাত্র ভাষা নির্দিষ্ট করে ভাষা নির্ধারণ করবেন?
কাব্যেশ কানওয়াল

1
... অ্যান্ড্রয়েড যতক্ষণ না আপনার ক্রিয়াকলাপটিকে হত্যা করে যতক্ষণ না এর জন্য আরও বেশি র‍্যামের প্রয়োজন হয়
লুই সিএডি

@ ব্রিজেশ যদি আমাদের অ্যাপ্লিকেশনটির ভাষা পরিবর্তন হয় তবে যদি আমাদের অ্যাপ্লিকেশনটির মধ্যে কিছু অনুসন্ধানের বিকল্প থাকে এবং আমরা যদি তখন অনুসন্ধান করি তবে অ্যাপটি কীভাবে ডেটা প্রদর্শন করবে, আমাদের প্রতিটি ভাষার জন্য কিছু আলাদা ডেটাবেস তৈরি করা উচিত বা কিছু অ্যান্ড্রয়েড কোড সেটিং আছে তাই অ্যাপ্লিকেশন অনুসন্ধান অনুযায়ী তথ্য প্রদর্শন করতে পারে?
বিশ্ব প্রতাপ

5
Locale locale = new Locale("en");
Locale.setDefault(locale);

Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);

গুরুত্বপূর্ণ আপডেট:

context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());

দ্রষ্টব্য, যে SDK> = 21 এ আপনাকে ' রিসোর্সস.আপডেট কনফিগারেশন ()' কল করতে হবে , অন্যথায় সংস্থানগুলি আপডেট হবে না।


আপডেট কনফিগারেশন অবচিত করা হয়েছে। আফাইক আপনি তৈরি কনফিগারেশন কনটেক্সট ব্যবহার করেন এবং এতে আপনার যে প্রসঙ্গ রয়েছে তা প্রয়োগ করুন ( Context ctx = createConfigurationContext(args);এবং এর থেকে সংস্থানগুলি পান
জো

আমি জানি যে এটি অবমূল্যায়ন করা হয়েছে। তবে যাইহোক, আমি এমন কোনও সমাধান জানি না যা অ্যান্ড্রয়েড 5 এবং এর চেয়ে বেশি এর উপরে কাজ করতে পারে।
Петлюк

তারপরে আপনি স্পষ্টভাবে জাভাদোকটি পরীক্ষা করেন নি। আপনি তৈরি কনফিগারেশন কনটেক্সট
জো

ঠিক আছে, তবে যাইহোক আমাদের আপডেট কনফিগারেশন () ডাকা উচিত?
Петлюк

1
অবহেলিত কলটি ব্যবহার করবেন না। কোনও কলিং আপডেট নেই মানে কনফিগারেশন
জো

4
/*change language at Run-time*/
//use method like that:
//setLocale("en");
 public void setLocale(String lang) { 
  myLocale = new Locale(lang);         
  Resources res = getResources();         
  DisplayMetrics dm = res.getDisplayMetrics();         
  Configuration conf = res.getConfiguration();         
  conf.locale = myLocale;         
  res.updateConfiguration(conf, dm);         
  Intent refresh = new Intent(this, AndroidLocalize.class);         
  startActivity(refresh); 
 }

5
নতুন ক্রিয়াকলাপ শুরু করার দরকার নেই, কেবল আসল রিফ্রেশ করুনactivity.recreate()
ক্রা

4

Locale configurationactivityসামগ্রী নির্ধারণের আগে প্রতিটিটিতে সেট করা উচিত -this.setContentView(R.layout.main);


তবে সেট কন্টেন্টভিউ () কল করার পরে আপনি যদি উড়তে গিয়ে এটি টগল করতে চান?
ইগোরগানাপলস্কি

2
স্থানীয় পরিবর্তনের পরে আপনি কল করতেও পারেনactivity.recreate()
ক্রা

4

প্রথমে বিভিন্ন ভাষার জন্য বহু স্ট্রিং.এক্সএমএল তৈরি করুন; তারপরে onCreate()পদ্ধতিতে কোডের এই ব্লকটি ব্যবহার করুন :

super.onCreate(savedInstanceState);
String languageToLoad  = "fr"; // change your language here
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
  getBaseContext().getResources().getDisplayMetrics());
this.setContentView(R.layout.main);

আপনাকে ধন্যবাদ, এই কোডটি দুর্দান্ত কাজ করে, আমি কোনও সমস্যা ছাড়াই অ্যান্ড্রয়েড
on.x

4

এখানে কিছু কোড যা আমার পক্ষে কাজ করে:

public class  MainActivity extends AppCompatActivity {
    public static String storeLang;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);
        storeLang = shp.getString(getString(R.string.key_lang), "");

        // Create a new Locale object
        Locale locale = new Locale(storeLang);

        // Create a new configuration object
        Configuration config = new Configuration();
        // Set the locale of the new configuration
        config.locale = locale;
        // Update the configuration of the Accplication context
        getResources().updateConfiguration(
                config,
                getResources().getDisplayMetrics()
        );

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

সূত্র: এখানে


3

এখানে তালিকাবদ্ধ সমাধানগুলির কোনওটিই আমাকে সহায়তা করেনি।

অ্যাপকম্প্যাটডেলিগেট.সেট ডিফল্টনাইটমোড (অ্যাপকম্প্যাটডেলিগেট.মোড।

এই লোকেল ইউটিসগুলি ঠিক সূক্ষ্মভাবে কাজ করে: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe

LocaleUtils

public class LocaleUtils {

public static final String LAN_SPANISH      = "es";
public static final String LAN_PORTUGUESE   = "pt";
public static final String LAN_ENGLISH      = "en";

private static Locale sLocale;

public static void setLocale(Locale locale) {
    sLocale = locale;
    if(sLocale != null) {
        Locale.setDefault(sLocale);
    }
}

public static void updateConfig(ContextThemeWrapper wrapper) {
    if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Configuration configuration = new Configuration();
        configuration.setLocale(sLocale);
        wrapper.applyOverrideConfiguration(configuration);
    }
}

public static void updateConfig(Application app, Configuration configuration) {
    if(sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        //Wrapping the configuration to avoid Activity endless loop
        Configuration config = new Configuration(configuration);
        config.locale = sLocale;
        Resources res = app.getBaseContext().getResources();
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
}
}

অ্যাপ্লিকেশন এই কোড যুক্ত

public class App extends Application {
public void onCreate(){
    super.onCreate();

    LocaleUtils.setLocale(new Locale("iw"));
    LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration());
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleUtils.updateConfig(this, newConfig);
}
}

ক্রিয়াকলাপে কোড

public class BaseActivity extends AppCompatActivity {
    public BaseActivity() {
        LocaleUtils.updateConfig(this);
    }
}

2

অ্যালেক্স ভলভয় উত্তর কেবলমাত্র আমার জন্য কাজ করে যদি এটি ক্রিয়াকলাপের অনক্রিট পদ্ধতিতে থাকে।

উত্তর যে সমস্ত পদ্ধতিতে কাজ করে তা অন্য থ্রেডে রয়েছে

অ্যান্ড্রয়েডে প্রোগ্রাম্যালি ভাষায় ভাষা পরিবর্তন করুন

কোডটির অভিযোজন এখানে



    Resources standardResources = getBaseContext().getResources();

    AssetManager assets = standardResources.getAssets();

    DisplayMetrics metrics = standardResources.getDisplayMetrics();

    Configuration config = new Configuration(standardResources.getConfiguration());

    config.locale = new Locale(languageToLoad);

    Resources defaultResources = new Resources(assets, metrics, config);

আশা করি এটি সাহায্য করবে।


19
আপনি বলেছিলেন "সমস্ত পদ্ধতিতে কাজ করা উত্তরটি অন্য থ্রেডে রয়েছে" তবে আপনার লিঙ্কটি এই থ্রেডের দিকে ইঙ্গিত করে! "
user316117

1
config.locale অবচয় করা হয়েছে
জো

2
পুনরাবৃত্ত উত্তর, স্ট্যাকওভারফ্লো এর সম্ভাব্য
তমতোম

2

নোট করুন যে এই সমাধানটি ব্যবহার updateConfiguration করে অ্যান্ড্রয়েড এম রিলিজ কয়েক সপ্তাহের মধ্যে আসার সাথে আর কাজ করবে না । এটি করার নতুন উপায়টি এখন অ্যাপিআই ডকapplyOverrideConfiguration থেকে পদ্ধতিটি ব্যবহার করছেContextThemeWrapper

যেহেতু আমি নিজেই সমস্যার মুখোমুখি হয়েছি আপনি এখানে আমার সম্পূর্ণ সমাধানটি সন্ধান করতে পারেন: https://stackoverflow.com/a/31787201/2776572


আমি অ্যান্ড্রয়েড 6.0.1 এ আপডেট কনফিগারেশন কোডটি চেষ্টা করে দেখছি এবং এটি ঠিকঠাক কাজ করছে, গুগল এটি স্থির করে কিনা তা আমি জানি না তবে আমি সমস্যা ছাড়াই এটি ব্যবহার করতে পারি
ইনভ্যাকশনগুলি

1
@ নিনভ্যাসিওনস অবহেলিত পদ্ধতিগুলি কিছু সময়ের জন্য রয়েছে। শেষ পর্যন্ত, এটি সরানো হবে। এটি একটি দীর্ঘ সময় নেয়, তবে যতক্ষণ সম্ভব সমস্যা সমাধানে নতুন এপিআই-তে চলে যাওয়া ভাল
জো

1

কিছু পদক্ষেপ রয়েছে যা আপনার কার্যকর করা উচিত

প্রথমে আপনাকে আপনার কনফিগারেশনের লোকেল পরিবর্তন করতে হবে

Resources resources = context.getResources();

Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale(language);

resources.updateConfiguration(configuration, resources.getDisplayMetrics());

দ্বিতীয়ত, আপনি যদি নিজের পরিবর্তনগুলি দৃশ্যমান লেআউটে সরাসরি প্রয়োগ করতে চান তবে আপনি হয় দৃশ্যগুলি সরাসরি আপডেট করতে পারেন বা আপনি কেবলমাত্র ক্রিয়াকলাপটি করতে পারেন re বর্তমান ক্রিয়াকলাপটি পুনরায় আরম্ভ করার জন্য () কল করুন ()।

এবং আপনাকে অবশ্যই আপনার পরিবর্তনগুলি বজায় রাখতে হবে কারণ ব্যবহারকারী আপনার অ্যাপ্লিকেশনটি বন্ধ করার পরে আপনি ভাষা পরিবর্তনটি হারাবেন।

আমি আমার ব্লগ পোস্টে আরও বিস্তারিত সমাধান ব্যাখ্যা করেছি অ্যান্ড্রয়েডে চেঞ্জ ল্যাঙ্গুয়েজ প্রোগ্রামে

মূলত, আপনি কেবল আপনার অ্যাপ্লিকেশন শ্রেণিতে লোকালহেল্পার.অনক্রিট () কল করুন এবং আপনি যদি উড়তে লোকেল পরিবর্তন করতে চান তবে আপনি লোকালহেল্পার.সেটলোকেল () কল করতে পারেন


@ লুনার ওয়াচার হ্যাঁ যদি আপনি আসলে গিথুব বা টুকরো টুকরো কোডটি পরীক্ষা করেন তবে এটি ইতিমধ্যে পরিচালনা করা হয়েছে।
গুণহান

1

আমি যখন আমার টেক্সটভিউয়ের পাঠ্যের ভাষা পরিবর্তন করতে বোতাম টিপব তখন এটি কাজ করছে ((মান-ডি ফোল্ডারে স্ট্রিংস.এক্সএমএল)

String languageToLoad = "de"; // your language
Configuration config = getBaseContext().getResources().getConfiguration();
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
recreate();

1

যোগ LocaleHelper বর্গ

public class LocaleHelper{ 
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context, lang);
}

public static Context onAttach(Context context, String defaultLanguage) {
    String lang = getPersistedData(context, defaultLanguage);
    return setLocale(context, lang);
}

public static String getLanguage(Context context) {
    return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static Context setLocale(Context context, String language) {
    persist(context, language);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResources(context, language);
    }

    return updateResourcesLegacy(context, language);
}

private static String getPersistedData(Context context, String defaultLanguage) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}

private static void persist(Context context, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLayoutDirection(locale);
    }

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}
}

ক্রিয়াকলাপ বা খণ্ডে

Context context = LocaleHelper.setLocale(this, App.getSharedPre().getLanguage());
Resource resources = context.getResources();

এখন প্রতিটি লেখায় সেটটেক্সট করুন

TextView tv = findViewById(R.id.tv);
tv.setText(resources.getString(R.string.tv));

0

স্বীকৃত উত্তরযুক্ত তবে 2017 সংস্করণের মতো এবং যুক্ত পুনঃসূচনা (পুনরায় চালু না করে, কখনও কখনও পরবর্তী ক্রিয়াকলাপ এখনও ইংরাজিকে রেন্ডার করে):

// Inside some activity...
private void changeDisplayLanguage(String langCode) {
// Step 1. Change the locale in the app's configuration
    Resources res = getResources();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.setLocale(currentLocale);
    createConfigurationContext(conf);
// Step 2. IMPORTANT! you must restart the app to make sure it works 100%
    restart();
}
private void restart() {
    PackageManager packageManager = getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
    ComponentName componentName = intent.getComponent();
    Intent mainIntent = IntentCompat.makeRestartActivityTask(componentName);
    mainIntent.putExtra("app_restarting", true);
    PrefUtils.putBoolean("app_restarting", true);
    startActivity(mainIntent);
    System.exit(0);
}

1) ফিনিসটি ব্যবহার করুন () পরিবর্তে 2) আপনি পুনরায় চালু করতে অ্যাপটি ব্যবহার করতে পারেন activity.recreate()3) প্রসঙ্গটি ফিরে এসেছে বলে আমি মনে করি সংস্থানগুলি ব্যবহার করতে হবে
জো

আমি আমার অ্যাপ পুনরায় চালু করতে চাই না কারণ অ্যাপ্লিকেশনটি স্ক্রিন রেকর্ড করার মতো কিছু কাজ করছে। সুতরাং অ্যাপ্লিকেশন পুনরায় চালু না করে অ্যান্ড্রয়েড 7.0 এর কোনও সমাধান নেই
প্রিয়াঙ্কাচৌহান

0

প্রথমে আপনি ডিরেক্টরি নামের মান তৈরি করেন - "ডিরেক্টরিতে" নাম লেখার চেয়ে "ভাষার নাম" এবং এই ডিরেক্টরিতে একই স্ট্রিং ফাইলের নাম অনুলিপি এবং পরিবর্তনের মানটি আপনার ক্রিয়ায় বোতামের মতো কোডের নীচে সেট করার পরে প্যারামিটার পরিবর্তন করে না ....

Locale myLocale = new Locale("hi");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(Home.this, Home.class);
startActivity(refresh);
finish(); 

1
conf.locale
জো

0
private void setLanguage(String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        config.setLocale(locale);
    } else {
        config.locale = locale;
    }
    getResources().updateConfiguration(config,
            getResources().getDisplayMetrics());

}

1
আমি আমার অ্যাপ পুনরায় চালু করতে চাই না কারণ অ্যাপ্লিকেশনটি স্ক্রিন রেকর্ড করার মতো কিছু কাজ করছে। সুতরাং অ্যাপ্লিকেশন পুনরায় চালু না করে অ্যান্ড্রয়েড 7.0 এর কোনও সমাধান নেই
প্রিয়াঙ্কাচৌহান

হ্যাঁ .0.০ এ এটি আমার পক্ষে ঠিক কাজ করে, অ্যাপ পুনরায় চালু না করে, ভাষা পরিবর্তন হয়, তবে আমি .0.০-তে পরীক্ষা করি নি
আদিব করিম

0

উদাহরণস্বরূপ আমরা ইংরেজি ভাষা সেট করি:

 Configuration config = GetBaseContext().getResources().getConfiguration();
 Locale locale = new Locale("en");
 Locale.setDefault(locale);
 config.locale = locale;
 GetBaseContext().getResources().updateConfiguration(config, 
            GetBaseContext().getResources().getDisplayMetrics());

দয়া করে মনে রাখবেন, কেবল প্রয়োগে নয়, যদি ডিভাইস সিস্টেমে ভাষাও পাওয়া যায় তবে এটি কাজ করে


0

আরবি / আরটিএল সমর্থনের জন্য

  1. আপনার অবশ্যই নিজের ভাষা সেটিংস আপডেট করতে হবে - সংযুক্তিবেস কনটেক্সট ()
  2. অ্যান্ড্রয়েড সংস্করণ এন এবং তারপরের জন্য আপনার অবশ্যই তৈরি কনফিগারেশন কনটেক্সট () এবং আপডেট কনফিগারেশন () ব্যবহার করতে হবে - অন্যথায় আরটিএল লেআউট সঠিকভাবে কাজ করছে না

 @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(updateBaseContextLocale(newBase));
    }

    public Context updateBaseContextLocale(Context context) {
        String language = SharedPreference.getInstance().getValue(context, "lan");//it return "en", "ar" like this
        if (language == null || language.isEmpty()) {
            //when first time enter into app (get the device language and set it
            language = Locale.getDefault().getLanguage();
            if (language.equals("ar")) {
                SharedPreference.getInstance().save(mContext, "lan", "ar");
            }
        }
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            updateResourcesLocale(context, locale);
            return  updateResourcesLocaleLegacy(context, locale);
        }

        return updateResourcesLocaleLegacy(context, locale);
    }

    @TargetApi(Build.VERSION_CODES.N)
    private Context updateResourcesLocale(Context context, Locale locale) {
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private Context updateResourcesLocaleLegacy(Context context, Locale locale) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        return context;
    }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.