already_AddRefed<nsHyphenator> nsHyphenationManager::GetHyphenator(nsIAtom *aLocale) { nsRefPtr<nsHyphenator> hyph; mHyphenators.Get(aLocale, getter_AddRefs(hyph)); if (hyph) { return hyph.forget(); } nsCOMPtr<nsIFile> file = mPatternFiles.Get(aLocale); if (!file) { nsCOMPtr<nsIAtom> alias = mHyphAliases.Get(aLocale); if (alias) { mHyphenators.Get(alias, getter_AddRefs(hyph)); if (hyph) { return hyph.forget(); } file = mPatternFiles.Get(alias); if (file) { aLocale = alias; } } if (!file) { // In the case of a locale such as "de-DE-1996", we try replacing // successive trailing subtags with "-*" to find fallback patterns, // so "de-DE-1996" -> "de-DE-*" (and then recursively -> "de-*") nsAtomCString localeStr(aLocale); if (StringEndsWith(localeStr, NS_LITERAL_CSTRING("-*"))) { localeStr.Truncate(localeStr.Length() - 2); } PRInt32 i = localeStr.RFindChar('-'); if (i > 1) { localeStr.Replace(i, localeStr.Length() - i, "-*"); nsCOMPtr<nsIAtom> fuzzyLocale = do_GetAtom(localeStr); return GetHyphenator(fuzzyLocale); } else { return nsnull; } } } hyph = new nsHyphenator(file); if (hyph->IsValid()) { mHyphenators.Put(aLocale, hyph); return hyph.forget(); } #ifdef DEBUG nsCString msg; file->GetNativePath(msg); msg.Insert("failed to load patterns from ", 0); NS_WARNING(msg.get()); #endif mPatternFiles.Remove(aLocale); return nsnull; }
NS_IMETHODIMP nsPlatformCharset::GetDefaultCharsetForLocale(const nsAString& localeName, nsACString &oResult) { // // if this locale is the user's locale then use the charset // we already determined at initialization // if (mLocale.Equals(localeName) || // support the 4.x behavior (mLocale.LowerCaseEqualsLiteral("en_us") && localeName.LowerCaseEqualsLiteral("c"))) { oResult = mCharset; return NS_OK; } #if HAVE_LANGINFO_CODESET // // This locale appears to be a different locale from the user's locale. // To do this we would need to lock the global resource we are currently // using or use a library that provides multi locale support. // ICU is a possible example of a multi locale library. // http://oss.software.ibm.com/icu/ // // A more common cause of hitting this warning than the above is that // Mozilla is launched under an ll_CC.UTF-8 locale. In xpLocale, // we only store the language and the region (ll-CC) losing 'UTF-8', which // leads |mLocale| to be different from |localeName|. Although we lose // 'UTF-8', we init'd |mCharset| with the value obtained via // |nl_langinfo(CODESET)| so that we're all right here. // NS_WARNING("GetDefaultCharsetForLocale: need to add multi locale support"); #ifdef DEBUG_jungshik printf("localeName=%s mCharset=%s\n", NS_ConvertUTF16toUTF8(localeName).get(), mCharset.get()); #endif // until we add multi locale support: use the the charset of the user's locale oResult = mCharset; return NS_SUCCESS_USING_FALLBACK_LOCALE; #else // // convert from locale to charset // using the deprecated locale to charset mapping // nsAutoString localeStr(localeName); nsresult res = ConvertLocaleToCharsetUsingDeprecatedConfig(localeStr, oResult); if (NS_SUCCEEDED(res)) return res; NS_ERROR("unable to convert locale to charset using deprecated config"); oResult.AssignLiteral("ISO-8859-1"); return NS_SUCCESS_USING_FALLBACK_LOCALE; #endif }