장치에서 현재 언어를 가져옵니다


608

Android 기기에서 현재 언어를 선택하려면 어떻게해야합니까?


10
여기서 대부분의 답변은 응용 프로그램의 언어를 얻습니다. 코드에서 응용 프로그램의 기본 로캘을 설정할 수 있다고 가정하면 정답은 Sarpe에서 제공하는 답변으로 장치의 로캘을 제공합니다.
Victor Ionescu

@VictorIonescu 댓글 주셔서 감사합니다. Sarpe의 답변은 장치의 로캘을 가져 오는 정답입니다. 참조하십시오. stackoverflow.com/a/28498119/3762067
Varad Mondkar

답변:


834

장치의 선택된 언어를 얻으려면 다음이 도움이 될 수 있습니다.

Locale.getDefault().getDisplayLanguage();

73
getDisplayLanguage ()는 언어를 현지화합니다. ISO 코드를 얻는 데 관심이있는 경우 (예 : if 또는 switch 문) 'Locale.getDefault (). getISO3Language ();'를 사용하십시오.
nuala

13
getISO3Language ()는 de 대신 독일 (독일)에 대해 "deu"와 같은 것을 반환합니다.
Tobias

372
Locale.getDefault().getLanguage();일반적인 언어 코드 (예 : "de", "en")를 얻는 데 사용할 수 있습니다 .
muscardinus

35
@DeRagan, 이것은 항상 당신에게 당신의 장치에 대한 언어를 제공하지는 않지만 앱에 대해서만 언어를 제공합니다. 예를 들어, 호출 Locale.setDefault("ru")하고 시스템 설정의 언어가 영어로 설정된 경우 method Locale.getDefault().getLanguage()"ru"를 반환 하지만 "en" 은 반환 하지 않습니다 . 실제 SYSTEM 로캘 / 언어를 얻는 또 다른 방법이 있습니까? 여기에 문서화 된 해결책 이 없지만 더 우아한 해결책이 있습니까?
Prizoff

47
Locale.getDefault().toString()로케일을 완전히 식별하는 문자열 (예 : "en_US")을 선호 합니다.
Tom

835

내 Android 4.1.2 기기에서 로케일 메소드와 결과를 확인했습니다.

Locale.getDefault().getLanguage()       ---> en      
Locale.getDefault().getISO3Language()   ---> eng 
Locale.getDefault().getCountry()        ---> US 
Locale.getDefault().getISO3Country()    ---> USA 
Locale.getDefault().getDisplayCountry() ---> United States 
Locale.getDefault().getDisplayName()    ---> English (United States) 
Locale.getDefault().toString()          ---> en_US
Locale.getDefault().getDisplayLanguage()---> English
Locale.getDefault().toLanguageTag()     ---> en-US

7
고마워, 가능성의 목록과 함께 멋지다. "Tom"의 의견에서 제안한대로 "Locale.getDefault (). toString ()"을 추가 할 수 있습니까?
RenniePet

혼란 스러워요. 방금 DeRagan의 답변을 복사하셨습니까?
dieter

1
미안합니다. 내가 거기에 추가 한 것이 사실입니다. 여기에서 온 메모를 남겼어야합니다. 사람들이 필요한 답을 더 빨리 찾도록 돕기 위해 실수를했습니다. 당신이 분명히 더 나은 대답이기 때문입니다. 그러나 물론 사람들은 맨 위로 자주 보지 않기 때문에 결코 맨 위로 올 수 없습니다. 이 답변에서 나온 메모와 함께 거기에 추가해도 괜찮습니까?
Patrick Boos

1
다시 안녕하세요. 나는 그 해결책을 선호하지 않습니다. 현재 DeRagan의 답변은 1 위에 표시되고 광산은 2 위에 표시됩니다. 연구원의 경우 질문 페이지에서 두 번째 답변을 확인하는 것이 어렵지 않아야합니다. @pinki가 허용 된 답변을 변경하면 더 좋을 것입니다. 그러나 지난 3 개월 전에 핑키처럼 보였습니다.
trante

1
또한 Locale.getDefault().getDisplayLanguage()어떤 반환이 있습니다"English"
스포츠

105

나를 위해 일한 것은 다음과 같습니다.

Resources.getSystem().getConfiguration().locale;

Resources.getSystem() 시스템 리소스 (응용 프로그램 리소스 없음)에만 액세스 할 수 있고 현재 화면에 대해 구성되지 않은 전역 공유 리소스 개체를 반환합니다 (차원 단위를 사용할 수없고 방향에 따라 변경되지 않음 등).

때문에 getConfiguration.locale지금은 사용되지 않습니다, 안드로이드 누가의 기본 로케일을 얻을 수있는 좋은 방법입니다 :

Resources.getSystem().getConfiguration().getLocales().get(0);

이전 Android 버전과의 호환성을 보장하기 위해 가능한 해결책은 간단한 점검입니다.

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
    //noinspection deprecation
    locale = Resources.getSystem().getConfiguration().locale;
}

최신 정보

지원 라이브러리 26.1.0를 시작 하면 이전 버전과 호환되는 편리한 방법을 제공하므로 Android 버전을 확인할 필요가 없습니다 getLocales().

간단히 전화하십시오 :

ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration());

6
getConfiguration (). locale은 현재 사용되지 않습니다. 대신 getConfiguration (). getLocales (). get (0)을 사용하십시오.
Eliseo Ocampos

4
이것이이 질문에 대한 정답입니다. 다른 답변은 기기가 아닌 앱의 현지 정보를 얻습니다.
호프

6
답변이 작성되었을 때 이것이 존재했는지는 모르겠지만 지원 라이브러리에는 이전 버전과 호환되는 버전이 있으므로 이전 버전과의 호환성을 직접 작성할 필요가 없습니다. ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())
Thorbear

@Thorbear가 지적했듯이 이제 새로운 지원 라이브러리 방법을 사용하는 getLocales것이 좋습니다. 내 답변을 업데이트했습니다.
Sarpe

정답입니다. 다른 사람들은 시스템이 아닌 응용 프로그램 언어를 반환합니다.
Chintan Rathod 5

44

현재 로케일에서 언어를 '추출'할 수 있습니다. 표준 Java API 또는 Android 컨텍스트를 사용하여 로케일을 추출 할 수 있습니다. 예를 들어 아래 두 줄은 동일합니다.

String locale = context.getResources().getConfiguration().locale.getDisplayName();
String locale = java.util.Locale.getDefault().getDisplayName();

10
이것은 사실이 아닙니다. 그들은 달라요. 사용자가 로캘을 전환하면 첫 번째가 변경 될 수 있습니다. 두 번째는 전화기에 사전 설치된 것입니다. 사용자가 무엇을하든 변경되지 않습니다.
gregm

16
gregm의 댓글이 거짓 일 수 있습니다. airewyre의 답변을 참조하십시오.
jan groth

4
@gregm의 의견이 잘못되었습니다. 직접 시도해보십시오. 설정에서 언어를 변경하면 Locale.getDefault ()가 변경된다는 것을 알 수 있습니다.
Patrick Boos


@gregm의 의견이 잘못되었지만 그는 여전히 두 줄이 동일한 로케일을 반환 할 필요가 없다는 것이 맞습니다. Locale.setDefault()미리 다른 로케일로 전화 하면 다른 결과를 얻을 수 있습니다.
arekolek

35

다른 사람들의 시간 및 / 또는 혼란을 줄이기 위해 위에서 Johan Pelgrim이 제안한 두 가지 대안을 시도했으며 내 장치에서 기본 위치 변경 여부에 관계없이 동등하다는 것을 공유하고 싶었습니다.

따라서 내 장치의 기본 설정은 영어 (United Kindom)이며 Johan의 대답에있는 두 문자열 모두 동일한 결과를 제공합니다. 전화 설정에서 로케일을 변경하고 (예 : italiano (Italia)) 다시 실행하면 Johan의 답변에있는 두 문자열 모두 로케일을 italiano (이탈리아)로 지정합니다.

따라서 나는 Johan의 원래 게시물이 정확하고 gregm의 의견이 잘못되었다고 생각합니다.



17

이것을 사용할 수 있습니다

boolean isLang = Locale.getDefault().getLanguage().equals("xx");

"xx"가 "en", "fr", "sp", "ar".... 등과 같은 언어 코드 인 경우


3
if (Locale.ENGLISH.equals (Locale.getDefault (). getLanguage ())) {...}
Clement Martino

1
귀하의 제안 @ClementMartino 영어와 같은 미리 정의 된 로케일의 경우뿐만 아랍어와 같은 다른 로케일에 대한 확인, 우리는 LANG 코드를 사용하여 구문 분석해야
사이먼 K. Gerges

8

API 레벨이 24 이상이면 LocaleList.getDefault().get(0).getLanguage() 다른 것을 사용하십시오.Locale.getDefault.getLanguage()

private fun getSystemLocale(): String {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return LocaleList.getDefault().get(0).getLanguage();
    } else {
        return Locale.getDefault.getLanguage();
    }
}

참조 : https://developer.android.com/guide/topics/resources/multilingual-support


2020 년에 허용되는 답변이어야합니다!
Andrii Kovalchuk

6

Johan Pelgrim의 답변에 추가하려면

context.getResources().getConfiguration().locale
Locale.getDefault()

android.text.format.DateFormat클래스가 서로 호환 가능 하기 때문에 동일합니다.

private static String zeroPad(int inValue, int inMinDigits) {
    return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
}

public static boolean is24HourFormat(Context context) {
    String value = Settings.System.getString(context.getContentResolver(),
            Settings.System.TIME_12_24);

    if (value == null) {
        Locale locale = context.getResources().getConfiguration().locale;

    // ... snip the rest ...
}

5

시스템 리소스에서 로캘을 가져 오려고 시도 할 수 있습니다.

PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication("android");
String language = resources.getConfiguration().locale.getLanguage();

1
구성의 일부를 재정의 한 경우에 대한 답변입니다.
Takhion


4

이 솔루션은 저에게 효과적이었습니다. 이것은 당신에게 안드로이드 장치의 언어를 반환합니다 (앱의 현지 언어가 아님)

String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();

"en"또는 "de"또는 "fr"또는 장치 언어가 설정되어있는 모든 것을 반환합니다.


3

이 코드를 사용하여 키보드 전류를 찾을 수 있습니다

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodSubtype ims = imm.getCurrentInputMethodSubtype();
String locale = ims.getLocale();

3

두 가지 언어가 있습니다.

OS의 기본 언어 :

Locale.getDefault().getDisplayLanguage();

응용 프로그램의 현재 언어 :

getResources().getConfiguration().locale.getDisplayLanguage();//return string

3
사실은 아닙니다. 앱에서 로케일을 변경하면 시스템 값이 아닌 변경된 값을 먼저 제공하십시오.
Kra

3

언어를 선택하면이 그리스어를 입력 할 수 없습니다.

getDisplayLanguage().toString() = English
getLanguage().toString() = en 
getISO3Language().toString() = eng
getDisplayLanguage()) = English
getLanguage() = en
getISO3Language() = eng

이제 그리스어로 사용해보십시오

getDisplayLanguage().toString() = Ελληνικά
getLanguage().toString() = el
getISO3Language().toString() = ell
getDisplayLanguage()) = Ελληνικά
getLanguage() = el
getISO3Language() = ell

3

현재 언어를 확인하려면 @Sarpe (@Thorbear)의 답변을 사용하십시오.

val language = ConfigurationCompat.getLocales(Resources.getSystem().configuration)?.get(0)?.language
// Check here the language.
val format = if (language == "ru") "d MMMM yyyy г." else "d MMMM yyyy"
val longDateFormat = SimpleDateFormat(format, Locale.getDefault())

사용자의 현지 날짜 형식을 적용하려면을 사용하십시오 DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(Date()).
CoolMind

1
if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
    // your code here
}

2
이것이 왜 질문에 답하는지에 대한 자세한 내용을 추가하십시오. 코드 스 니펫만으로는 독자가 솔루션을 이해하는 데 도움이되지 않습니다.
Wand Maker

Locale.getDefault (). getDisplayName ()은 장치의 현재 언어를 제공합니다. 장치 언어가 힌디어인지 아닌지 확인하고 있습니다. 현재 장치 언어가 힌디어 인 경우 블록에서 원하는 것을 수행하십시오.
Pratibha Sarode

1

장치의 언어를 얻는 올바른 방법은 다음과 같습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return context.getResources().getConfiguration().getLocales().get(0);
} else {
    return context.getResources().getConfiguration().locale;
}

도움이 되길 바랍니다.


1
Locale.getDefault().getDisplayLanguage()

Written예를 들어 언어의 이름을 알려줍니다 .English, Dutch, French

Locale.getDefault().getLanguage()

당신을 줄 것이다 language code, 예를 들면 :en, nl, fr

두 방법 모두 String을 반환


1
public class LocalUtils {

    private static final String LANGUAGE_CODE_ENGLISH = "en";


    // returns application language eg: en || fa ...
    public static String getAppLanguage() {
        return Locale.getDefault().getLanguage();
    }

    // returns device language eg: en || fa ...
    public static String getDeviceLanguage() {
        return ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getLanguage();
    }

    public static boolean isDeviceEnglish() {
        return getDeviceLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }

    public static boolean isAppEnglish() {
        return getAppLanguage().equals(new Locale(LANGUAGE_CODE_ENGLISH).getLanguage());
    }


}

Log.i("AppLanguage: ",     LocalUtils.getAppLanguage());
Log.i("DeviceLanguage: ",  LocalUtils.getDeviceLanguage());
Log.i("isDeviceEnglish: ", String.valueOf(LocalUtils.isDeviceEnglish()));
Log.i("isAppEnglish: ",    String.valueOf(LocalUtils.isAppEnglish()));

1

다른 사람들은 장치 언어에 대한 좋은 답변을 주었고

당신이 원하는 경우 응용 프로그램 언어에게 그것이 추가하는 것입니다 할 수있는 가장 쉬운 방법은 app_lang당신의 열쇠 strings.xml파일을, 그리고뿐만 아니라 랭 가문의 각각에 대해 LANG을 지정합니다.

이렇게하면 앱의 기본 언어가 장치 언어와 다른 경우 서비스의 매개 변수로 보내도록 선택할 수 있습니다.


AssetManager가 현재 사용중인 언어를 제공하기위한 프레임 워크 지원이 없다고 믿을 수 없습니다. 실제로 Resources.java의 문자열 형식 헬퍼는 기본 로케일 [0]을 사용하므로 AssetManager의 문자열이 장치의 기본 로케일과 일치하지 않는 로케일에서 온 경우 (앱이 지원하지 않지만 다음을 지원하므로) 목록에) 버그가 있습니다.
dcow

1
public void GetDefaultLanguage( ) {
    try {
        String langue = Locale.getDefault().toString(); //        ---> en_US
        /*
        Log.i("TAG", Locale.getDefault().getLanguage() ); //       ---> en
        Log.i("TAG", Locale.getDefault().getISO3Language()  ); //  ---> eng
        Log.i("TAG", Locale.getDefault().getCountry()  ); //       ---> US
        Log.i("TAG", Locale.getDefault().getISO3Country()  ); //   ---> USA
        Log.i("TAG", Locale.getDefault().getDisplayCountry() ); // ---> United States
        Log.i("TAG", Locale.getDefault().getDisplayName() ); //    ---> English (United States)
        Log.i("TAG", Locale.getDefault().toString()   ); //        ---> en_US
        Log.i("TAG", Locale.getDefault().getDisplayLanguage() ); //---> English 
        */

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            langue = Locale.getDefault().toLanguageTag(); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }else{
            langue = langue.replace("_","-"); //     ---> en-US
            url_Api = getUrlMicrosoftLearn(langue);
            Log.i("TAG", url_Api );
            Log.i("TAG", langue );
        }
    }catch (Exception ex) {
        Log.i("TAG", "Exception:GetDefaultLanguage()", ex);
    }
}

public String getUrlMicrosoftLearn(String langue) {
    return "https://docs.microsoft.com/"+langue+"/learn";
}

코드를 붙여 넣는 것보다 답변에 지침을 더 추가 할 수 있다면 더 좋습니다.
Calos

0

내 솔루션은 다음과 같습니다

@SuppressWarnings("deprecation")
public String getCurrentLocale2() {
    return Resources.getSystem().getConfiguration().locale.getLanguage();
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getCurrentLocale() {
    getResources();
    return Resources.getSystem().getConfiguration().getLocales().get(0);
}

그리고

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Log.e("Locale", getCurrentLocale().getLanguage());
            } else {
                Log.e("Locale", getCurrentLocale2().toString());
            }

표시된 ---> ko


0

다음은 장치 국가를 가져 오는 코드입니다. 모든 안드로이드 버전의 오레오와 호환됩니다.

해결책 : 사용자가 국가를 얻는 것보다 SIM 카드를 가지고 있지 않은 경우 전화 설정 또는 현재 언어 선택 중에 사용됩니다.

public static String getDeviceCountry(Context context) {
    String deviceCountryCode = null;

    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(tm != null) {
            deviceCountryCode = tm.getNetworkCountryIso();
        }

    if (deviceCountryCode != null && deviceCountryCode.length() <=3) {
        deviceCountryCode = deviceCountryCode.toUpperCase();
    }
    else {
        deviceCountryCode = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0).getCountry().toUpperCase();
    }

  //  Log.d("countryCode","  : " + deviceCountryCode );
    return deviceCountryCode;
}

-3

인도에 거주하는 사용자가 힌디어를 사용하는 경우 특정 작업을 수행하려면 아래 조건을 사용하십시오.

if(Locale.getDefault().getDisplayName().equals("हिन्दी (भारत)")){
 //Block executed only for the users resides in India who speaks Hindi 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.