/** * Translate an ISO639-3 compatible 3-letter string * into the PKP locale identifier. * * This can be ambiguous if several locales are defined * for the same language. In this case we'll use the * primary locale to disambiguate. * * If that still doesn't determine a unique locale then * we'll choose the first locale found. * * @param $iso3 string * @return string */ function getLocaleFromIso3($iso3) { assert(strlen($iso3) == 3); $primaryLocale = AppLocale::getPrimaryLocale(); $localeCandidates = array(); $locales =& AppLocale::_getAllLocalesCacheContent(); foreach ($locales as $locale => $localeData) { assert(isset($localeData['iso639-3'])); if ($localeData['iso639-3'] == $iso3) { if ($locale == $primaryLocale) { // In case of ambiguity the primary locale // overrides all other options so we're done. return $primaryLocale; } $localeCandidates[] = $locale; } } // Return null if we found no candidate locale. if (empty($localeCandidates)) { return null; } if (count($localeCandidates) > 1) { // Check whether one of the candidate locales // is a supported locale. If so choose the first // supported locale. $supportedLocales = AppLocale::getSupportedLocales(); foreach ($supportedLocales as $supportedLocale => $localeName) { if (in_array($supportedLocale, $localeCandidates)) { return $supportedLocale; } } } // If there is only one candidate (or if we were // unable to disambiguate) then return the unique // (first) candidate found. return array_shift($localeCandidates); }