簡體   English   中英

如何獲得本地化的取消、完成等?

[英]How to get localized Cancel, Done and etc?

UIBarButtonItem 具有 Cancel、Done 等標識符。 它們以文本形式顯示給用戶。 如果用戶更改語言,例如取消按鈕將自動翻譯。 作為開發人員,您不需要為此按鈕提供本地化字符串。 這意味着 Cancel、Done 和其他字符串已經本地化並隨 OS 一起提供。

這是一種以編程方式獲取此字符串的方法嗎?

我不想在本地化文件中添加額外的字符串。 如果可以訪問,那就太好了。

這是我為獲取系統 UIKit 字符串而創建的一個小宏:

#define UIKitLocalizedString(key) [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] localizedStringForKey:key value:@"" table:nil]

像這樣使用它:

UIKitLocalizedString(@"Search");
UIKitLocalizedString(@"Done");
UIKitLocalizedString(@"Cancel");
...

一種(公認有問題的)輕松實現這一點的方法是直接使用 Apple 的框架包本地化:

要查看他們提供的內容,請通過 Finder 打開以下目錄:

/Applications/Xcode/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks

在您的情況下,您隨后將打開./UIKit.framework/English.lproj/Localizable.strings (在 TextMate 中)。 在這里,您會看到 Apple 使用的各種翻譯,例如“打印”、“確定”、“開”、“關”等。真正的神奇之處在於,您可以將大約 35 種不同的語言翻譯復制到您的免費擁有 Localizable.strings 文件。

如果您非常無恥並且不介意將您的應用程序的未來穩定性置疑,您可以跳過整個“復制到您自己的 Localizable.strings”過程並以編程方式直接轉到源代碼:

NSBundle *uiKitBundle = [NSBundle bundleWithIdentifier:@"com.apple.UIKit"];
NSString *onText = uiKitBundle ? [uiKitBundle localizedStringForKey:@"Yes" value:nil table:nil] : @"YES";
NSString *offText = uiKitBundle ? [uiKitBundle localizedStringForKey:@"No" value:nil table:nil] : @"NO";

警告:我絕不建議您在打算提交給 App Store 的應用程序中以編程方式實際訪問這些本地化資源。 我只是在說明我見過的解決您最初問題的特定實現。

對此問題回答(由Stephan Heilner 提供)和對iPhone/iOS 的回答(由bdunagan 提供)受到鼓舞:如何獲取我的應用程序本地化的所有語言的本地化字符串列表?

目標-C

NSString * LocalizedString(NSString *key) {
    return [[NSBundle mainBundle] localizedStringForKey:key];
}

@interface NSBundle(Localization)
- (NSString *)localizedStringForKey:(NSString *)key;
- (NSDictionary<NSString *, NSString *> *)localizationTable;
@end

@implementation NSBundle(Localization)
- (NSDictionary<NSString *, NSString *> *)localizationTable {
    NSString *path = [self pathForResource:@"Localizable" ofType:@"strings"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSError *error = nil;
    id obj = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:&error];
    if (error && obj == nil) {
        @throw error;
        return nil;
    }
    if ([obj isKindOfClass:NSDictionary.class]) {
        return obj;
    }    
    @throw NSInternalInconsistencyException;
    return nil;
}

- (NSString *)localizedStringForKey:(NSString *)key {
    return [self localizedStringForKey:key value:nil table:nil];
}
@end

斯威夫特 5

public extension String {
    func localized(_ bundle: Bundle = .main) -> String {
        bundle.localize(self)
    }        
    var localized: String {
        return localized()
    }
}

extension Bundle {
    static var UIKit: Bundle {
        Self(for: UIApplication.self)
    }
    func localize(_ key: String, table: String? = nil) -> String {
        self.localizedString(forKey: key, value: nil, table: nil)
    }
    var localizableStrings: [String: String]? {
        guard let fileURL = url(forResource: "Localizable", withExtension: "strings") else {
            return nil
        }
        do {
            let data = try Data(contentsOf: fileURL)
            let plist = try PropertyListSerialization.propertyList(from: data, format: .none)
            return plist as? [String: String]
        } catch {
            print(error)
        }
        return nil
    }
}

用法:

"Photo Library".localized(.UIKit)

獲取 UIKit 本地化字符串的所有鍵:

Bundle.UIKit.localizableStrings?.keys//.map { $0 }

雖然可能不是您想要的,但 Mac App Store 中有一個名為“System Strings”的商業應用程序聲稱它提供了超過 53000 個標准本地化字符串的集合。 它於 2012 年 11 月 2 日發布。我與此應用程序或作者無關。 URL 是https://itunes.apple.com/us/app/systemstrings/id570467776

聽起來您要問的是 Apple 是否提供了一種訪問預翻譯字符串字典的方法。 我認為 Apple 為此類提供的任何內容都將位於他們的 Docs: Internationalization Programming Topics 中

為了回答您的問題,我認為他們沒有提供已知翻譯的字典/列表。 您要么必須在Localizable.strings資源文件中定義它們,要么按照其他人在評論中的說明進行操作,然后從 UIBarButtonItem 中提取標題(我會親自使用資源文件)。

為什么不在故事板中使用基本本地化? 它將為您本地化。

你可以用

NSLocalizedString(@"Cancel", @"Cancel")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM