2011-06-28 108 views
1

在我的iPhone应用程序中,我可以成功更改应用程序设置中的语言(仅用户必须重新启动应用程序)。我使用这篇文章中提到的技巧:link。我做了一些修改。我所选择的语言中存储NSUserDefaults的,并在main.m文件:在应用程序设置中设置iPhone应用程序语言,但应用程序名称不变

int main(int argc, char *argv[]) { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"language"] == nil) { 
     [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"hu"] forKey:@"AppleLanguages"]; 
    } else { 
     [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:[[NSUserDefaults standardUserDefaults] objectForKey:@"language"]] forKey:@"AppleLanguages"]; 
} 

    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

“默认” Info.plist文件是英文的,我把它放在项目的根。我做了一个匈牙利语翻译,因为应用程序名称。这个文件是InfoPlist.strings,我把它放在hu.lproj文件夹中。在这个文件中:

CFBundleDisplayName = "Sör"; 

如果我改变了语言,之后重新启动应用程序,一切工作正常(笔尖文件,字符串),除了应用程序的名称。它不会改变...

有人可以告诉我什么是问题?

回答

1

您已完成差不多您需要做的一切。

您还需要指示您的应用程序具有本地化的应用程序名称。通过在应用的info.plist中添加以下关键字来实现此目的:

LSHasLocalizedDisplayName 

将它的类型设置为布尔值,并将其值设置为true。

一旦你完成了这个,你的应用程序应该本地化它的名字。

你可以阅读更多here

编辑:

你需要做的一两件事是建立在en.lproj文件夹中的文件InfoPlist.strings与英语相当于添加相同的钥匙。

CFBundleDisplayName = "<Replace Me>"; 

信用为此除了去this link

+0

是的,你是对的,但是如果我把这个键添加到Info.plist中,不会发生任何事情。在文档中,它是什么意思:“访问本地显示名称信息的函数在检索信息之前检查是否存在此键”? – madik

+0

请参阅上面对我的回答的编辑 –

+0

我有一个关于编辑答案的问题。我提到过,我在项目的根目录下有一个Info.plist文件,在构建设置中,我指向该文件。在这个文件中,应用程序的名称也有一个关键。直到现在,我在hu.lproj文件夹中只有一个InfoPlist.strings文件,并将该文件添加到项目中。现在我必须本地化这个文件(并且这个'操作'的结果是,在正确的文件夹中会有两个InfoPlist.strings文件)? – madik

0

那么应用程序名称是由iOS读取的,而不是设置为您的应用程序设置的语言。 因此,它会显示为系统语言设置的应用程序的名称。

+0

这是不t *严格*真实,请参阅我的回答 –

+0

是的,但是如果您只通过代码更改语言而不设置操作系统语言,它会改变吗?式。如果我的iPhone使用英文和通过代码,则将我的应用程序更改为荷兰语,操作系统会以荷兰语或英语显示应用程序名称。既然你告诉操作系统DisplayName是本地化的,我认为它会读取操作系统语言的显示名称,因为应用程序语言只有在运行后才能设置。 – rckoenes

+0

说实话,我不确定在这种情况下会发生什么,因为我只是以通常的方式本地化应用程序(即反映系统范围的语言选择*)。再次想到,您可能是对的,而且您可能无法获取应用程序名称以反映应用程序内语言更改,但另一方面,很可能应用程序名称可能会在应用程序运行的一生中发生变化语言。我想最好的方法是找出答案。 –