2011-10-11 27 views
6

Chciałbym wdrożyć obsługę wielu języków dla mojej aplikacji. Więc stworzyłem plik Localizing.strings i wszystkie te rzeczy i przetłumaczyłem mój interfejs. Do tej pory tak dobrze ...Wiele baz danych SQLite dla wielu języków?

Teraz chcę skopiować moją bazę danych, aby mieć plik * .db dla każdego języka. Tak zrobiłem, a następnie kliknąłem XCode na "+" pod zakładką Lokalizacja. Mam teraz plik * .db w folderze en.lproj i de.lproj.

Mój problem: Jeśli chcę skopiować pliki db do katalogu dokumentów aplikacji, plik * .db jest oczywiście niedostępny, ponieważ znajduje się w folderze * .lproj. Czy jest jakieś polecenie, aby uzyskać odpowiedni folder Lproj?

Aby wyjaśnić moje potrzeby: To nie działa

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

... to robi:

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

... ale nie chcę, aby dodać "de.lproj" i " en.lproj "itp. ręcznie. Czy jest jakiś sposób, aby to naprawić dynamicznie?

Odpowiedz

2

Co chcesz jest obecny regionalne języka poniższy kod powinien zwrócić kod:

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

Następnie można wykonać następujące czynności

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

Możesz sprawdzić, czy istnieje ścieżka i jest poprawnym plikiem, jeśli nie, może użyć domyślnej ścieżki, takiej jak angielska (en.lproj)

Edycja: Istnieje inny sposób, w jaki można to zrobić za pomocą preferowanego NSLocale Języki bo wtedy masz listę preferowanych języków, więc niektóre zaktualizowany kod dla pierwszego bitu byłoby:

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

W końcu, można by skończyć z czymś tak:

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 
} 

Należy pamiętać, że powyższy kod jest nieprzetestowany, ale powinien wystarczyć. Być może trzeba zmodyfikować go trochę ...

+0

niesamowita odpowiedź! Dziękuję Ci bardzo! – Dude

+0

fileExistsAtPath: pathComponent musi być fileExistsAtPath: path - wtedy działa idealnie – Dude

+0

Doh! Zmieniłem odpowiedź, aby odzwierciedlić poprawkę dla każdego, kto natknie się na odpowiedź. –

1

coś takiego:

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

prostu wykonaj następujące czynności:

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

a jeśli masz zlokalizowaną plik db w xx. lproj, więc poprawna baza danych zostanie pobrana.