15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains utility functions for dealing with localized 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_L10N_L10N_UTIL_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_L10N_L10N_UTIL_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util_mac.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace l10n_util { 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This method translates a generic locale name to one of the locally defined 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// ones. This method returns true if it succeeds. 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)UI_EXPORT bool CheckAndResolveLocale(const std::string& locale, 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string* resolved_locale); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method is responsible for determining the locale as defined below. In 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nearly all cases you shouldn't call this, rather use GetApplicationLocale 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined on browser_process. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the locale used by the Application. First we use the value from the 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// command line (--lang), second we try the value in the prefs file (passed in 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as |pref_locale|), finally, we fall back on the system locale. We only return 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a value if there's a corresponding resource DLL for the locale. Otherwise, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we fall back to en-us. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetApplicationLocale(const std::string& pref_locale); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Returns true if a display name for |locale| is available in the locale 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// |display_locale|. 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)UI_EXPORT bool IsLocaleNameTranslated(const char* locale, 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& display_locale); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a locale code, return true if the OS is capable of supporting it. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For instance, Oriya is not well supported on Windows XP and we return 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false for "or". 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsLocaleSupportedByOS(const std::string& locale); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method returns the display name of the locale code in |display_locale|. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For example, for |locale| = "fr" and |display_locale| = "en", 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it returns "French". To get the display name of 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |locale| in the UI language of Chrome, |display_locale| can be 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set to the return value of g_browser_process->GetApplicationLocale() 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the UI thread. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |is_for_ui| is true, U+200F is appended so that it can be 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rendered properly in a RTL Chrome. 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetDisplayNameForLocale( 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& locale, 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& display_locale, 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_for_ui); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the display name of the |country_code| in |display_locale|. 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetDisplayNameForCountry( 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& country_code, 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& display_locale); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts all - into _, to be consistent with ICU and file system names. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string NormalizeLocale(const std::string& locale); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Produce a vector of parent locales for given locale. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It includes the current locale in the result. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sr_Cyrl_RS generates sr_Cyrl_RS, sr_Cyrl and sr. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT void GetParentLocales(const std::string& current_locale, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* parent_locales); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if a string is plausibly a syntactically-valid locale string, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for cases where we want the valid input to be a locale string such as 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'en', 'pt-BR', 'fil', 'es-419', 'zh-Hans-CN', 'i-klingon' or 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'de_DE@collation=phonebook', but we don't want to limit it to 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locales that Chrome actually knows about, so 'xx-YY' should be 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accepted, but 'z', 'German', 'en-$1', or 'abcd-1234' should not. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Case-insensitive. Based on BCP 47, see: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT bool IsValidLocaleSyntax(const std::string& locale); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mac Note: See l10n_util_mac.h for some NSString versions and other support. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pulls resource string from the string bundle and returns it. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetStringUTF8(int message_id); 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringUTF16(int message_id); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Get a resource string and replace $i with replacements[i] for all 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// i < replacements.size(). Additionally, $$ is replaced by $. 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// If non-NULL |offsets| will be replaced with the start points of the replaced 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// strings. 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16( 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int message_id, 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& replacements, 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<size_t>* offsets); 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Convenience wrappers for the above. 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a); 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b); 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& c); 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& c, 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& d); 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& c, 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& d, 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& e); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetStringFUTF8(int message_id, 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetStringFUTF8(int message_id, 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetStringFUTF8(int message_id, 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& c); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT std::string GetStringFUTF8(int message_id, 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& c, 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& d); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Variants that return the offset(s) of the replaced parameters. The 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// vector based version returns offsets ordered by parameter. For example if 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invoked with a and b offsets[0] gives the offset for a and offsets[1] the 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// offset of b regardless of where the parameters end up in the string. 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) size_t* offset); 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16(int message_id, 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& a, 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& b, 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<size_t>* offsets); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience functions to get a string with a single number as a parameter. 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetStringFUTF16Int(int message_id, int a); 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 GetStringFUTF16Int(int message_id, int64 a); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Get a resource string using |number| to decide which of |message_ids| should 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// be used. |message_ids| must be size 6 and in order: default, singular, zero, 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// two, few, many. 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UI_EXPORT base::string16 GetPluralStringFUTF16( 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& message_ids, 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int number); 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)UI_EXPORT std::string GetPluralStringFUTF8(const std::vector<int>& message_ids, 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int number); 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// In place sorting of base::string16 strings using collation rules for |locale|. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT void SortStrings16(const std::string& locale, 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16>* strings); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a vector of available locale codes. E.g., a vector containing 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// en-US, es, fr, fi, pt-PT, pt-BR, etc. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT const std::vector<std::string>& GetAvailableLocales(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a vector of locale codes usable for accept-languages. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI_EXPORT void GetAcceptLanguagesForLocale( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_locale, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* locale_codes); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the preferred size of the contents view of a window based on 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// designer given constraints which might dependent on the language used. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UI_EXPORT int GetLocalizedContentsWidthInPixels(int pixel_resource_id); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace l10n_util 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_BASE_L10N_L10N_UTIL_H_ 185