[英]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.