2012-09-18 2 views
3

정적 라이브러리에 관한 질문이 있습니다. 내 라이브러리 내에서 일부 텍스트를 현지화해야합니다. 그래서 나는 다른 지역화 된 파일을 넣을 번들을 만들었습니다.정적 라이브러리 및 국제화

NSString *MyLocalizedString(NSString* key, NSString* comment) 
{ 
    static NSBundle* bundle = nil; 
    if (!bundle) 
    { 
     NSString* path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyStaticLib.bundle"]; 
     bundle = [[NSBundle bundleWithPath:path] retain]; 
    } 

    return [bundle localizedStringForKey:key value:@"" table:nil]; 
} 

하지만 그것을 사용할 때 (내 전화 langage는 프랑스어 외에), 항상 영어 지역화 된 문자열을 반환 : 그럼,이 같은 함수를 만들었습니다. 나는 이유를 모른다. 나는 정확히 같은 일을 매우 동일한 문제가있어

답변

3

: 나는 정적 라이브러리와 이미지와 동반자 번들 파일, 지역화 된 문자열 등을했습니다를 ...

내가 알아 냈어요 그 보인다 정적은 올바른 장치 국산화를 알아낼 수 없습니다 (죄송하지만이 문제의 원인을 찾을 수 없습니다) 그리고 나는이 일을 고정했습니다 당신이 볼 수 있듯이

@implementation NSBundle (KiosKitAdditions) 

+ (NSBundle *)kioskitBundle 
{ 
    static NSBundle* kioskitBundle = nil; 
    static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 

     NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:KKBundleName 
                     ofType:@"bundle"]; 

     NSBundle *libraryBundle = [[NSBundle bundleWithPath:libraryBundlePath] retain]; 
     NSString *langID  = [[NSLocale preferredLanguages] objectAtIndex:0]; 
     NSString *path   = [libraryBundle pathForResource:langID ofType:@"lproj"]; 
     kioskitBundle   = [[NSBundle bundleWithPath:path] retain]; 
    }); 
    return kioskitBundle; 
} 

@end 

[NSBundle mainBundle]과 매우 유사한 클래스 메서드를 사용하여 NSBundle 범주를 만들었고 정적 라이브러리에 대한 올바른 번들을 반환하므로 지금까지 사용할 수 있습니다. ywhere 내가 예를 들어, 원하는 :

#define KKLocalizedString(key) NSLocalizedStringFromTableInBundle(key, @"Localizable", [NSBundle kioskitBundle], @"") 

를 코드는 내가 정적 라이브러리 번들에 대한 경로를 찾을 첫번째 매우 간단합니다, 현재 장치 언어를 찾은 다음 내가 만들고 그 경로 새로운 NSBundle LIBRARY_PATH/device_language.lproj .

이 방법의 단점은 모든 자산을 항상 현지화해야한다는 것이고 번들에 많은 이미지가있는 경우 고통이 될 수 있습니다 (그러나 이것이 가능하지 않을 수도 있음).

내 카테고리를 채택하지 않으려면

는이 같은 코드를 변경할 수 있습니다 접근 :

NSString *MyLocalizedString(NSString* key, NSString* comment) 
{ 
    static NSBundle* bundle = nil; 
    if (!bundle) 
    { 
     NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:@"MyStaticLib" 
                     ofType:@"bundle"]; 

     NSBundle *libraryBundle = [NSBundle bundleWithPath:libraryBundlePath]; 
     NSString *langID  = [[NSLocale preferredLanguages] objectAtIndex:0]; 
     NSString *path   = [libraryBundle pathForResource:langID ofType:@"lproj"]; 
     bundle     = [[NSBundle bundleWithPath:path] retain]; 

    } 

    return [bundle localizedStringForKey:key value:@"" table:nil]; 
} 
+0

감사합니다. Luca, 이제 완벽하게 작동합니다. :) – Niko

+0

Niko, 문제의 원인을 찾을 수 있는지 알려주세요. –

+0

사실, 문제는 없지만 이미지가 거의 없습니다. – Niko

1

나는 그것이 내가 원하는 방법 작업을 진행하게 루카의 답변을 수정했다. 내 문제는 매우 유사했습니다 : 소비 응용 프로그램에서 내 번들로 된 현지화 된 문자열을 사용하여 [lang] .lproj 폴더를 해결하지 못했습니다. 필자의 경우 es.lproj 폴더를 사용하고 싶었습니다. 그러나 사용자가 선호하는 언어를 es-MX로 설정하면 [NSLocale preferredLanguages] objectAtIndex : 0]을 사용하면 존재하지 않는 es-MS.lproj 폴더를 찾으려고 시도합니다.

@implementation NSBundle (CCPAdditions) 

+ (NSBundle *)CCPBundle 
{ 
    static NSBundle* corePaymentBundle = nil; 
    static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 

     NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:@"ClipCorePayments" 
                     ofType:@"bundle"]; 

     NSBundle *libraryBundle = [NSBundle bundleWithPath:libraryBundlePath]; 

     for (NSString *langID in [NSLocale preferredLanguages]) 
     { 
      NSString *path = [libraryBundle pathForResource:langID ofType:@"lproj"]; 
      if (path) 
      { 
       corePaymentBundle   = [NSBundle bundleWithPath:path]; 
       break; 
      } 
     } 
    }); 

    return corePaymentBundle; 
} 

@end 

이렇게하면 기본 언어 목록을 반복하고 해당 경로가 있는지 확인합니다. es-MX.lproj가 없으면 es.lproj 등을 확인하고 그 밖의 것이 없으면 결국 en.lproj를 찾습니다.