2011-10-10 4 views
3

여러 가지 변형이있는 앱을 만들고 있습니다.IOS/iPhone : 중첩 된 Localizable.strings 파일?

이러한 변형은 여러 Localizable.strings 파일의 일부 문자열로 제어됩니다.

그러나 문자열의 90 %는 동일하게 유지됩니다.

각각의 고유 한 Localizable.strings 파일이 "마스터"를 가져 와서 각 응용 프로그램 변형 파일을 변경할 필요가 없도록하고 싶습니다. 공통 문자열.

이것이 가능합니까?

답변

5

두 대안 : 당신을 위해 계층 조회를 수행 한 후 다시 기본 경우에 대한 NSLocalizedString 메커니즘 가을 NSLocalizedString 주위

  1. 를 사용하여 사용자 정의 래퍼 함수. 언어 당 Can .strings resource files be added at runtime?

  2. 를 사용하여 여러 .strings 파일 :

    나는 이전에이 작업을 수행하는 방법에 대한 답변을 썼다. 기본값 인은 "Localizable.strings"에서 검색되지만, NSLocalizedStringFromTable() 함수를 사용하면 사용자 정의 "테이블"이름을 지정할 수 있습니다. 따라서 "Configuration"을 테이블 이름으로 전달하면 "Configuration.strings"파일에서 내용을 볼 수 있습니다.

    나는 이것을 한 앱에서 일했습니다. 두 개의 .strings 파일이 있습니다. 하나는 브랜드 설정 (어떤 이름을 사용할 것인지, 어떤 이미지를 사용할 것인지, 어떤 서버를 사용할 것인지 등)를 제어하고 다른 하나는 실제 번역 된 모든 문자열을 포함 시켰습니다. 앱 번들에는 브랜딩 정보의 복사본이 하나만있을 것이고 맞춤 스크립트를 사용하여 컴파일 할 때 사용할 올바른 변형을 선택했습니다. 그것은 정말로 정말로 잘 돌아갔다.

+0

감사. 알겠습니다. 아마도 올바르게 수행하기 위해 약간의 연구를해야 할 것입니다. 그러나 옵션 2는 많은 의미를 갖습니다. Perl 스크립트는 저를 위해 속임수를 쓰었고, 이미 며칠 동안 (그리고 많은 변형들) 그것을 가지고 있었기 때문에, 나는이 프로젝트를 위해 그것을 고수해야 할 것입니다. –

1

나는 당신이 원하는 것이 무엇인지 잘 모르겠다.하지만 단지 몇 개의 문자열 만 번역하고 싶다면 그렇게 할 수있다.

이러한 문자열의 일부만 번역 할 수 있습니다. 번역이 없으면 ios가 응용 프로그램 언어의 문자열을 선택하여 표시합니다. 따라서 응용 프로그램 언어의 Localizable.strings은 마스터 언어와 같이 고려 될 수 있습니다.

+0

감사합니다. 그러나 그것은 내가 필요한 것입니다. 표시되는 모든 단일 문자열은 Localized.strings 파일에서 가져옵니다. 그러나 앱 변종 간의 변경 사항은 거의 없습니다. 대다수는 동일합니다. 즉, 각 변형에 대해 파일의 전체 복사본을 만들어야합니다. 그런 다음 문자열을 추가하거나 변경할 때 모든 단일 변형에 들어가서 해당 문자열을 변경해야합니다. 실수하기 쉽습니다. 나는 변종의 특정 파일에 포함 된 하나의 파일에 모든 공유 문자열을 갖는 것을 선호합니다. 그러나 .strings 파일을 사용자 지정 형식으로 나타납니다. –

2

불행히도 Apple은 Localizable.strings 파일을 지원하지 않습니다.

sed을 사용하여 사용자 지정 Ruby 또는 Python 스크립트 또는 Bash 스크립트를 통해 해당 기능을 모방 할 수 있습니다. 스크립트는 루트 .strings 파일을 가져 와서 각 변형의 .strings 파일에 내용을 복사 할 수 있습니다. Xcode에서 사용자 정의 빌드 단계 일 수도 있습니다.

+0

감사합니다. 그게 내가 생각했던 것 같아. –

1

확인. 여기 내가 그걸 해결하기 위해 한 일이있다.

다양한 Localizable.strings 파일을 Git 저장소에서 제거했지만 각 위치 (앱 변형 디렉토리 중 하나)에 남겨 두었습니다.

나는 각 변종마다 다양한 라인을 사용하여 "MyLocalizable.strings"이라는 별도의 텍스트 파일을 만들었습니다. 나는 이들 각각을 힘내에게 추가하고 목표와 함께하지 않고 프로젝트에 추가했다. 각 타겟과 관련된 Localizable.strings 파일을 남겼습니다.

그래서 우리는 각각의 대상에 대상과 연결된 Localizable.strings 파일이 있으며이 파일을 번들에 복사합니다. 각 대상 디렉토리에는 "MyLocalizable.strings"이라는 파일이 있습니다.이 파일에는 대상에 따라 달라지는 몇 개의 문자열 만 들어 있습니다.

그런 다음 변경하지 않는 문자열의 대부분을 가져 와서 "MyLocalizable.strings"이라는 다른 파일에 넣고이를 중앙 (공통) 디렉토리에 배치했습니다. 다시 말하지만, 이것을 Git과 프로젝트에 추가했습니다. 목표와 함께하지 않아도됩니다.

그런 다음 대상 지정 파일이 추가 된 공용 파일에서 주어진 대상의 Localizable.strings 파일을 생성하기 위해 아주 작고 한심한 Perl 스크립트를 작성했습니다. 기존의 Localizable.strings 파일을 덮어 씁니다. 즉, Localizable.strings 파일은 스크립트를 실행할 때마다 새로 추가됩니다. 이 스크립트는 공통 영역에 배치되어 대상과 연결되지 않은 프로젝트에 추가되었습니다. 스크립트에는 대상 (및 해당 디렉토리)의 이름 인 하나의 인수가 있습니다. 이 스크립트의 구문은 다음과 같습니다.

#!/usr/bin/perl 

use strict;   # I'm anal. What can I say? 
use Cwd;   # We'll be operating on the working directory. 
use File::Path; 

my $input1File = cwd()."/BMLT/Supporting\ Files/en.lproj/MyLocalizable.strings"; 
my $input2File = cwd()."/".$ARGV[0]."/en.lproj/MyLocalizable.strings"; 
my $outputFile = cwd()."/".$ARGV[0]."/en.lproj/Localizable.strings"; 

open (MAIN_FILE, $input1File) || die ("Could not open main file!"); 

my @file_data = <MAIN_FILE>; 

close (MAIN_FILE); 

open (PRODUCT_FILE, $input2File) || die ("Could not open product file!"); 

push (@file_data, <PRODUCT_FILE>); 

close (PRODUCT_FILE); 

open (FINAL_FILE, ">$outputFile") || die ("Could not open destination file!"); 

foreach (@file_data) print FINAL_FILE $_; 

close (FINAL_FILE); 

그런 다음 번들 리소스 복사 단계 전에 실행 스크립트 빌드 단계를 추가하십시오.빌드가 이루어지는 경우, 파일이 결합

${PROJECT_DIR}/BMLT/Supporting\ Files/buildLocalizationFile.pl ${PRODUCT_NAME} 

와 결합 된 파일은 번들로 넣어 :이 스크립트는 다음과 같은 구문으로 Perl 스크립트를 호출합니다.

+0

이 문제에 대한 완벽한 해결책이라고 생각합니다. 고마워, 오늘 이걸 시도해. –

관련 문제