/**
  * 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);
 }