2015-02-03 3 views
0

사용자가 내 앱에서 콘텐츠를로드 할 수 없다는 메일을 받기 전까지 언어 전환기가 작동했습니다.iOS - 앱의 언어 전환기 | 언어가 영어로 설정되지 않은 경우 표시되지 않는 콘텐츠 (미국)

약간의 대화 후에 사용자가 iDevice 언어를 영어 (영국)로 설정했다고 말했습니다. 나는 그것을 영어 (미국)로 바꾸라고 말했고, 앱은 예상대로 작동했다.

이제

내 앱이 기기의 언어는 기본적으로 영어 이외의 또는 이탈리아어 영어 (및 콘텐츠)에 다시 떨어질하지만 필요하면 작동하지 왜 난 정말 이해가 안 돼요 영어 (미국) 이외의 언어 세트. 여기

내가 설정 페이지를로드하는 데 사용하고 코드 (A PLIST 파일) 내 장치에서, 심지어는 잘 작동하고 시뮬레이터에

+ (NSArray*)readSettingsPlist{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Settings.plist"]; 

    NSBundle *bundle; 

    UALog(@"%@",[NSLocale preferredLanguages]); 

    if ([[NSLocale preferredLanguages] containsObject:@"en"] || [[NSLocale preferredLanguages] containsObject:@"it"]){ 
     bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]; 
    } 
    else{ 
     bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]]; 
    } 


    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
    { 
     plistPath = [bundle pathForResource:@"Settings" ofType:@"plist"]; 
    } 

    return [NSArray arrayWithContentsOfFile:plistPath]; 

} 

, 그러나 나는 어떤 방법이 있는지 알고 싶습니다 영어 (미국)가 아닌 다른 언어를 사용하는 사람들이 콘텐츠를 올바르게로드 할 수 있도록이 코드를 개선해야합니다.

미리 감사드립니다.

답변

2

두 질문 :

1) 어떻게 PLIST는 NSDocumentDirectory에서 끝나는가? 그것이 발견 된 후에 거기에 복사됩니까? 왜 당신은 Main Bundle에서 파일을 사용하지 않습니까? 앱을 실행 한 후에 다른 언어를 선택하더라도 해당 파일은 항상 우선 순위를 갖습니다.

2) [[NSLocale preferredLanguages] objectAtIndex:0]@"en" 또는 @"it"이 아닌 경우 어떻게됩니까? 그럼 당신은 전무하다 번들 경로를 가질 수있다 (당신이 @"en" 또는 @"it" 외에 다른 .lproj 폴더 디렉토리를 언급하지 않았습니다.

을 나는 같은 것을 할 수

for (NSString* lang in [NSLocale preferredLanguages]) 
{ 
    bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]; 
    if (bundle) break; 
} 
//fallback to @"en" if bundle is still nil 
if (!bundle) 
{ 
    bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]]; 
} 
+0

1) 네, 처음 복사됩니다, 나는 내 응용 프로그램에서 이탈리아어와 영어를 모두 지원하기 때문에이 작업을 수행 했으므로 응용 프로그램에서 선택한 언어를 기반으로하는 문서 디렉토리에서 파일을로드하는 것을 "강요"했습니다. 2) 정확하게 무엇을하려했는지, 사용자의 기기 언어와 독립적으로 영어 로케일로 대체합니다. 코드를 시도해보고 알려 드리겠습니다. – Phillip

+0

테스트를 거쳤으며 완벽하게 작동합니다! 고마워. – Phillip

+1

큰 프로덕션 응용 프로그램에서 다음과 같은 정확한 문제를 해결했습니다. 1) 발견 된 로켈 문자열을 NSUserDefaults에 저장합니다. 2) 응용 프로그램 delegate에서 'applicationDidBecomeActive : (UIApplication *) application'은 저장된 로케일이 탐지 된 로케일과 같은지 확인합니다. 그렇지 않으면 모든 것을 재설정하고 새 로케일 설정을 사용하십시오. 이렇게하면 파일을 문서 디렉토리에 복사 할 필요가 없으며 사용자가 앱을 처음 실행 한 후 언어를 변경할 수 있습니다. – dmorrow

관련 문제