首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用NSLocalizedString的最佳实践

使用NSLocalizedString的最佳实践
EN

Stack Overflow用户
提问于 2012-03-28 02:43:45
回答 9查看 74.6K关注 0票数 143

我(像其他人一样)正在使用NSLocalizedString来本地化我的应用程序。

不幸的是,有几个“缺点”(不一定是NSLocalizedString本身的问题),包括

  • 不自动完成Xcode中的字符串。这使得工作不仅容易出错,而且令人厌烦。
  • 您可能因为不知道已经存在一个等效的字符串而最终重新定义一个字符串(即“请输入密码”vs.输入密码first")
  • Similarily到自动补全问题,你需要“记住”注释字符串,否则genstring将以多个注释结束一个字符串
  • 如果你想在你已经本地化一些字符串后使用genstring,你必须小心不要丢失你的旧的localizations.
  • Same字符串分散在你的整个项目中。例如,您在任何地方都使用NSLocalizedString(@"Abort", @"Cancel action"),然后Code Review要求您将该字符串重命名为NSLocalizedString(@"Cancel", @"Cancel action"),以使代码更一致。

我所做的(经过一些搜索之后,我想很多人都会这么做)是创建一个独立的strings.h文件,在这个文件中我会对所有的本地化代码进行#define。例如

代码语言:javascript
复制
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);

这本质上提供了代码完成、更改变量名的单一位置(因此不再需要genstring ),以及用于自动重构的唯一关键字。然而,这是以一大堆#define语句为代价的,这些语句本身并不是结构化的(比如LocString.Common.Cancel或类似的东西)。

所以,虽然这在某种程度上很好用,但我想知道你们在项目中是如何做到的。是否有其他方法可以简化NSLocalizedString的使用?有没有可能有一个框架来封装它?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-04-18 01:49:46

NSLocalizedString有一些限制,但它是Cocoa的核心,所以编写自定义代码来处理本地化是不合理的,这意味着您将不得不使用它。也就是说,一个小工具可以有所帮助,下面是我如何进行的:

更新字符串文件

genstrings会覆盖您的字符串文件,丢弃您之前的所有翻译。我编写了update_strings.py来解析旧的字符串文件,运行genstrings并填充空白,这样您就不必手动恢复现有的翻译。该脚本尝试尽可能接近地匹配现有的字符串文件,以避免在更新它们时有太大的差异。

为字符串命名

如果您按照通告的方式使用NSLocalizedString

代码语言:javascript
复制
NSLocalizedString(@"Cancel or continue?", @"Cancel notice message when a download takes too long to proceed");

您可能最终会在代码的另一部分中定义相同的字符串,这可能会发生冲突,因为相同的英语术语在不同的上下文中可能具有不同的含义(脑海中会想到OKCancel )。这就是为什么我总是使用无意义的全大写字符串和特定于模块的前缀,以及非常精确的描述:

代码语言:javascript
复制
NSLocalizedString(@"DOWNLOAD_CANCEL_OR_CONTINUE", @"Cancel notice window title when a download takes too long to proceed");

在不同位置使用相同的字符串

如果多次使用相同的字符串,则可以像以前一样使用宏,或者将其作为实例变量缓存在视图控制器或数据源中。这样,你就不必重复描述,因为它可能会变得陈旧,并且在相同本地化的实例之间变得不一致,这总是令人困惑。由于实例变量是符号,您将能够对这些最常见的转换使用自动完成,并对特定的转换使用“手动”字符串,这只会出现一次。

我希望通过这些技巧,您将更高效地使用Cocoa本地化!

票数 101
EN

Stack Overflow用户

发布于 2013-09-28 10:22:33

至于Xcode中字符串的自动补全,您可以尝试使用https://github.com/questbeat/Lin

票数 31
EN

Stack Overflow用户

发布于 2012-05-09 17:27:14

同意ndfred,但我想补充一下:

第二个参数可以用作...默认值!!

(NSLocalizedStringWithDefaultValue不能正常使用genstring,这就是我提出这个解决方案的原因)

下面是我使用NSLocalizedString自定义实现,它使用注释作为默认值:

1。在预编译头文件(.pch文件)中,重新定义'NSLocalizedString‘宏:

代码语言:javascript
复制
// cutom NSLocalizedString that use macro comment as default value
#import "LocalizationHandlerUtil.h"

#undef NSLocalizedString
#define NSLocalizedString(key,_comment) [[LocalizationHandlerUtil singleton] localizedString:key  comment:_comment]

2.创建实现本地化处理程序的类

代码语言:javascript
复制
#import "LocalizationHandlerUtil.h"

@implementation LocalizationHandlerUtil

static LocalizationHandlerUtil * singleton = nil;

+ (LocalizationHandlerUtil *)singleton
{
    return singleton;
}

__attribute__((constructor))
static void staticInit_singleton()
{
    singleton = [[LocalizationHandlerUtil alloc] init];
}

- (NSString *)localizedString:(NSString *)key comment:(NSString *)comment
{
    // default localized string loading
    NSString * localizedString = [[NSBundle mainBundle] localizedStringForKey:key value:key table:nil];

    // if (value == key) and comment is not nil -> returns comment
    if([localizedString isEqualToString:key] && comment !=nil)
        return comment;

    return localizedString;
}

@end

3.使用它!

确保在应用程序构建阶段添加运行脚本,以便在每次构建时更新Localizable.strings文件,即在Localized.strings文件中添加新的本地化字符串:

我的构建阶段脚本是一个shell脚本:

代码语言:javascript
复制
Shell: /bin/sh
Shell script content: find . -name \*.m | xargs genstrings -o MyClassesFolder

因此,当您在代码中添加以下新行时:

代码语言:javascript
复制
self.title = NSLocalizedString(@"view_settings_title", @"Settings");

然后执行构建,您的./Localizable.scripts文件将包含以下新行:

代码语言:javascript
复制
/* Settings */
"view_settings_title" = "view_settings_title";

由于'view_settings_title‘的键值为==,所以自定义LocalizedStringHandler将返回注释,即‘设置’

瞧啊:-)

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9895621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档