Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple SQLite Databases for Multiple Languages?

I would like to implement a multi language support for my app. So I created the Localizing.strings file and all that stuff and translated my interface. So far so good …

Now I want to duplicate my database in order to have a *.db-file for every single language. So I did and then I clicked via XCode on the "+" under the Localization tab. I now have a *.db-file in my en.lproj and de.lproj folder.

My problem: If I want to copy the db-files to the app's documents directory the *.db file is not available of course because it is in the *.lproj-folder. Is there any command to get the right lproj-folder?

To clarify my needs: This doesn't work

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

… this does:

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

… but I don't want to add the "de.lproj" and "en.lproj" etc. manually. Is there any way to fix it dynamically?

like image 351
Dude Avatar asked Oct 11 '11 16:10

Dude


3 Answers

just do the following:

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

and if you have your localized .db file in xx.lproj so the correct database will be taken.

like image 176
Chakalaka Avatar answered Oct 14 '22 16:10

Chakalaka


What you want is the current language locale, the following code should return the code:

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

You can then do the following

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

You may want to check if the path exists and is a valid file, if not maybe use some default path like the one for English (en.lproj)

Edit: There is another way you can do this using NSLocale's preferred languages because then you get a list of the preferred languages, so some updated code for the first bit would be:

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

In the end, you'd end up with something like so:

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
}

Please note, the above code is untested but should suffice. You may need to modify it a little...

like image 44
Suhail Patel Avatar answered Oct 14 '22 16:10

Suhail Patel


Something like this:

NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * rootPath = [[NSBundle mainBundle] resourcePath];
NSString * resourcePath = [[NSBundle mainBundle] pathForResource: @"mydatabase" ofType: @"db" inDirectory: rootPath forLocalization: language];
like image 1
Perception Avatar answered Oct 14 '22 17:10

Perception