首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义NSLocalizedString?

自定义NSLocalizedString?
EN

Stack Overflow用户
提问于 2011-07-06 16:32:31
回答 7查看 7K关注 0票数 3

可以将NSLocalizedString基础设施(基于localizable.strings)与自定义的“本地化”一起使用吗?

问题是,有些语言对男性和女性有不同的表达方式。我想在第一次启动时询问用户的性别,然后使用适当的短语。当然,两者都基于相同的语言。我可以用我自己的代码来做,但如果可能的话,我更愿意用简单的方式来做。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-07-06 16:53:29

NSLocalizedString只是在NSBundle.h中定义的宏

重新定义它或创建一个新的,例如NSGenderAwareLocalizedString,以满足您的需求。

使用新的宏,您可以自由地做任何您想做的事情:每种语言有两个字符串文件,一个用于男性,一个用于女性。或者,您可以定义一个约定,从男性本地化字符串的密钥派生女性本地化字符串的密钥。

票数 4
EN

Stack Overflow用户

发布于 2012-05-09 16:53:23

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

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

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 MyProjectFolder

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

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

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

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

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

瞧啊:-)

票数 9
EN

Stack Overflow用户

发布于 2013-04-01 01:22:22

为此有一种特殊的机制。来自苹果参考:Searching for Custom Functions With genstrings

默认情况下,genstrings工具会搜索核心基础和基础字符串宏。它使用这些宏中的信息在项目的字符串文件中创建字符串条目。您还可以指示genstring在代码中查找自定义字符串加载函数,并在使用标准宏的同时使用这些函数。您可以使用自定义函数来包装内置的字符串加载例程并执行一些额外的处理,也可以使用您自己的自定义模型替换默认的字符串处理行为。

如果要将字符串与您自己的自定义函数一起使用,则函数必须使用Foundation宏所使用的命名和格式约定。函数的参数必须与相应宏的参数完全匹配。调用genstrings时,指定-s选项,后跟与NSLocalizedString宏对应的函数的名称。然后,您的其他函数名称应该从这个基本名称构建。例如,如果指定函数名MyStringFunction,则其他函数名应为MyStringFunctionFromTableMyStringFunctionFromTableInBundleMyStringFunctionWithDefaultValuegenstrings工具查找这些函数,并使用它们构建相应的字符串文件。

要实现自己的行为,请使用NSBundle方法localizedStringForKey:value:table:

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

https://stackoverflow.com/questions/6593561

复制
相关文章

相似问题

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