pickAcceptLanguage function

String? pickAcceptLanguage(
  1. List<String> supportedLanguages,
  2. List<Language> acceptLanguage, {
  3. bool? loose = false,
})

Finds the best match from a list of supported languages and preferred languages.

Implementation

String? pickAcceptLanguage(
    List<String> supportedLanguages, List<Language> acceptLanguage,
    {bool? loose = false}) {
  if (supportedLanguages.isEmpty || acceptLanguage.isEmpty) {
    return null;
  }
  var supported = supportedLanguages.map((support) {
    var bits = support.split('-');
    var hasScript = bits.length == 3;

    return Language(
        code: bits[0],
        script: hasScript ? bits.tryGet(1) : null,
        region: hasScript ? bits.tryGet(2) : bits.tryGet(1));
  }).toList();

  for (var i = 0; i < acceptLanguage.length; i++) {
    var lang = acceptLanguage[i];
    var langCode = lang.code.toLowerCase();
    var langRegion = lang.region?.toLowerCase();
    var langScript = lang.script?.toLowerCase();
    for (var j = 0; j < supported.length; j++) {
      var supportedCode = supported[j].code.toLowerCase();
      var supportedScript = supported[j].script?.toLowerCase();
      var supportedRegion = supported[j].region?.toLowerCase();
      if (langCode == supportedCode &&
          (loose == true ||
              (langScript?.isEmpty ?? true) ||
              langScript == supportedScript) &&
          (loose == true ||
              (langRegion?.isEmpty ?? true) ||
              langRegion == supportedRegion)) {
        return supportedLanguages[j];
      }
    }
  }

  return null;
}