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
'ProgramingTip' 카테고리의 다른 글
Java는 HashMap 또는 HashTable에서 항목을 어떻게 주문합니까? (0) | 2020.12.03 |
---|---|
Android WebView가 쿠키 또는 비밀번호를 저장하지 않도록 설정 (0) | 2020.12.03 |
목록의 요소가 목록인지 확인하는 방법 (Python에서)? (0) | 2020.12.03 |
Twitter 부트 유효성 검사 Nav-Pills의 색상 변경 (0) | 2020.12.03 |
ASP.NET Web API에서 여러 Get 메서드를 사용하여 라우팅 (0) | 2020.12.03 |