48

UIBarButtonItem 有 Cancel、Done 等标识符。它们以文本形式显示给用户。如果用户更改语言,例如取消按钮将被自动翻译。作为开发人员,您不需要为此按钮提供本地化字符串。这意味着 Cancel、Done 和其他字符串已经本地化并与 OS 一起提供。

这是一种以编程方式获取此字符串的方法吗?

我不想在本地化文件中添加额外的字符串。如果可以访问,那将是非常好的。

4

7 回答 7

33

这是我为获取系统 UIKit 字符串而创建的一个小宏:

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

像这样使用它:

UIKitLocalizedString(@"Search");
UIKitLocalizedString(@"Done");
UIKitLocalizedString(@"Cancel");
...
于 2014-04-25T20:03:21.013 回答
13

轻松完成此任务的一种(诚然值得怀疑的)方法是直接使用 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 的应用程序中以编程方式实际访问这些本地化资源。我只是在说明我看到的一个特定实现,它解决了你原来的问题。

于 2013-09-04T17:24:39.170 回答
9

受到对这个问题的回答(由Stephan Heilner 提供)和针对iPhone/iOS 的回答(由bdunagan 提供)的鼓舞:如何获取我的应用程序本地化的所有语言的本地化字符串列表?

Objective-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 }
于 2018-03-15T14:45:39.903 回答
3

虽然可能并不完全符合您的要求,但 Mac App Store 中有一个名为“System Strings”的商业应用程序声称它提供了超过 53000 个标准本地化字符串的集合。它于 2012 年 11 月 2 日发布。我与此应用程序或作者无关。URL 是https://itunes.apple.com/us/app/systemstrings/id570467776

于 2012-11-18T05:21:39.470 回答
1

听起来您要问的是Apple是否提供了一种访问预翻译字符串字典的方法。我认为 Apple 为此类提供的任何内容都将位于他们的文档中:国际化编程主题

要回答您的问题,我认为他们不提供已知翻译的字典/列表。您要么必须在Localizable.strings资源文件中定义它们,要么按照其他人在评论中的说明进行操作,然后从 UIBarButtonItem 中提取标题(我会亲自使用资源文件)。

于 2012-08-31T17:19:03.260 回答
0

为什么不在情节提要中使用基本本地化?它将为您本地化。

于 2014-04-01T15:07:03.703 回答
-6

你可以使用

NSLocalizedString(@"Cancel", @"Cancel")
于 2014-04-03T09:26:41.917 回答