2017-11-03 1 views
1

번역되지 나는 현재 영어와 인도네시아어를 지원하는 프로젝트를 진행하고안드로이드 언어 변경 만 : 일부 문자열이 제대로

(나는 게시물의 하단에 업데이 트를 추가했습니다). 영어의 기본 strings.xml에 모든 문자열을 작성했습니다. 그리고 나서 "값 입력"폴더를 만들고 해당 폴더에 strings.xml을 복사하고 테스트를 위해 일부 텍스트를 변경했습니다.

BaseActivity, Application 클래스 및 LocaleHelper를 사용하여 내 응용 프로그램의 현지화를 관리합니다. 그리고 나서 내 응용 프로그램에서이 동작을 발견했습니다.

  1. 가 조각 나는 인도네시아로 setLocale 후
  2. 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(); 
    } 
} 

내 문자열을 파일 : 여기

몇 조각의 my strings file

도와주세요! 감사!!

(UPDATE)

나는 내가이 recyclerview와 조각의 모든 뷰의 strings.xml의에 액세스 할 때마다 다시 setlocale에 할 필요가 있음을 발견했다. 이것은 완전히 불편하며 성능에 대해 걱정합니다. 나는 언어를 바꾸기 위해 더 나은 조언을 듣고 싶다.

+0

정말 로케일을 직접 변경하는 것은 아닙니다. 대부분 작동하지만 시스템이 작동하는 방식은 시스템 로케일을 따르고 절대로 변경하지 않는 것입니다. 자신을 변경하고 싶다면 자신 만의 문자열 시스템을 작성하는 것이 좋습니다. –

+0

안녕하세요! 죄송 합니다만 잘못된 제목을 쓸 수도 있습니다. 내 말은 내 앱에서이 "언어 변경"설정을 사용 중이므로 앱에서만 언어를 변경해야한다는 것입니다. "문자열 시스템"을 작성하는 방법에 대해 더 설명하거나 참조 할 수 있습니까? 감사! – Kyk

답변

0

확인해보세요. 어쩌면 일부 문자열이 포함되지 않을 수 있습니다. 문서에서.

https://developer.android.com/guide/topics/resources/localization.html#using-framework

는 응용 프로그램의 기본 언어가 영어라고 가정하자. 도 응용 프로그램의 모든 텍스트를 프랑스어 프랑스어로 번역하고 응용 프로그램의 텍스트 대부분 (응용 프로그램 제목 제외)을 일본어로 번역한다고 가정합니다.,

고해상도/값/strings.xml의 응용 프로그램이 사용 모든 문자열에 대한 영어 텍스트를 포함합니다 :이 경우 세 가지 대안 strings.xml의 파일, 로케일 고유의 자원 디렉토리에 저장된 각을 만들 수 있습니다 title이라는 문자열에 대한 텍스트를 포함하여. res/values-fr/strings.xml 모든 문자열에 대해 제목이 포함 된 의 불어 텍스트가 들어 있습니다. res/values-ja/strings.xml 에 대한 일본어 텍스트가 제목을 제외한 모든 문자열을 포함합니다. 자바 코드가 R.string.title 인 경우 다음은 런타임에 발생하는 내용입니다.

기기가 프랑스어 이외의 언어로 설정된 경우 Android는 res/values ​​/ strings에서 제목을로드합니다. XML 파일. 기기가 에서 프랑스어로 설정된 경우 Android는 res/values-fr/strings.xml 파일에서 제목을로드합니다. 기기가 일본어로 설정된 경우 Android는 res/values-ja/strings.xml 파일에서 제목이 으로 표시됩니다. 그러나 해당 파일에 문자열이 포함되어 있지 않으므로 Android 은 기본값 인으로 되돌아 가서 res/values ​​/ strings.xml 파일에서 영어로 제목을로드합니다.

희망 하시겠습니까?

관련 문제