I've ended up with the following, 100% automatic solution, and you don't need to collect any ISO code at all.
+ (NSString*)detectBestLanguageBCP47:(CLPlacemark *)placemark {
NSString * countryCode = placemark.ISOcountryCode;
for (AVSpeechSynthesisVoice *voice in AVSpeechSynthesisVoice.speechVoices) {
NSString *langCode = [voice.language substringWithRange:NSMakeRange(0, 2)];
NSString *cc = [voice.language substringWithRange:NSMakeRange(3, 2)];
int c = [cc compare:countryCode];
if (c==0) {
NSString *bcp47 =[ NSString stringWithFormat:@"%@-%@", langCode, cc];
return bcp47;
}
}
return nil; // Not found
}