2014-10-21 13 views
5

Tôi đã mã sau đây để chuyển đổi thời gian chạy ngôn ngữ:Làm cách nào để nhận các chuỗi kịch bản được bản địa hóa sau khi chuyển sang ngôn ngữ khi chạy trong IOS?

-(void) switchToLanguage:(NSString *)lang{ 
    self.language = lang; 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:self.language, nil] 
             forKey:@"AppleLanguages"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Và tôi có một chức năng Helper để lấy dây cục bộ:

+(NSString *) getLocalizedString:(NSString *)key{ 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable" 
               ofType:@"strings" 
              inDirectory:nil 
             forLocalization:appDelegate.language]; 

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; 
    return [dict objectForKey:key]; 
} 

này đang làm việc. Bảng phân cảnh của tôi cũng được bản địa hóa, nhưng chúng không thay đổi khi tôi chuyển sang ngôn ngữ khác.

Làm cách nào để có được các giá trị được bản địa hóa cho các chuỗi bảng phân cảnh?

+0

Bạn đang sử dụng cơ sở Quốc tế hóa hay cốt truyện riêng biệt cho mỗi ngôn ngữ? –

+0

Tôi đang sử dụng Base internalization. – Burak

Trả lời

2

Thay đổi ngôn ngữ tại thời điểm chạy hơi phức tạp một chút.

Đây là cách tốt nhất mà tôi đã sử dụng để làm như vậy với sự giúp đỡ của lớp này rất nhỏ:

Language.m:

#import "Language.h" 

@implementation Language 

static NSBundle *bundle = nil; 

+(void)initialize { 
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; 
    NSArray* languages = [defs objectForKey:@"AppleLanguages"]; 
    NSString *current = [languages objectAtIndex:0]; 
    [self setLanguage:current]; 

} 

+(void)setLanguage:(NSString *)l 
{ 
    NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; 
    bundle = [NSBundle bundleWithPath:path]; 
} 

+(NSString *)get:(NSString *)key alter:(NSString *)alternate 
{ 
    return [bundle localizedStringForKey:key value:alternate table:nil]; 
} 

@end 

Language.h:

import <Foundation/Foundation.h> 

@interface Language : NSObject 
+(void)setLanguage:(NSString *)l; 
+(NSString *)get:(NSString *)key alter:(NSString *)alternate; 

@end 

Khi bạn muốn chan ge Ngôn ngữ:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"de", nil] forKey:@"AppleLanguages"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [Language setLanguage:@"en"]; 

    [(AppDelegate *)[[UIApplication sharedApplication] delegate] window].rootViewController = [self.storyboard instantiateInitialViewController]; 

Khi bạn muốn thiết lập một chuỗi:

[self.someButton setTitle:[Language get:@"Some Button Text" alter:nil] forState:UIControlStateNormal]; 
+0

Thao tác này có làm mới các chuỗi đã bản địa hóa chế độ xem hiện tại được hiển thị không? –

+0

Bạn sẽ cần tải lại chế độ xem hoặc ít nhất là tìm nạp lại các chuỗi để đạt được điều đó. – Segev

Các vấn đề liên quan