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]); }
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); }
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; }