谷歌搜索但没有找到解决方案:
基本上,我有一个 Localizable.strings 设置,我在我的代码中使用它。但是,如果我也能以某种方式在我的 XIB 中引用这些值,那就太好了,这样我就可以避免必须为每种语言创建一个烦人的 XIB...
这可能吗?
谷歌搜索但没有找到解决方案:
基本上,我有一个 Localizable.strings 设置,我在我的代码中使用它。但是,如果我也能以某种方式在我的 XIB 中引用这些值,那就太好了,这样我就可以避免必须为每种语言创建一个烦人的 XIB...
这可能吗?
您可以实现 UILabel 的子类,并让它在从 nib 初始化时自动提取本地化值。然后,在 XIB 中,您只需设置标记(如果您愿意,也可以设置英文文本)并让 UILabel 从该值中提取本地化文本。
我以迅捷的方式呈现给你
1.创建UILabel的子类
class LozalizedLabel : UILabel {
@IBInspectable var keyValue: String {
get {
return self.text!
}
set(value) {
self.text = NSLocalizedString(value, comment: "")
}
}
}
2.在IB中设置类为LocalizedLabel
3. 直接在 IB 中输入来自 Localizable.strings 的密钥
瞧,现在花更少的时间创建无用的 IBOutlets 只是为了使其成为可本地化的 UILabel。
注意 这不会使本地化字符串显示在界面构建器中,而只是“键”。因此,在构建 TextView 时,请记住相应地设置约束
没有办法Localizable.strings
直接使用 Interface Builder 进行设置。
您可能想要翻译 NIB 的原因是因为每种语言的单词长度可能会有所不同。因此,您可以更改每种语言的笔尖布局。
你可以在viewDidLoad
你的UIViewController
.
- (void) viewDidLoad {
[supper viewDidLoad];
self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
}
NSLocalizedString
具有易于实施的优点。风险是您可能会忘记为新的 Gui 元素添加条目。
您可以使用itool
从原始 xib 文件中转储字符串,翻译这些转储的字符串,然后将翻译后的字符串加载到 other-language-xib 文件中。
与NSLocalizedString
.
当您创建一个 XIB 时,您将其设置为本地化(如前所述),然后itool
针对此原始 xib 运行以提取字符串。将字符串文件翻译成所需的语言,然后将翻译加载到本地化的 xib 中。
如果你用谷歌搜索ibtool --generate-strings-file
你应该找到一些教程和例子。
语法应类似于:
#dump original xib to a $xibfile.strings file:
ibtool --generate-strings-file Resources/English.lproj/$xibfile.strings Resources/English.lproj/$xibfile.xib
# offline: translate the $xibfile.xib, place it into the correct lproj folder
# then: merge translated $xibfile.strings with original xib to create localized xib
ibtool --strings-file Resources/de.lproj/$xibfile.strings --write Resources/de.lproj/$xibfile.xib Resources/English.lproj/$xibfile.xib
$xibfile.strings
Resources/English.lproj 目录中将包含原始(英语语言)字符串。翻译的 $xibfile.strings
必须放在适当的xx.lproj
目录中。
如果您将构建脚本添加到 xcode,则将在每次构建时调用翻译的加载。
IB 不能使用 Localizable.strings 中的字符串,但还有另一个选项称为Base Internationalization。
简而言之:您可以为每种所需语言创建附加到 xib/storyboard 的单独 .strings 文件。结果,您将拥有 xib,每种语言都有自己的翻译。因此它可以复制您在 Localizable.strings 中的一些值,但它比通过代码设置或复制 xib 文件更清晰。
另一种快捷方式,但有扩展名:
extension UILabel {
static var localizedKey:UInt8 = 0
@IBInspectable public var localizationKey: String? {
set {
objc_setAssociatedObject(self, &UILabel.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
get {
return objc_getAssociatedObject(self, &UILabel.localizedKey) as? String
}
}
open override func awakeFromNib() {
super.awakeFromNib()
if let localizationKey = self.localizationKey {
self.text = NSLocalizedString(localizationKey, comment: "")
}
}
}
然后,您将能够直接从 IB 编写本地化密钥,并将在运行时进行本地化。
您可以在代码中执行此操作:
label.text = NSLocalizedString(@"key", @"comment");
但我认为除了本地化整个笔尖之外,没有其他方法可以仅使用笔尖。过去我当然没有找到其他方法。
这是我的版本。希望能帮助到你。
extension UILabel {
/// The IBInspectable helps us to set localizable text in IB
@IBInspectable var localizableText: String? {
get { return text }
set(value) { text = value?.localized() }
}
/// The IBInspectable helps us to set localizable text in IB
@IBInspectable var localizableUppercaseText: String? {
get { return text }
set(value) { text = value?.localized().uppercased() }
}
}
extension String {
func localized(bundle: Bundle = .main, tableName: String = "Localizable") -> String {
return NSLocalizedString(self, tableName: tableName, value: "**\(self)**", comment: "")
}
}
Apple 支持的本地化 .xib 文件的方法。这允许您本地化每种语言/国家/地区的文本和布局。