StelzenPieper
StelzenPieper

Reputation: 23

Locale.Language - how to differentiate between regions

I have the following code:

if let index = currentLanguages.firstIndex(where: { $0.languageCode == language.languageCode }) {            
    currentLanguages.remove(at: index)         
} else {
    currentLanguages.append(language)
}

where currentLanguages is an array [Locale.Language] and language is simply Locale.Language. Now I have a button to toggle each language on or off. But when I select Chinese (Taiwan) it does not differentiate from Chinese (China mainland). Why does this happen even if I use maximalIdentifier to compare or even with script and region compared in the same case? How can I make sure to differentiate on a regional level? This is for translation purposes so it will matter ^^

Thanks in advance!

Upvotes: 0

Views: 60

Answers (2)

StelzenPieper
StelzenPieper

Reputation: 23

Thanks to workindog I checked again to see how I am storing the languages in my model. And after setting maximalIdentifier here on my language properies it works like a charm!

Solution is:

var selectedProjectLanguagesRaw: [String]?
var selectedProjectLanguages: [Locale.Language]? {
    get {
        guard let rawValues = selectedProjectLanguagesRaw else { return nil }
        return rawValues.compactMap { Locale.Language(identifier: $0) }
    }
    set {
        selectedProjectLanguagesRaw = newValue?.compactMap { $0.maximalIdentifier }
    }
}

Thanks again for the help!!

Upvotes: 1

For How can I make sure to differentiate on a regional level, try this approach to compare the different regions between Chinese (Taiwan) and Chinese (China mainland) as you call them.

let taiwanLocale = Locale(identifier: "zh-TW")
let chinaLocale = Locale(identifier: "zh-CN")

print("taiwan languageCode: \(taiwanLocale.language.languageCode)")
print("china languageCode: \(chinaLocale.language.languageCode)\n")

print("taiwanRegion: \(taiwanLocale.region)")
print("chinaRegion: \(chinaLocale.region)\n")

// Compare language
if taiwanLocale.language.languageCode == chinaLocale.language.languageCode {
    print("Both use the same language: \(taiwanLocale.language.languageCode ?? "Unknown")")
} else {
    print("Different languages: \(taiwanLocale.language.languageCode ?? "Unknown") vs \(chinaLocale.language.languageCode ?? "Unknown")")
}

// Compare Region  <--- here
if taiwanLocale.region == chinaLocale.region {
    print("Same region: \(taiwanLocale.region?.identifier ?? "Unknown")")
} else {
    print("Different regions: \(taiwanLocale.region ?? "Unknown") vs \(chinaLocale.region?.identifier ?? "Unknown")")
}

The results give you:

taiwan languageCode: Optional(zh)

china languageCode: Optional(zh)

taiwanRegion: Optional(TW)

chinaRegion: Optional(CN)

Both use the same language: zh

Different regions: TW vs CN

Upvotes: 0

Related Questions