0
votes

I am creating an app that for now I would like to offer in English and German. I checked the Base localization mark in the project configuration and added German. I left English as the development language.

Then I created a file Translation.plist which basically consists of dictionaries that I call categories, e.g. I have one dictionary for button texts, label texts etc. Each of the category dictionaries again consists of dictionaries that contain two Strings: value and comment. Translation.plist is localized via XCode. The folders Base.lproj, en.lproj and de.lproj exist and contain a copy of the plist-file as expected.

Then I created a class Translator.swift that is supposed to load the Translation.plist file as an NSDictionary depending on the user's preferred locale. The code looks like this:

func relevantDictionary(category: String) -> NSDictionary {
    let preferredLocale = Bundle.main.preferredLocalizations.first ?? "Base"
    NSLog("User's preferred locale is \(preferredLocale)")
    guard let url = Bundle.main.url(forResource: "Translation", withExtension: "plist") else {
        fatalError("Could not find Translation.plist")
    }

    NSLog("Using \(url.absoluteURL) for translation")
    guard let root = NSDictionary(contentsOf: url) else {
        fatalError("Could not find dictionary for category (locale=\(preferredLocale)")
    }

    guard let relevant = root.value(forKey: category) as? NSDictionary else {
        fatalError("Could not create dictionary from Translation.plist")
    }

    return relevant
}

Then I created a String extension that uses the Translator as follows:

func localize(category: String) -> String {
    return Translator.instance.translate(category: category, string: self)
}

With this I call the Translator by "yes".localize("button"). In English I would expect "Yes", in German I would expect "Ja". The log says the following:

2017-07-05 08:45:24.728 myApp[13598:35048360] User's preferred locale is de_DE

2017-07-05 08:45:24.728 myApp[13598:35048360] Using file:///Users/me/Library/Developer/CoreSimulator/Devices/A39D3318-943D-4EFE-BB97-5C2218279132/data/Containers/Bundle/Application/4614E696-B52E-4C30-BBE8-3C76F6392413/myApp.app/Base.lproj/Translation.plist for translation

I wonder why this happens and what I have missed. I would have expected that de.lproj/Translation.plist is loaded instead of Base.lproj/Translation.plist.

Any help is highly appreciated.

1
Why are you creating your own plist files in the first place? You should use .strings files shouldn't you?Sweeper
I just feel more comfortable and flexible when I use plist-files. They are more powerful in terms of how I can organize my localizations.Martin

1 Answers

0
votes

You can do it with single .plist file. You don't need to create different .plist files for it.

Firstly, Add English and German countries with locale in Project -> info
https://i.stack.imgur.com/M4QIY.png

Once, you added countries with locale in Project -> info then add localizable.strings file in your bundle.
https://i.stack.imgur.com/lnjgL.png

At the end, just add country's locale in your language support class.

NSArray* languages = @[@"en", @"de"];`enter code here`
    NSString *current = [languages objectAtIndex:0];
    [self setLanguage:current];

Hope it would help you.