使用标准的苹果翻译来处理Alert按钮?

14

这是真的吗?当你实例化一个UIAlertButton时,你必须为Cancel按钮传递一个显式的标题,就像这样:

UIAlertView *av = 
    [[UIAlertView alloc] 
         initWithTitle:@"Error" 
         message:err.localizedDescription 
         delegate:nil 
         cancelButtonTitle:@"Cancel" 
         otherButtonTitles:nil];

这意味着如果您想要一个本地化的应用程序(当然您想要),即使Apple已经有一个规范的翻译,您也必须本地化Cancel字符串。我真的被迫编写像这样的内容来处理它吗(或者这样做没问题)?

NSBundle* uikitBundle = [NSBundle bundleForClass:[UIButton class]];
UIAlertView *av = 
    [[UIAlertView alloc] 
         initWithTitle:NSLocalizedString(@"Error", @"Title for Alert box when error occurs") 
         message:err.localizedDescription 
         delegate:nil 
         cancelButtonTitle:NSLocalizedStringFromTableInBundle(@"Cancel", @"Localizable", uikitBundle, nil) 
         otherButtonTitles:nil];

对我来说,这看起来很糟糕,但我必须维护自己的翻译显得有些荒谬,因为这些词是由苹果的 HIG 规定的(例如“取消”或“确定”)。


太酷了,即使有点丑。我不知道你可以黑 UIKit 的本地化字符串。 - CodaFi
这个问题的好答案:12。比被接受的答案更好。 - kelin
1个回答

4
因为你的代码引入了一个未记录、不支持的依赖项,所以这种做法是不推荐的。如果未来 iOS 更新了 Apple 的 UIButton 本地化方式(虽然这种情况不太可能),你的应用程序可能会出现问题。
其实,“OK”和“Cancel”并不难翻译。如果您不希望翻译人员在本地化过程中重新本地化这些内容,则可以使用您的代码从 iOS 中检索它们,并将翻译复制到您的.strings 文件中,这样您就会拥有可靠的翻译副本!

我不确定这是否算作使用未记录的API。bundleForClass和用于bundle的本地化字符串都是非常明确记录/支持的。你是对的,对该bundle的依赖可能会中断,如果发生这种情况,你应该有一个备选方案(localizedStringForKey API支持备选字符串)。我的回答在这里展示了如何进行保护,以便如果该bundle停止支持这些字符串,它会回退到英语:https://dev59.com/PWct5IYBdhLWcg3wUb1-#76228931 - scosman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接