标签: nslocalizedstring

NSLocalizedString 从 Swift 传递到 Objective-C 时可能存在 iOS 16 错误

我遇到了我认为是 iOS16 中的一个错误:当本地化字符串从 Swift 传递到 Objective-C 并与另一个相同的本地化字符串(在 Objective-CC 中定义)进行比较时,结果可能为 false 并且参数顺序可以影响结果。看演示:

\n
class ViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let tc = TestClass()\n        tc.receive(NSLocalizedString("Start", comment:""))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
@implementation TestClass\n- (void)receive:(NSString *)swiftString {\n    NSString *objcString = NSLocalizedString(@"Start", @"");\n    BOOL result1 = [swiftString isEqualToString:objcString];\n    BOOL result2 = [objcString isEqualToString:swiftString];\n    NSLog(@"result: %d, %d", result1, result2);\n}\n@end\n
Run Code Online (Sandbox Code Playgroud)\n

它是可本地化的(以日语为例,但拉丁语以外的任何书写系统都可以重现该错误):

\n
"Start" = "\xe9\x96\x8b\xe5\xa7\x8b";\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
result: 0, 1\n
Run Code Online (Sandbox Code Playgroud)\n

我们不知道造成这种情况的根本原因是来自NSLocalizedString()还是-isEqualToString。iOS15 上不会发生这种情况。

\n

还有其他人遇到过这个错误吗?

\n

objective-c nslocalizedstring swift ios16

6
推荐指数
1
解决办法
473
查看次数

xcode本地化字符串未加载

我遇到了本地化字符串的一个奇怪问题.我的'en.lproj'文件夹中只有一个'Localizable.strings',它运行正常.所有字符串都显示在设备上.但是下次我编译并运行时,它只显示字符串的ID.即使我什么也没做,只点击构建和调试.并且下次再次正常工作,下次再次显示ID.

所以有谁知道为什么会这样?我总是需要建立两次,这有点烦人.

xcode nslocalizedstring

5
推荐指数
2
解决办法
4828
查看次数

NSLocalizedString的宏

我对NSLocalizedString的所有调用都没有nil作为第二个参数,因为我没有使用任何注释.但我讨厌重复自己.现在我问自己是否可以定义一个像LSSTRING(str)那样调用NSLocalizedString(str,nil)的宏,如果是这样的话怎么样?

macros objective-c nslocalizedstring

5
推荐指数
1
解决办法
3128
查看次数

本地化一个浮点数并指定iOS中的小数位数

我有一个浮动,我想显示到一个小数位.例如104.8135674 ...以英文显示为104.8.通常我会用:

myString = [NSString stringWithFormat:@"%.1f",myFloat];

但是,我想将数字本地化,所以我试过:

myString = [NSString localizedStringWithFormat:@"%.1f",myFloat];

这适用于分配正确的小数符号(例如

英语:104.8

德语:104,8

但是,对于使用不使用阿拉伯数字(0123456789)的语言,使用正确的小数符号,但数字仍为阿拉伯数字.例如

巴林 - 阿拉伯语:104,8(它应该使用不同的数字符号)

所以我尝试过:

myString = [NSNumberFormatter localizedStringFromNumber:[NSNumber numberWithFloat:myFloat] numberStyle:kCFNumberFormatterDecimalStyle];

但有了这个我似乎无法指定小数位数.它给出了例如

英语:104.813

floating-point cocoa-touch nsstring nslocalizedstring ios

5
推荐指数
1
解决办法
2954
查看次数

如何对自然语言学习的Mac OS X语言本地化文件进行逆向工程?

好的,这个问题的目标并不是严格的编程相关,而是程序员可以使用编程工具回答的问题,程序员可以在这里找到有用的答案.忍受我.

我发现在Mac OS X中更改系统语言是增强我对自然语言学习的有用方法,例如法语.然而,有时我发现法语中的菜单项或对话框我无法理解,谷歌翻译或将系统语言改回英语是一个难题.但我知道英文翻译隐藏在本地化文件的某个地方,并以某种方式映射到法语短语.所以我想要做的是从所有本地化文件中提取所有文本,以便用英语开发这个短语的映射=法语中的那个短语,这样我就可以轻松查找了.

我知道本地化文件存储在像Localizable.strings,lproj文件和nib文件这样的东西中,但是我无法确定它们的存储方式或如何使用它们.我可以编程,但我从来没有在Xcode中写过任何东西.我能找到的所有信息都是Mac OS/iOS程序员本地化他们的软件,而不是黑客提取已经制作的本地化信息.

如何从Mac OS X系统和第三方软件本地化文件中提取纯文本的外语信息?谢谢!

xcode localizable.strings nslocalizedstring

5
推荐指数
1
解决办法
461
查看次数

iOS字符串文件冲突 - 源语言中的字符串相同,目标不同

所以,我正在将应用程序从日语本地化为英语.

在日语中,(例如)"先生"之间没有区别 和"女士"(/"太太"),所以我需要做这样的事情:

/* Salutation format for user (male) */
"%@?" = "Mr. %@";

/* Salutation format for user (female) */
"%@?" = "Ms. %@";
Run Code Online (Sandbox Code Playgroud)

如您所见,日语本地化在两种情况下都使用相同的字符串.我的印象是,当字符串文件包含多个具有相同"源"(即左侧)字符串的条目时,"注释"用于确定使用哪一个.事实证明我错了,评论参数只是对人工翻译的一种帮助,完全被忽略了NSLocalizedString().

因此,如果我运行应用程序,则无论用户的性别如何,下面的两个代码路径都会生成相同的字符串:

NSString* userName;
BOOL userIsMale;

/* userName and userIsMale are set... */

NSString* format;

if(userIsMale){
    // MALE
    format = NSLocalizedString(@"%@?", 
                               @"Salutation format for user (male)");
}
else{
    // FEMALE
    format = NSLocalizedString(@"%@?", 
                               @"Salutation format for user (female)");
}

NSString* salutation = [NSString stringWithFormat:format, userName];
Run Code Online (Sandbox Code Playgroud)

那么,我应该如何处理这样的案件呢?

cocoa localization nslocalizedstring ios

5
推荐指数
1
解决办法
331
查看次数

在loc-args中发送用于iOS推送通知的本地化字符串键

我的应用程序支持4种语言和推送通知.当我向APNS发送推送通知时,我正在发送loc_key&loc-args.现在我需要在loc-args数组中发送本地化字符串,以便在应用程序收到推送通知时我可以在iOS应用程序端翻译它们.

但是当我发送本地化字符串时loc-args,它不是在通知中心显示已翻译的字符串,而是显示本地化的密钥.

我的字符串文件包含以下2条消息:

"WINNER_ALERT"= "Congratulations! %@ won the match & became %@ player";
"ROLE_PROFESSIONAL_LOCALIZED_KEY" = "professional"
Run Code Online (Sandbox Code Playgroud)

服务器发送有效负载

{
    aps =     {
        alert =         {
            "loc-args" =             (
                "John",
                "ROLE_PROFESSIONAL_LOCALIZED_KEY"
            );
            "loc-key" = "WINNER_ALERT";
        };
        badge = 1;
        sound = default;
    };
}
Run Code Online (Sandbox Code Playgroud)

当我发送上述有效负载然后在iOS通知中心,消息看起来像

Congratulations! John won the match & became ROLE_PROFESSIONAL_LOCALIZED_KEY player
Run Code Online (Sandbox Code Playgroud)

代替

Congratulations! JOHN won the match & became professional player
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我是否可以发送本地化的字符串loc-args?如果是的话,我的有效载荷有什么问题?

提前致谢

apple-push-notifications localizable.strings nslocalizedstring ios7

5
推荐指数
2
解决办法
6731
查看次数

强制本地化图像或图像资源

在此问题中,如何强制NSLocalizedString使用特定语言

我可以通过这种方法强制本地化.

头文件

@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;
@end
Run Code Online (Sandbox Code Playgroud)

履行

#import <objc/runtime.h>

static const char _bundle=0;

@interface BundleEx : NSBundle

@end

@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super                            localizedStringForKey:key value:value table:tableName];
}

@end

@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
  static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^
   {
      object_setClass([NSBundle mainBundle],[BundleEx class]);
   });
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:    [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil,  OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Run Code Online (Sandbox Code Playgroud)

在那之后,我需要本地化图像,因此,我喜欢这样. 本地化资产目录 …

localization image objective-c nslocalizedstring ios

5
推荐指数
1
解决办法
1205
查看次数

将NSLocalizedString的子字符串设置为粗体

我有一个方法将NSAttributedString设置为粗体:

 func setBold(text: String) -> NSMutableAttributedString {

    guard let font = UIFont.CustomNormalBoldItalic() else {
        fatalError("font not found")
    }

    let string = NSMutableAttributedString(string:"\(text)", attributes: [NSFontAttributeName : font])

    self.setAttributedString(string)
    return self
}
Run Code Online (Sandbox Code Playgroud)

这就是它的调用方式,它正常工作:

let formattedString = NSMutableAttributedString()
formattedString.setBold("Your text here")
Run Code Online (Sandbox Code Playgroud)

但是,我试图将NSLocalizedString的子字符串的文本设置为粗体.所以我会这样尝试:

let formattedString = NSMutableAttributedString()

return NSAttributedString(string: String.localizedStringWithFormat(
    NSLocalizedString("message", comment: ""), 
    formattedString.setBold(NSLocalizedString("message.day", comment: "")),
    NSLocalizedString("message.time", comment: "")
))
Run Code Online (Sandbox Code Playgroud)

它不是" 今天晚上10点开始",而是提供以下输出:

Today{
NSFont = "<UICTFont: 0x7fb75d4f1330> font-family: \"CustomText-MediumItalic\"; font-weight: normal; font-style: italic; font-size: 14.00pt";
} starting at 10pm {
} …
Run Code Online (Sandbox Code Playgroud)

nsattributedstring nslocalizedstring swift

5
推荐指数
1
解决办法
536
查看次数

如何在swift 2.3中使用#undef指令

我想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

5
推荐指数
1
解决办法
292
查看次数