ProgramingTip

Android의 다른 로케일에서 어디서 얻는 방법은 무엇입니까?

bestdevel 2020. 12. 3. 08:15
반응형

Android의 다른 로케일에서 어디서 얻는 방법은 무엇입니까?


따라서 장치 / 앱의 현재 로케일 설정에 관계없이 여러 로케일에서 값을 갖고 싶습니다. 어떻게해야합니까?

기본적으로 내가 필요한 것은 함수 getString(int id, String locale)가 아니라이getString(int id)

어떻게 할 수 있습니까?

감사합니다


참고 최소 API가 17+ 인 경우이 답변의 맨 아래로 바로 이동하십시오. 일련의 계속 되십시오 ...

다른 로케일에 대한 다양한 res 폴더가있는 경우 다음과 같이 할 수 있습니다.

Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
String str = resources.getString(id);

또는 @jyotiprakash가 도입 방법을 사용하여 활동을 다시 시작할 수 있습니다.

참고Resources이와 같이 생성되는 호출 하면 Android에서 내부적으로 변경됩니다. 원래 로케일로 생성 해 호출하여 원래대로 되돌려 야합니다.

편집 특정 로케일에서 리소스를 검색하는 약간의 다른 (그리고 다소 깔끔한) 레시피는 다음과 있습니다.

Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = desiredLocale; // whatever you want here
res.updateConfiguration(conf, null); // second arg null means don't change

// retrieve resources from desired locale
String str = res.getString(id);

// restore original locale
conf.locale = savedLocale;
res.updateConfiguration(conf, null);

API 레벨 17 conf.setLocale()부터는 직접 설정 하는 대신을 사용해야 합니다 conf.locale. 오른쪽에서 왼쪽 및 왼쪽에서 오른쪽으로 전환하는 경우 구성의 레이아웃 방향이 업데이트됩니다. (레이아웃 방향은 17 년에 도입했습니다.)

Configuration호출 updateConfiguration하면 얻은 원래 구성이 변경 되므로 @Nulano 주석에서 제안한가대로 object- 를 생성 할 필요가 없습니다 res.getConfiguration().

getString(int id, String locale)에 대해 여러 로케일 문자열 리소스를로드하려는 경우 이를 하나의 메서드 로 묶는 것을 주저합니다 . 레시피를 사용하여 로케일을 변경하려는 프레임 워크가 모든 리소스를 다시 바인딩해야하는 작업을 수행해야합니다. 로케일을 한 번 업데이트하고 필요한 모든 것을 검색 한 다음 로케일을 다시 설정하는 것이 좋습니다.

편집 (@Mygod에게 감사드립니다) :

최소 API 수준이 17 이상이면 다른 방식 의이 대답많음 훨씬 더 나은 접근 방식 있습니다. 예를 들어 다음을 사용하여 Resource필요한 각 로케일에 대해 하나씩 여러 개체를 만들 수 있습니다 .

@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) {
    Configuration conf = context.getResources().getConfiguration();
    conf = new Configuration(conf);
    conf.setLocale(desiredLocale);
    Context localizedContext = context.createConfigurationContext(conf);
    return localizedContext.getResources();
}

그런 다음 Resource이 메소드에 의해 반환 된 지역화 된 개체 에서 원하는 리소스를 검색합니다 . 리소스를 검색 한 후에는 아무것도 할 필요가 없습니다.


다음은 Ted Hopp이 접근 방식의 결합 된 버전입니다 . 이런 식으로 코드는 모든 Android 버전에서 작동합니다.

public static String getLocaleStringResource(Locale requestedLocale, int resourceId, Context context) {
    String result;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // use latest api
        Configuration config = new Configuration(context.getResources().getConfiguration());
        config.setLocale(requestedLocale);
        result = context.createConfigurationContext(config).getText(resourceId).toString();
    }
    else { // support older android versions
        Resources resources = context.getResources();
        Configuration conf = resources.getConfiguration();
        Locale savedLocale = conf.locale;
        conf.locale = requestedLocale;
        resources.updateConfiguration(conf, null);

        // retrieve resources from desired locale
        result = resources.getString(resourceId);

        // restore original locale
        conf.locale = savedLocale;
        resources.updateConfiguration(conf, null);
    }

    return result;
}

사용 예 :

String englishName = getLocaleStringResource(new Locale("en"), R.string.name, context);

노트

원래 답변에서 이미 언급했듯이 위 코드의 여러 호출을 단일 구성 변경 및 여러 resources.getString () 호출로 대체하는 것이 더 많이 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/9475589/how-to-get-string-from-different-locales-in-android

반응형