有没有办法设置在应用程序不支持设备UI语言时使用的默认语言?
示例:我的应用已本地化为英语和德语:
// en.lproj:
"POWER_TO_THE_PEOPLE_BTN" = "Power";
"POWER_PLUG_BTN" = "Power";
// de.lproj:
"POWER_TO_THE_PEOPLE_BTN" = "Macht";
"POWER_PLUG_BTN" = "Spannung";
Run Code Online (Sandbox Code Playgroud)
现在,如果我在设置为Italian应用程序的UI语言的设备上运行应用程序将使用键字符串POWER_TO_THE_PEOPLE_BTN和POWER_PLUG_BTN.
必须有一种方法来指定应用程序在这种情况下使用的默认(回退)语言.
从上面的例子中可以清楚地看出,使用英文字符串作为键是行不通的.
我现在看到的唯一选择是使用NSLocalizedStringWithDefaultValue而不是NSLocalizedString.
在Objective-C中,我创建了一个非常方便的类别(在Swift术语中的扩展) NSObject该添加到任意的键/值对添加到任何的能力NSObject在运行时.它使用关联对象将可变字典附加到对象,然后提供get/set方法,用于从/到该字典获取/设置键/值对.它只有几行代码.
这使得可以在运行时将任意键/值对附加到ANY对象,包括由系统创建的对象.这是关键.在某些情况下,系统框架会向您返回一个对象,您需要能够为其附加值.
此技巧还可以创建具有新实例变量的类别.(好吧,它们不是真的,但是它确实允许你向类别中的对象添加新的状态变量.)
这在Swift 1.2中是不可能的,因为:
在Swift 1.2下我不得不放弃这个.
但Swift 2允许扩展协议.我想"很好,现在我可以添加我的扩展,让我可以向AnyObject添加键/值对!"
没有快乐.
当我尝试为AnyObject创建扩展时:
extension AnyObject: AssociatedObjectProtocol
Run Code Online (Sandbox Code Playgroud)
我收到错误消息
'AnyObject'协议无法扩展
Arghh!如此接近,但不是.似乎该语言明确禁止扩展AnyObject.为什么会这样,有什么办法吗?
我不经常在NSObject上使用我的类别,但是当我这样做时,它是一个救星.我想把它添加到我在Swift中的技巧包中.
我可以像在Objective-C中那样将它添加到NSObject,但这意味着它只适用于从NSObject继承的对象 - 使其不适用于本机Swift类.
是否可以在 Swift 中覆盖全局函数?
具体来说,我想覆盖NSLocalizedString. 这在 Objective-c ( #undef/ #define) 中很容易,但在 Swift 中NSLocalizedString被定义为全局函数,我找不到覆盖它的方法。
我可以创建自己的函数MyLocalizedString,它调用原始函数,NSLocalizedString但随后我将失去 AppCode 对 Localizable.strings 文件的巧妙支持(本地化键的自动完成,IDE 显示本地化文本),我必须确保每次使用NSLocalizedString我的代码中的of被替换为MyLocalizedString.
编辑:我想达到什么目标?我希望能够动态更改 GUI 中的字符串。最简单的方法是重新定义 NSLocalizedString,然后自己在表中查找字符串。如果它不存在,我将使用 Localizable.strings 中的原始字符串。
我想NSLocalizedString在swift 2.3中取消定义或覆盖,我搜索了很多关于它的内容,最后我在Objective C中找到了一种方法,如下所示.
#undef NSLocalizedString
#define NSLocalizedString(key,_comment) your_function_name
Run Code Online (Sandbox Code Playgroud)
我想在swift中实现这个功能.我只知道Objective C中的NSLocalizedString一个宏.NSBundle.h所以我们可以重新定义它.但是对于swift我们无法实现这一点.我只想重新定义或覆盖swift的NSLocalizedString函数.请帮我解决这个问题.任何帮助都会不胜感激.
localization nslocalizedstring preprocessor-directive swift xcode8.1