用于多种语言的多个SQLite数据库?

我想为我的应用程序实现多语言支持。 所以我创build了Localizing.strings文件和所有这些东西,并翻译了我的界面。 到现在为止还挺好 …

现在我想复制我的数据库,以便为每种语言都有一个* .db文件。 所以我做了,然后在“本地化”选项卡下的“+”上通过XCode单击。 我现在有一个* .db文件在我的en.lprojde.lproj文件夹。

我的问题:如果我想将数据库文件复制到应用程序的文档目录* .db文件当然不可用,因为它在* .lproj文件夹中。 有没有任何命令来获得正确的lproj文件夹?

澄清我的需求:这是行不通的

 [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydatabase.db"] 

这确实:

 [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"de.lproj/mydatabase.db"] 

…但我不想手动添加“de.lproj”和“en.lproj”等。 有没有办法dynamic修复它?

你想要的是当前的语言环境,下面的代码应该返回代码:

 NSArray *languagesArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languagesArray objectAtIndex:0]; 

然后您可以执行以下操作

 [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.lproj/mydatabase.db", currentLanguage]]; 

你可能想要检查path是否存在,并且是一个有效的文件,如果不是,可以使用一些默认path,如英文(en.lproj)

编辑:还有一种方法可以使用NSLocale的首选语言来做到这一点,因为那么你会得到一个首选语言的列表,所以一些更新后的代码将是:

 NSArray *languagesArray = [NSLocale preferredLanguages]; NSString *currentLanguage = [languagesArray objectAtIndex:0]; 

最后,你会得到这样的结果:

 NSString *pathComponent = [NSString stringWithFormat:@"%@.lproj/mydatabase.db", currentLanguage]; NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:pathComponent]; NSString *activePath = nil; // This will store the active language file // Check if the file exists... if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { activePath = path; } else { activePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"en.lproj/mydatabase.db"]; // Fallback } 

请注意,上面的代码没有经过testing,但应该足够了。 你可能需要修改一下…

只需执行以下操作:

 NSString *dbpathResource = [[NSBundle mainBundle] pathForResource:@"databaseName" ofType:@"db"]; 

并且如果您在xx.lproj中拥有本地化的.db文件,那么将会采用正确的数据库。

像这样的东西:

 NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; NSString * rootPath = [[NSBundle mainBundle] resourcePath]; NSString * resourcePath = [[NSBundle mainBundle] pathForResource: @"mydatabase" ofType: @"db" inDirectory: rootPath forLocalization: language];