我遇到了我认为是 iOS16 中的一个错误:当本地化字符串从 Swift 传递到 Objective-C 并与另一个相同的本地化字符串(在 Objective-CC 中定义)进行比较时,结果可能为 false 并且参数顺序可以影响结果。看演示:
\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n let tc = TestClass()\n tc.receive(NSLocalizedString("Start", comment:""))\n }\n}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n它是可本地化的(以日语为例,但拉丁语以外的任何书写系统都可以重现该错误):
\n"Start" = "\xe9\x96\x8b\xe5\xa7\x8b";\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nresult: 0, 1\nRun Code Online (Sandbox Code Playgroud)\n我们不知道造成这种情况的根本原因是来自NSLocalizedString()还是-isEqualToString。iOS15 上不会发生这种情况。
还有其他人遇到过这个错误吗?
\n我遇到了本地化字符串的一个奇怪问题.我的'en.lproj'文件夹中只有一个'Localizable.strings',它运行正常.所有字符串都显示在设备上.但是下次我编译并运行时,它只显示字符串的ID.即使我什么也没做,只点击构建和调试.并且下次再次正常工作,下次再次显示ID.
所以有谁知道为什么会这样?我总是需要建立两次,这有点烦人.
我对NSLocalizedString的所有调用都没有nil作为第二个参数,因为我没有使用任何注释.但我讨厌重复自己.现在我问自己是否可以定义一个像LSSTRING(str)那样调用NSLocalizedString(str,nil)的宏,如果是这样的话怎么样?
我有一个浮动,我想显示到一个小数位.例如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
好的,这个问题的目标并不是严格的编程相关,而是程序员可以使用编程工具回答的问题,程序员可以在这里找到有用的答案.忍受我.
我发现在Mac OS X中更改系统语言是增强我对自然语言学习的有用方法,例如法语.然而,有时我发现法语中的菜单项或对话框我无法理解,谷歌翻译或将系统语言改回英语是一个难题.但我知道英文翻译隐藏在本地化文件的某个地方,并以某种方式映射到法语短语.所以我想要做的是从所有本地化文件中提取所有文本,以便用英语开发这个短语的映射=法语中的那个短语,这样我就可以轻松查找了.
我知道本地化文件存储在像Localizable.strings,lproj文件和nib文件这样的东西中,但是我无法确定它们的存储方式或如何使用它们.我可以编程,但我从来没有在Xcode中写过任何东西.我能找到的所有信息都是Mac OS/iOS程序员本地化他们的软件,而不是黑客提取已经制作的本地化信息.
如何从Mac OS X系统和第三方软件本地化文件中提取纯文本的外语信息?谢谢!
所以,我正在将应用程序从日语本地化为英语.
在日语中,(例如)"先生"之间没有区别 和"女士"(/"太太"),所以我需要做这样的事情:
/* 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)
那么,我应该如何处理这样的案件呢?
我的应用程序支持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
在此问题中,如何强制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)
在那之后,我需要本地化图像,因此,我喜欢这样. 本地化资产目录 …
我有一个方法将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) 我想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
ios ×3
localization ×3
objective-c ×3
swift ×3
xcode ×2
cocoa ×1
cocoa-touch ×1
image ×1
ios16 ×1
ios7 ×1
macros ×1
nsstring ×1
xcode8.1 ×1