iPhone 현지화 : 각 언어에 대한 NIB를 복사하지 않고도 NIB 파일을 쉽게 번역 할 수 있습니까?
-
03-07-2019 - |
문제
iPhone 응용 프로그램에서 모든 가시적 인 문자열을 번역하는 관리 가능한 방법을 찾으려고 노력하고 있습니다. 공식 Apple 문서는 프로그래밍 방식 문자열에 .Strings 파일을 사용한다고 말하면서 Xcode의 "Localized File 추가"옵션을 사용하여 NIB 파일을 현지화합니다.
내가 여기서 볼 수있는 문제는 현지화가 발생한 후 UI가 변경되어야한다면 각 언어의 펜촉을 개별적으로 최적이지 않은 것입니다. NIB 파일에 표시된 문자열을 .Strings 파일의 관련 값에 묶는 더 간단한 방법이 있습니까? 아니면 각 UI 요소에 대한 문자열을 프로그래밍 방식으로 설정해야합니까 (약간 낫지 만 여전히 성가신)?
해결책
당신이 할 수있는 최선은 각보기를 통해 재귀 적으로 루프 한 다음 텍스트를 설정하는 것입니다.
static void translateView(NSBundle *bundle, UIView *view)
{
id idView = view;
if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)])
[idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]];
if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)])
[idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]];
if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)])
[idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]];
if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)])
[idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]];
if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)])
[idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal];
if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]])
for (UIBarItem *item in [idView items])
[item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]];
for (UIView *subview in [view subviews])
translateView(bundle, subview);
}
경고 : 다른 선택기 세트를 확인하여 모든 것을 잡을 수 있습니다. 이것은 모범 사례는 아니지만 작업이 훨씬 적은 것 같습니다.
다른 팁
Apple의 내장 명령 줄 프로그램 ibtool을 사용하면이를 수행 할 수 있습니다. XIB에서 문자열을 버리고 로컬라이즈 한 다음 기존 XIB를 기반으로하지만 현지화 된 문자열을 사용하여 새 XIB를 만들 수 있습니다. 따라서 현지화 된 문자열이 변경 될 때마다 항상 XIB의 기본 세트를 갖고 모두 재현 할 수 있습니다. 추가 정보는 여기에 있습니다 : http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.
명령 줄 도구 인 ibtool에 대해 읽고 싶다고 생각합니다. 원하는대로 단순화해야합니다.
이 간단한 가이드에 따라 펜촉을 복제하지 않고도 자동으로 현지화 할 수 있습니다.
http://programminghacks.net/2011/06/03/ios-nib-localization-localizable-strings/
아마도 모든 문자열을 수동으로 업데이트해야 할 것입니다. 사용자가 언어를 변경하면 배열에서 번역 된 문자열을 가져온 다음 UI로 변경할 때 다른 언어로 문자열의 배열 또는 XML 파일이 있다고 가정 해 봅시다.
마르코
나는 항상 viewDidload () 메소드에 필요한 모든 문자열을 .xib에 자리 표시 자만 가지고있는 것만으로 설정했습니다. 이렇게하면 .String 파일을 업데이트하여 .xib를 쉽게 로컬화할 수 있습니다.