2012-07-20 2 views
6

내 응용 프로그램 언어를 변경하려는 응용 프로그램의 옵션이 필요합니다 (응용 프로그램 언어가 전체 시스템이 아님), 제게 몇 가지 힌트를 주시겠습니까?전체 기기가 아닌 iOS에서 응용 프로그램 언어 설정을 변경하십시오

미리 감사드립니다.

현지화에 대해 알고 있습니다!

+0

이 게시물은 좋은 출발점이라고 생각합니다. http : // stackoverflow.com/questions/1669645/how-to-force-nslocalizedstring-to-a-specific-language –

+0

저는 장치가 없어도 응용 프로그램의 언어 만 변경할 수 있다고 생각합니다. –

+0

@VineeshTP 개발하는 동안 장치 및 시뮬레이터의 언어 설정을 변경할 수 있습니다. 내 대답 좀 봐. – Abizern

답변

2

Xcode에서 설정 한 사용자 지정 빌드 플래그를 사용하여이 작업을 수행 할 수 있습니다. 이 방법을 사용하면 장치의 모든 설정을 변경하는 대신 현지화로 응용 프로그램을 실행할 수 있습니다.

나는 http://abizern.org/2012/03/18/simple-localisation-testing/

에서 그것에 대해 블로그 포스트를 작성했습니다 그리고 당신은 행동에서 볼하는 데 사용할 수있는 Github에서의 예제 프로젝트가 : https://github.com/Abizern/SimpleLocalisationTesting

+0

동일한 질문이 있지만 어떻게 찾을 수 있습니까? AppleLanguages ​​soryy iOS를 처음 사용했습니다. –

+0

런타임시 전달할 수있는 플래그 중 하나 일뿐입니다. – Abizern

+1

문서를 보내 주셔서 감사합니다. 그러나이 문서에서 newbs에 대해 설정하는 방법이 완전히 명확하지 않습니다 – User16119012

1

사전 배열로 채워진 .plist로 만든 사용자 정의 현지화를 만들었습니다. 이처럼 내 프로젝트에서

kYes 
    en = @"Yes" 
    ru = @"Да" 
kNo 
    en = @"No" 
    ru = @"Нет" 

나는이 문자열을 읽기 위해 싱글 톤 클래스를했다. 옵션에서 사용자는 필요한 언어를 선택합니다 (처음에는 현재 시스템 상태에서 언어를 선택하거나 기본 시스템을 설정합니다). 선택한 언어는 다음 시작시 사용할 파일 또는 설정에 저장해야합니다. 싱글 톤에서 나는 +getStringWithKey:을가집니다. 그래서 거기에 @ "kYes"를 전달하고 응용 프로그램의 현재 지역화를위한 문자열을 얻습니다. 또한 프로젝트에 표준 현지화 파일을 추가해야합니다. 비어있는 경우에도 지원하지 않으면 모든 언어가 iTunes에 표시되지 않으므로 비어있는 경우에도 프로젝트에 추가해야합니다.

1

실제로하는 방법에 대한 다른 아이디어를 생각했다가 모든 문자열을 수동으로 설정합니다. 2. 언어 설정이 변경되면 모든 요소를 ​​업데이트하는 메서드 (알림)를 제공합니다. 아이디어는 iOS가 지역화 된 버전의 문자열을 찾는 것과 동일한 방법을 기반으로합니다. 따라서 전제 조건으로 폴더 구조 language_id.lproj와 함께 번들 (예 : AppNameStrings.bundle)을 제공해야합니다. 여기서 language_id는 제공하려는 언어의 지정자입니다. 그런 번들은 설정 번들을 만들고 Finder에서 열고 번들을 생성하여 root.plist 파일을 삭제할 수 있습니다. 다음 번들에서 읽을 수있는 함수가 필요합니다. 다음은 지역화 된 문자열을 읽는 데 사용하는 두 가지 방법입니다. 당신은

[yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language] 

에 대한 NSBundle의 범주를 만들 필요가 귀하의 GlobalDefinitions.m 파일

NSBundle *yourNameBundle(void) { 
static NSBundle* bundle = nil; 
    if (!bundle) { 
    NSString* path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"YouNameBundle.bundle"]; 
    bundle = [NSBundle bundleWithPath:path]; 
    } 
    return bundle; 
} 
NSString *YourNameLocalized(NSString *stringToken, NSString *language) { 
    if (yourNameBundle()) { 
    return [yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language]; 
    } else { 
    return stringToken; 
    } 
} 

를이 코드 당신의 GlobalDefinitions.h 파일

#ifdef __OBJC__ 
NSBundle *yourNameBundle(void); 
NSString *YourNameLocalized(NSString *stringToken, NSString *language); 
#endif 

에 다음과 같은 방법을 넣고 표준 메소드가 언어 매개 변수를 놓치기 때문입니다. 당신의 방법에서는 해당 language.lproj/Root.strings 파일을 열고 stringToken을 검사합니다. 찾을 수 없으면 토큰을 반환하고 그렇지 않으면 텍스트 문자열을 반환합니다. 일부 텍스트의 현지화 된 버전이 필요할 때마다 예를 들어 label.text = YourNameLocalized (@ "토큰", [self provideLanguageIdentifier]); 너는 끝났어. 지금까지 해본 적이 없지만 제대로 작동합니다.

관련 문제