Android는 기본이 아닌 현재 로케일을 가져옵니다.


300

Android에서 사용자의 현재 로케일을 얻으려면 어떻게합니까?

나는 기본값을 얻을 수 있지만 이것이 현재의 것이 아닐 수 있습니까?

기본적으로 현재 로캘의 두 문자 언어 코드가 필요합니다. 기본이 아닙니다. 없습니다Locale.current()


default()꽤 안전한 내기입니다 (문서와 같이 처리에 사용하지 마십시오).
A--C

@ A--C 처리에 사용합니까?
CQM

예, 문서에서 말하는 내용을 확인하십시오 . 일부 로케일은 ','를 소수점으로 사용하고 '.' 숫자 그룹화. parseInt ()와 같은 것들이 실패 할 수 있습니다. 여전히을 사용하는 것이 좋지만 default()코드를 손상시킬 수있는 것은 아닙니다.
A--C

답변:


487

기본값 Locale은 시스템 속성 설정에서 응용 프로그램 프로세스에 대해 런타임시 정적으로 구성되므로 응용 프로그램이 시작될 때Locale 해당 장치 에서 선택한 것을 나타냅니다 . 일반적으로 이것은 좋지만 응용 프로그램 프로세스가 실행 된 후 사용자가 설정을 변경 하면 값 이 즉시 업데이트되지 않을 것입니다.LocalegetDefaultLocale()

응용 프로그램에서 어떤 이유로 이런 이벤트를 트랩 해야하는 경우 대신 Locale자원 Configuration객체 에서 사용 가능한 것을 얻으려고 시도 할 수 있습니다.

Locale current = getResources().getConfiguration().locale;

응용 프로그램에 필요한 경우 설정이 변경된 후이 값이 더 빨리 업데이트 될 수 있습니다.


1
시스템에서 변경할 때 앱에서 기본 로캘이 변경되지 않았는지 확인한 사람이 있습니까? 나는 그것이 활동을 파괴하고 재창조하게 만드는 "구성 변경"중 하나라고 생각합니다.
Michał K

11
로케일을 변경하는 동안 출력하여 테스트했습니다. 결과는 출력이 동일합니다. 따라서 Locale.getDefault ()는 즉시 업데이트되므로 안전하게 사용할 수 있습니다. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio

58
이것은 Configuration 클래스에서 더 이상 사용되지 않습니다.이 조언에 대한 최신 문서를 참조하십시오.locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth

7
왜 이상한 getLocales (). get (0)을 피하기 위해 getFirstLocale () 메소드를 추가하지 않습니까?
user3290180

1
이전 및 최신 버전의 API를 지원하려면 어떻게해야합니까?
Ivan

179

Android N (Api 레벨 24) 업데이트 (경고 없음) :

   Locale getCurrentLocale(Context context){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
            return context.getResources().getConfiguration().getLocales().get(0);
        } else{
            //noinspection deprecation
            return context.getResources().getConfiguration().locale;
        }
    }

6
if-else를 피하기 위해 지원 라이브러리에 무언가가 있습니까?
Federico Ponzi

8
if 및 fallback 코드를 포함하면 @TargetApi (Build.VERSION_CODES.N)가 코드에 필요하지 않습니다
Patrick Favre

@FedericoPonzi no ResourceCompat는 25.0.1부터 로케일에 대한 방법을 가지고 있지 않은 것 같습니다
Patrick Favre

2
사용자가 여러 언어를 설치 한 경우 작동하지 않을 수 있습니다. LocaleList.getDefault().get(0);선호 언어별로 정렬 된 로케일을 리턴하므로이를 사용해야 합니다.
Curly

21
@FedericoPonzi @ for3st 나는 이것을 다음 ConfigurationCompat과 같이 발견 했다ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval

63

Android 지원 라이브러리를 사용하는 경우 ConfigurationCompat@Makalele의 방법 대신 사용하여 사용 중단 경고를 제거 할 수 있습니다 .

Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

또는 코 틀린에서 :

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]

8
문맥이 없다면 할 수도 있습니다ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Quentin G.

@QuentinG. 예, 그러나이 경우 응용 프로그램 컨텍스트 를 사용하는 것이 좋습니다 .
McMath

명확하게하기 위해 기본 로케일을 반환하지 않지만 사용자가 선호하는 로케일을 반환합니까?
Csaba Toth

12

에서 getDefault의 설명서 :

사용자가 선호하는 로캘을 반환합니다. 이 프로세스에 대해서는 setDefault (Locale)로 재정의되었을 수 있습니다.

또한 Locale문서에서 :

기본 로캘은 사용자에게 데이터를 제공하는 작업에 적합합니다.

그냥 사용해야하는 것 같습니다.


7
이 답변은 잘못되었습니다. 기본 로케일을 얻었지만 사용자가 즉시 변경하면 잘못 표시됩니다. 다음 답변은 정확합니다
user170317

동의하고 틀린 대답. 필자의 경우 getResources ()를 사용할 필요가없는 방법을 찾고 있었기 때문에 컨텍스트가 필요합니다. 내 문제는 컨텍스트가없는 도우미 클래스 였지만 전달해야한다고 생각합니다. 사람들이 로케일을 변경하고보기의 문자열, 숫자 형식 등을 변경할 수있는 앱이 있다면 Devunwired의 답변을 사용해야합니다
1mike12

나를 위해 일하십시오. 에 중단 점을 설정 Locale.setDefault()하면 기기 언어를 최소한 Android 5.0으로 다시 변경하면 호출됩니다 (테스트 한 한)
모호한

6

위의 모든 답변-작동하지 않습니다. 그래서 여기에 4와 9 안드로이드에서 작동하는 함수를 넣을 것입니다

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

장치 수준에서 사용자가 선호하는 언어 방향을 반환하는 몇 가지 답변 중 하나입니다. LocaleListCompat.getDefault()AndroidX를 사용 하는 경우 에도 사용할 수 있습니다 .

1

나는 이것을 사용했다 :

String currentLanguage = Locale.getDefault().getDisplayLanguage();
if (currentLanguage.toLowerCase().contains("en")) {
   //do something
}

0

공식 문서에 따르면 ConfigurationCompat 은 지원 라이브러리에서 더 이상 사용되지 않습니다.

당신은 사용을 고려할 수 있습니다

LocaleListCompat.getDefault()[0].toLanguageTag() 0 위는 사용자 선호 로케일입니다.

0 번째 위치에서 기본 로케일을 얻으려면 LocaleListCompat.getAdjustedDefault()


예. 그러나 androidx ConfigurationCompat 버전으로 대체되지 않았습니다. developer.android.com/reference/androidx/core/os/…
DragonLord

맞습니다. 아마 androidx 마이그레이션 때문에 언급되었을뿐입니다.
Rakshit Soni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.