static jstring ICU_languageTagForLocale(JNIEnv* env, jclass, jstring javaLocaleId) {
    ScopedUtfChars localeID(env, javaLocaleId);

    // In most common cases, the BCP 47 tag will be the same size as the ICU
    // locale ID
    const size_t initialBufferSize = localeID.size() + 1;
    std::vector<char> buffer(initialBufferSize);

    UErrorCode status = U_ZERO_ERROR;
    const size_t outputLength = uloc_toLanguageTag(localeID.c_str(),
            &buffer[0], buffer.size(), false /* strict */, &status);
    if (status == U_BUFFER_OVERFLOW_ERROR) {
        buffer.resize(outputLength + 1);
        status = U_ZERO_ERROR;
        uloc_toLanguageTag(localeID.c_str(), &buffer[0], buffer.size(),
                false /* strict */, &status);
    }

    if (status == U_STRING_NOT_TERMINATED_WARNING) {
        buffer.resize(buffer.size() + 1);
        buffer[buffer.size() -1] = '\0';
    }

    if (maybeThrowIcuException(env, "ICU::languageTagForLocale", status)) {
        return NULL;
    }

    return env->NewStringUTF(&buffer[0]);
}
Exemple #2
0
ERL_NIF_TERM locale_language_tag(ErlNifEnv* env, int argc, 
    const ERL_NIF_TERM argv[])
{
    UErrorCode status = U_ZERO_ERROR;

    int32_t /*value_len,*/     key_len; 
    char    value[LOCALE_LEN], key[LOCALE_LEN];

    if (argc != 1)
        return enif_make_badarg(env);

    key_len = enif_get_atom(env, argv[0], (char*) key, 
                    LOCALE_LEN, ERL_NIF_LATIN1);

    if (!key_len) {
        return enif_make_badarg(env);
    }

    
    /*value_len =*/ uloc_toLanguageTag((const char*) key, /* Locale Id */
        (char *)  value, /* Name */
        (int32_t) LOCALE_LEN,
        FALSE,
        &status);
    CHECK(env, status);

    return enif_make_atom(env, value);
}
Exemple #3
0
int icu_canonicalize_language(lua_State *L) {
  const char* lang = luaL_checkstring(L, 1);
  char locale[200], minimized[200], result[200];
  UErrorCode error = 0;
  uloc_forLanguageTag(lang, locale, sizeof(locale), NULL, &error);
  if (!error) {
    uloc_minimizeSubtags(locale, minimized, sizeof(minimized), &error);
  }
  if (!error) {
    uloc_toLanguageTag(minimized, result, sizeof(result),
               /* strict */ 1, &error);
  }
  if (!error) {
    lua_pushstring(L, result);
  } else {
    lua_pushstring(L, "und");
  }
  return 1;
}