번역되지 나는 현재 영어와 인도네시아어를 지원하는 프로젝트를 진행하고안드로이드 언어 변경 만 : 일부 문자열이 제대로
(나는 게시물의 하단에 업데이 트를 추가했습니다). 영어의 기본 strings.xml에 모든 문자열을 작성했습니다. 그리고 나서 "값 입력"폴더를 만들고 해당 폴더에 strings.xml을 복사하고 테스트를 위해 일부 텍스트를 변경했습니다.
BaseActivity, Application 클래스 및 LocaleHelper를 사용하여 내 응용 프로그램의 현지화를 관리합니다. 그리고 나서 내 응용 프로그램에서이 동작을 발견했습니다.
- 가 조각 나는 인도네시아로 setLocale 후
- SettingsActivity
HomeActivity에서 탐색보기 안에 SettingsActivity의 모든 문자열이
있습니다 : 나는 그런 "도움말", 그리고이 개 자리에 "설정"등의 문자열을 사용 HomeActivity가 동일한 문자열을 가지고 있음에도 불구하고 변경되고 수정되었습니다. 앱을 다시 시작하려고했지만 아직 작동하지 않습니다. 홈 액티비티에는 여전히 영어 단어가 있지만 SettingsActivity에는 번역 된 단어가 있습니다.나는 활동의 일부 단어가 번역되었지만 조각과 recyclerview의 모든 단어는 전혀 번역되지 않은 또 다른 활동이 있습니다.
번역이 제대로되지 않은 이유를 여전히 찾을 수 없습니다. 누군가가 나를 도울 수 있습니까 ??
Application 클래스
@Override
public void onCreate() {
super.onCreate();
LocaleUtil.setLocale(new Locale(LocaleUtil.with(this).getPreference()));
LocaleUtil.updateConfig(this,getBaseContext().getResources().getConfiguration());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleUtil.setLocale(new Locale(LocaleUtil.with(this).getPreference()));
LocaleUtil.updateConfig(this, newConfig);
}
BaseActivity
public BaseActivity() {
LocaleUtil.updateConfig(this);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
initLocale();
super.onCreate(savedInstanceState);
}
public void initLocale(){
localeUtil = new LocaleUtil(this);
localeUtil.setListener(this);
localeUtil.setLanguageByCode(localeUtil.getPreference());
}
LocaleUtil 클래스
public class LocaleUtil {
private static Locale sLocale;
public static final String LOCALE_PREF="locale_pref";
public static final String ENGLISH="en";
public static final String INDONESIA="in";
private Context context;
private LocaleListener listener;
public LocaleUtil(Context context){
this.context = context;
}
public static LocaleUtil with(Context context){
return new LocaleUtil(context);
}
public void setListener(LocaleListener listener){
this.listener = listener;
}
public static void setLocale(Locale locale) {
sLocale = locale;
if(sLocale != null) {
Locale.setDefault(sLocale);
Configuration configuration = new Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(sLocale);
}
}
}
public static void updateConfig(ContextThemeWrapper wrapper) {
if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Configuration configuration = new Configuration();
configuration.setLocale(sLocale);
wrapper.applyOverrideConfiguration(configuration);
}
}
public static void updateConfig(Application app, Configuration configuration) {
if (sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
//Wrapping the configuration to avoid Activity endless loop
Configuration config = new Configuration(configuration);
// We must use the now-deprecated config.locale and res.updateConfiguration here,
// because the replacements aren't available till API level 24 and 17 respectively.
config.locale = sLocale;
Resources res = app.getBaseContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
}
}
public void updateConfig(Locale locale){
Configuration config = context.getResources().getConfiguration();
Locale.setDefault(locale);
config.locale = locale;
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
public void setLanguageByCode(String code){
savePreference(code);
Locale locale = new Locale(code);
setLocale(locale);
updateConfig(locale);
if(listener!=null)listener.onLocalChanged();
}
public String getLanguageCode(String languageName){
String locale="";
if(languageName.equals(context.getString(R.string.indonesia))){
locale=INDONESIA;
}else if(languageName.equals(context.getString(R.string.english))){
locale=ENGLISH;
}
return locale;
}
public void setLanguageByName(String language){
setLanguageByCode(getLanguageCode(language));
}
public void savePreference(String locale){
GlobalFunction.storeSetting(context,LOCALE_PREF, locale);
}
public String getPreference(){
return GlobalFunction.getSetting(context,LOCALE_PREF,"");
}
public interface LocaleListener{
void onLocalChanged();
}
}
내 문자열을 파일 : 여기
몇 조각의도와주세요! 감사!!
(UPDATE)
나는 내가이 recyclerview와 조각의 모든 뷰의 strings.xml의에 액세스 할 때마다 다시 setlocale에 할 필요가 있음을 발견했다. 이것은 완전히 불편하며 성능에 대해 걱정합니다. 나는 언어를 바꾸기 위해 더 나은 조언을 듣고 싶다.
정말 로케일을 직접 변경하는 것은 아닙니다. 대부분 작동하지만 시스템이 작동하는 방식은 시스템 로케일을 따르고 절대로 변경하지 않는 것입니다. 자신을 변경하고 싶다면 자신 만의 문자열 시스템을 작성하는 것이 좋습니다. –
안녕하세요! 죄송 합니다만 잘못된 제목을 쓸 수도 있습니다. 내 말은 내 앱에서이 "언어 변경"설정을 사용 중이므로 앱에서만 언어를 변경해야한다는 것입니다. "문자열 시스템"을 작성하는 방법에 대해 더 설명하거나 참조 할 수 있습니까? 감사! – Kyk