function lookupMatcher(service, requestedLocales) {
  if (IS_NULL(InternalRegExpMatch(GetServiceRE(), service))) {
    throw MakeError(kWrongServiceType, service);
  }

  // Cache these, they don't ever change per service.
  if (IS_UNDEFINED(AVAILABLE_LOCALES[service])) {
    AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service);
  }

  for (var i = 0; i < requestedLocales.length; ++i) {
    // Remove all extensions.
    var locale = InternalRegExpReplace(
        GetAnyExtensionRE(), requestedLocales[i], '');
    do {
      if (!IS_UNDEFINED(AVAILABLE_LOCALES[service][locale])) {
        // Return the resolved locale and extension.
        var extensionMatch = InternalRegExpMatch(
            GetUnicodeExtensionRE(), requestedLocales[i]);
        var extension = IS_NULL(extensionMatch) ? '' : extensionMatch[0];
        return {'locale': locale, 'extension': extension, 'position': i};
      }
      // Truncate locale if possible.
      var pos = %_Call(StringLastIndexOf, locale, '-');
      if (pos === -1) {
        break;
      }
      locale = %_Call(StringSubstring, locale, 0, pos);
    } while (true);
  }

  // Didn't find a match, return default.
  return {'locale': GetDefaultICULocaleJS(), 'extension': '', 'position': -1};
}
function lookupMatcher(service, requestedLocales) {
  if (IS_NULL(InternalRegExpMatch(GetServiceRE(), service))) {
    throw MakeError(kWrongServiceType, service);
  }

  
  if (IS_UNDEFINED(AVAILABLE_LOCALES[service])) {
    AVAILABLE_LOCALES[service] = getAvailableLocalesOf(service);
  }

  for (var i = 0; i < requestedLocales.length; ++i) {
    
    var locale = InternalRegExpReplace(
        GetAnyExtensionRE(), requestedLocales[i], '');
    do {
      if (!IS_UNDEFINED(AVAILABLE_LOCALES[service][locale])) {
        
        var extensionMatch = InternalRegExpMatch(
            GetUnicodeExtensionRE(), requestedLocales[i]);
        var extension = IS_NULL(extensionMatch) ? '' : extensionMatch[0];
        return {'locale': locale, 'extension': extension, 'position': i};
      }
      
      var pos = %_Call(StringLastIndexOf, locale, '-');
      if (pos === -1) {
        break;
      }
      locale = %_Call(StringSubstring, locale, 0, pos);
    } while (true);
  }

  
  return {'locale': GetDefaultICULocaleJS(), 'extension': '', 'position': -1};
}
function lookupMatcher ( service , requestedLocales ) { if ( IS_NULL ( InternalRegExpMatch ( GetServiceRE ( ) , service ) ) ) { throw MakeError ( kWrongServiceType , service ) ; } // Cache these, they don't ever change per service. if ( IS_UNDEFINED ( AVAILABLE_LOCALES [ service ] ) ) { AVAILABLE_LOCALES [ service ] = getAvailableLocalesOf ( service ) ; } for ( var i = 0 ; i < requestedLocales . length ; ++ i ) { // Remove all extensions. var locale = InternalRegExpReplace ( GetAnyExtensionRE ( ) , requestedLocales [ i ] , '' ) ; do { if ( ! IS_UNDEFINED ( AVAILABLE_LOCALES [ service ] [ locale ] ) ) { // Return the resolved locale and extension. var extensionMatch = InternalRegExpMatch ( GetUnicodeExtensionRE ( ) , requestedLocales [ i ] ) ; var extension = IS_NULL ( extensionMatch ) ? '' : extensionMatch [ 0 ] ; return { 'locale' : locale , 'extension' : extension , 'position' : i } ; } // Truncate locale if possible. var pos = % _Call ( StringLastIndexOf , locale , '-' ) ; if ( pos === - 1 ) { break ; } locale = % _Call ( StringSubstring , locale , 0 , pos ) ; } while ( true ) ; } // Didn't find a match, return default. return { 'locale' : GetDefaultICULocaleJS ( ) , 'extension' : '' , 'position' : - 1 } ; }
Returns best matched supported locale and extension info using basic
lookup algorithm.
Returns best matched supported locale and extension info using basic lookup algorithm .