ব্যবহারকারী ভাষা নির্বাচন করার সময় অ্যাপের ভাষা কীভাবে পরিবর্তন করবেন?


106

আমি চাই আমার অ্যাপ্লিকেশনটি তিনটি ভাষা স্প্যানিশ, পর্তুগিজ এবং ইংরেজি সমর্থন করে। এবং অ্যাপ্লিকেশনটিতে ভাষা নির্বাচন করার বিকল্প দিন I আমি তৈরি করেছি

1) 3 আঁকাযোগ্য ফোল্ডারগুলি অঙ্কনযোগ্য-এস, অঙ্কনযোগ্য-পিটি, অঙ্কনযোগ্য।

2) 3 টি মান ফোল্ডারের মান-এস, মান-পিটি, মানসমূহ। ভাষা অনুযায়ী স্ট্রিং.এক্সএমএল মান পরিবর্তন করুন।

ভাষা বাছাই করার জন্য আমার কাছে চিত্র ভিউ রয়েছে Englishএখন এটিতে মেনু ক্লিক করুন যাতে ইংরাজী, স্প্যানিশ, পর্তুগিজ option

আমি এই কোড দ্বারা বিকল্প নির্বাচনের জন্য লোকেলের ভিতরে অ্যাপ্লিকেশন সেট করেছি

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.en:
             Locale locale = new Locale("en"); 
             Locale.setDefault(locale);
             Configuration config = new Configuration();
             config.locale = locale;
             getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
             Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
             break;

        case R.id.pt:
             Locale locale2 = new Locale("pt"); 
             Locale.setDefault(locale2);
             Configuration config2 = new Configuration();
             config2.locale = locale2;
             getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
             break;

        case R.id.es:
             Locale locale3 = new Locale("es"); 
             Locale.setDefault(locale3);
             Configuration config3 = new Configuration();
             config3.locale = locale3;
             getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());

             Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
             break;     
    }
    return super.onOptionsItemSelected(item);
}

আমি ম্যানিফেস্টে ঘোষণা করেছি- অ্যান্ড্রয়েড: কনফিগারেশন = "স্থানীয়"

এটি কাজ করে তবে এতে কিছু সমস্যা আছে।

সমস্যা: -

1) ভাষা নির্বাচন করা হলে, ভাষা নির্বাচনের চিত্র ধারণ করে এমন পর্দা পরিবর্তন হয় না তবে অন্যান্য স্ক্রিনগুলি পরিবর্তন হয়।

২) ওরিয়েন্টেশন পরিবর্তনের পরে অ্যাপের ফোনের লোকাল অনুসারে ভাষা পুনরুদ্ধার করুন।


1
২ য় সমস্যার android:configChanges="locale"জন্য যুক্ত করার চেষ্টা করুন: অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এর ভিতরে আপনার ক্রিয়াকলাপের জন্য
পার্থ দোশি

আমি আমার ম্যানিফেস্টে ইতিমধ্যে প্রতিটি ক্রিয়াকলাপে যুক্ত করেছি।
মুকেশ

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

উত্তর:


172

এটি ওয়েবপৃষ্ঠার জন্য অংশ: http://android.programmerguru.com/android-localization-at-runtime/

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

public void setLocale(String lang) { 
    Locale 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); 
    finish();
    startActivity(refresh); 
} 

আপনি নিম্নলিখিত প্যাকেজগুলি আমদানি করেছেন তা নিশ্চিত করুন:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

ক্রিয়াকলাপে অ্যান্ড্রয়েডে ম্যানিফেস্টে যুক্ত করুন : configChanges = "স্থানীয় | ওরিয়েন্টেশন"


2
হ্যা অবশ্যই. আমি ওয়েব পৃষ্ঠার অংশটি সরবরাহ করতে পারি। যেখানে আমাকে সরবরাহ করতে হবে দয়া করে আমাকে জানান। ধন্যবাদ।
উদয়

3
ফিনিস () যুক্ত করতে ভুলবেন না যাতে নেভিগেশন স্ট্যাকটিতে আপনার ক্রিয়াকলাপের দুটি অনুলিপি না থাকে।
জোয়েল টেপ্লি

6
finish()আগে বলা প্রয়োজন startActivity(refresh)। অন্যথায় অ্যাপ্লিকেশনটি পুনরায় চালু হওয়ার পরিবর্তে অ্যাপটি প্রস্থান করতে পারে।
মোহাম্মদ আলী

10
হাই, আমি এটি করেছি, এটি কাজ করে, তবে আমি যখন অ্যাপটি পুনরায় চালু করব তখন এটি ডিফল্ট ভাষায় ফিরে আসে ..
সোফিয়ান হাসেইনি

5
কনফিগারেশন কনফিগারেশন = নতুন কনফিগারেশন (newConfig); config.locale = লোকালে; আমার ক্ষেত্রে এই বার্তা পেয়েছি। এপিআই স্তরের অবচিত লোকেল 25
মিলন

9

ভাল সমাধান এখানে বেশ ভাল ব্যাখ্যা। তবে এখানে আরও একটি।

আপনার নিজস্ব CustomContextWrapperবর্ধিত শ্রেণি তৈরি করুন ContextWrapperএবং এটি সম্পূর্ণ অ্যাপ্লিকেশনটির জন্য লোকেল সেটিং পরিবর্তন করতে ব্যবহার করুন। এখানে ব্যবহারের সাথে একটি জিআইএসটি দেওয়া আছে।

এবং তারপরে CustomContextWrapperসেভ করা লোকেল আইডেন্টিফায়ার সহ কল করুন যেমন 'hi'ক্রিয়াকলাপ জীবনচক্র পদ্ধতিতে হিন্দি ভাষার জন্য attachBaseContext। ব্যবহার এখানে:

@Override
protected void attachBaseContext(Context newBase) {
    // fetch from shared preference also save the same when applying. Default here is en = English
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en");
    super.attachBaseContext(MyContextWrapper.wrap(newBase, language));
}

লিঙ্কের জন্য ধন্যবাদ এটা কাজ করছে কিন্তু আমি কিছু বিষয় বুঝতে পারে না, আমি শুধু নামক MyContextWrapper.warpমধ্যে onAttachআমার অ্যাপের মাত্র এক টুকরা কিন্তু ভাষা পুরো অ্যাপের জন্য পরিবর্তন করা হয়েছে, কিন্তু কার্যকলাপ শিরোনাম পরিবর্তন করা হয়নি, আমি এটা মনে করি কারণ ম্যানিফেস্ট শিরোনামগুলি প্রাধান্য পায়, তবে আমি যদি onAttachBaseContexআমার প্রয়োগের সাবক্লাসে একই পদ্ধতিটি কল করি তবে ক্রিয়াকলাপের শিরোনামগুলিও নির্বাচিত ভাষায় পরিবর্তিত হয়, তবে তারপরে পরিবর্তনগুলি কেবল সেই অংশটিকে প্রয়োগ করা হয় যা আমি ওয়ার্প পদ্ধতিতে ডাকা হয়, কেন এটি হয় ?
অভিনব চৌহান

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

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

ঠিক আছে! আমি নিশ্চিত যে প্রতি পর্দার জন্য আপনাকে এটি করতে হবে না, কেবল প্রথম ক্রিয়াকলাপ যা attachBaseContextকেবলমাত্র ফাংশনটি আরম্ভ করে এবং তার ভিতরেই । এবং এটি এটি সমস্ত পর্দার জন্য করে। আপনি কি আপনার অ্যাপ্লিকেশনটিতে সমস্ত ক্রিয়াকলাপের জন্য একটি 'বেসঅ্যাক্টিভিটি' তৈরি করেছেন?
Sud007

না আমি আমার অ্যাপ্লিকেশনটির সাবক্লাসে এটি চেষ্টা করে ভেবেছিলাম যে এটি সম্পূর্ণ প্রয়োগে প্রয়োগ করা হবে, তারপরে সমস্ত খণ্ডে, তবে দেখা যাচ্ছে যে wrap()কোডটি প্রতিটি কনফিগারেশনের পরিবর্তনে কার্যকর করা দরকার, তাই আমি এটিকে এতে রেখেছি বিমূর্ত ক্রিয়াকলাপ যা থেকে অন্যান্য সমস্ত ক্রিয়াকলাপ প্রসারিত, এখন এটি কাজ করছে
অভিনব চৌহান

6

আপনি হয় android:configChanges="locale"ম্যানিফেস্ট থেকে সরিয়ে ফেলুন , যা ক্রিয়াকলাপটিকে পুনরায় লোড করতে বা তদারকি করার onConfigurationChangedপদ্ধতিটি ঘটায় :

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
    // your code here, you can use newConfig.locale if you need to check the language
    // or just re-set all the labels to desired string resource
}

অ্যান্ড্রয়েড অপসারণ: ম্যানিফেস্ট থেকে কনফিগারেশন = "স্থানীয়" অ্যাপ্লিকেশনটিকে পুনরায় আরম্ভ হতে বাধা দেয় না। এটি প্রকাশ্যে যুক্ত হয়েছে কিনা তা নির্বিশেষে এটি পুনরায় চালু হবে।
পোর্টফোলিওবিল্ডার

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

6

উপরের সমস্ত উদয় এর কোড নিখুঁত তবে কেবল একটি জিনিস অনুপস্থিত (build.gradle এ ডিফল্ট কনফিগারেশন)

public void setLocale(String lang) { 
Locale 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); 
finish();
startActivity(refresh); 

}

কনফিগার ফাইলে ভাষার ভাষাগুলি উল্লেখ না করায় খনি আমার কাজ করছে না (build.gradle)

 defaultConfig {
    resConfigs "en", "hi", "kn"
}

এর পরে, সমস্ত ভাষা চলমান শুরু করে


3
এটি কাজ করছে না
ক্রুনাল শাহ

আসলেই কি দরকার?
জে কার্লোসআর

1
@JCarlosR হ্যাঁ যখন আমি কনফিগার ফাইলে ভাষা যুক্ত করেছি উদয়ের কোড চলতে শুরু করেছে
লোকেশ তিওয়ারি

3

যারা সংস্করণটি পেয়েছেন তারা এই কোডটি ব্যবহার করে দেখুন ..

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        android.content.res.Configuration config = new 
        android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        //restart base activity 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }

2

উদয়ের নমুনা কোডটি ভালভাবে কাজ করে। পুনরায় প্রবেশের জন্য সোফিয়ান হাসেইনি এবং চিরাগ সোলঙ্কির প্রশ্ন বাদে এটি কার্যকর হয় না। আমি সুপার.অনক্রিয়েট (সেভেনস্ট্যান্সস্টেট) এর আগে, অনক্রিট () -তে ক্রিয়াকলাপটি পুনরায় চালু না করেই উদয়ের কোডটি কল করার চেষ্টা করি; তাহলে ঠিক আছে! কেবলমাত্র কিছুটা সমস্যা, মেনু স্ট্রিংগুলি এখনও লোকাল সেটটিতে পরিবর্তিত হয়নি।

    public void setLocale(String lang) { //call this in onCreate()
      Locale 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); 
      //finish();
    } 

মেনু স্ট্রিং সঙ্গে একই সমস্যা। আপনি কি সমস্যার সমাধান করেন?
অ্যালেক্স

@ অ্যালেক্স, আমি মেনু স্ট্রিংয়ে সমস্যাটি সমাধানের উপায় খুঁজে পাইনি। তবে অ্যাপটি থেকে বেরিয়ে এসে আবার প্রবেশ করতে পাওয়া গেছে, মেনু স্ট্রিংগুলি সাধারণত নতুন লোকালে পরিবর্তন করা যায়।
ফিশার

মানে Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh); ?
অ্যালেক্সএস

2
@ অ্যালেক্স, না! নতুন ইন্টেন্ট () এবং স্টার্টঅ্যাক্টিভিটি () যুক্ত করা অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় এটি ডিফল্ট ভাষায় ফিরে আসতে পারে। আমি যা বলতে চাইছি তা হল যদি ব্যবহারকারীরা অ্যাপটি থেকে বেরিয়ে আসে এবং অ্যাপটি পুনরায় প্রবেশ করে, মেনু স্ট্রিংগুলি নতুন লোকালে পরিবর্তন করা যেতে পারে।
ফিশার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.