Index: chrome/common/l10n_util.cc |
=================================================================== |
--- chrome/common/l10n_util.cc (revision 10076) |
+++ chrome/common/l10n_util.cc (working copy) |
@@ -4,16 +4,11 @@ |
#include "build/build_config.h" |
-#include <algorithm> |
- |
#include "chrome/common/l10n_util.h" |
#include "base/command_line.h" |
#include "base/file_util.h" |
-#include "base/logging.h" |
#include "base/path_service.h" |
-#include "base/scoped_ptr.h" |
-#include "base/string_util.h" |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/gfx/chrome_canvas.h" |
@@ -24,8 +19,6 @@ |
#if defined(OS_WIN) |
#include "chrome/views/view.h" |
#endif // defined(OS_WIN) |
-#include "unicode/coll.h" |
-#include "unicode/locid.h" |
#include "unicode/rbbi.h" |
#include "unicode/uchar.h" |
@@ -99,45 +92,6 @@ |
return U_SUCCESS(error_code); |
} |
-// Compares two wstrings and returns true if the first arg is less than the |
-// second arg. This uses the locale specified in the constructor. |
-class StringComparator : public std::binary_function<const std::wstring&, |
- const std::wstring&, |
- bool> { |
- public: |
- explicit StringComparator(Collator* collator) |
- : collator_(collator) { } |
- |
- // Returns true if lhs preceeds rhs. |
- bool operator() (const std::wstring& lhs, const std::wstring& rhs) { |
- UErrorCode error = U_ZERO_ERROR; |
-#if defined(WCHAR_T_IS_UTF32) |
- // Need to convert to UTF-16 to be compatible with UnicodeString's |
- // constructor. |
- string16 lhs_utf16 = WideToUTF16(lhs); |
- string16 rhs_utf16 = WideToUTF16(rhs); |
- |
- UCollationResult result = collator_->compare( |
- static_cast<const UChar*>(lhs_utf16.c_str()), |
- static_cast<int>(lhs_utf16.length()), |
- static_cast<const UChar*>(rhs_utf16.c_str()), |
- static_cast<int>(rhs_utf16.length()), |
- error); |
-#else |
- UCollationResult result = collator_->compare( |
- static_cast<const UChar*>(lhs.c_str()), static_cast<int>(lhs.length()), |
- static_cast<const UChar*>(rhs.c_str()), static_cast<int>(rhs.length()), |
- error); |
-#endif |
- DCHECK(U_SUCCESS(error)); |
- |
- return result == UCOL_LESS; |
- } |
- |
- private: |
- Collator* collator_; |
-}; |
- |
// Returns true if |locale_name| has an alias in the ICU data file. |
bool IsDuplicateName(const std::string& locale_name) { |
static const char* const kDuplicateNames[] = { |
@@ -250,6 +204,35 @@ |
return ASCIIToWide(ret); |
} |
+// Compares the character data stored in two different strings by specified |
+// Collator instance. |
+UCollationResult CompareStringWithCollator(const Collator* collator, |
+ const std::wstring& lhs, |
+ const std::wstring& rhs) { |
+ DCHECK(collator); |
+ UErrorCode error = U_ZERO_ERROR; |
+#if defined(WCHAR_T_IS_UTF32) |
+ // Need to convert to UTF-16 to be compatible with UnicodeString's |
+ // constructor. |
+ string16 lhs_utf16 = WideToUTF16(lhs); |
+ string16 rhs_utf16 = WideToUTF16(rhs); |
+ |
+ UCollationResult result = collator->compare( |
+ static_cast<const UChar*>(lhs_utf16.c_str()), |
+ static_cast<int>(lhs_utf16.length()), |
+ static_cast<const UChar*>(rhs_utf16.c_str()), |
+ static_cast<int>(rhs_utf16.length()), |
+ error); |
+#else |
+ UCollationResult result = collator->compare( |
+ static_cast<const UChar*>(lhs.c_str()), static_cast<int>(lhs.length()), |
+ static_cast<const UChar*>(rhs.c_str()), static_cast<int>(rhs.length()), |
+ error); |
+#endif |
+ DCHECK(U_SUCCESS(error)); |
+ return result; |
+} |
+ |
} // namespace |
namespace l10n_util { |
@@ -601,18 +584,20 @@ |
} |
#endif // defined(OS_WIN) |
+// Specialization of operator() method for std::wstring version. |
+template <> |
+bool StringComparator<std::wstring>::operator()(const std::wstring& lhs, |
+ const std::wstring& rhs) { |
+ // If we can not get collator instance for specified locale, just do simple |
+ // string compare. |
+ if (!collator_) |
+ return lhs < rhs; |
+ return CompareStringWithCollator(collator_, lhs, rhs) == UCOL_LESS; |
+}; |
+ |
void SortStrings(const std::wstring& locale, |
std::vector<std::wstring>* strings) { |
- UErrorCode error = U_ZERO_ERROR; |
- Locale loc(WideToUTF8(locale).c_str()); |
- scoped_ptr<Collator> collator(Collator::createInstance(loc, error)); |
- if (U_FAILURE(error)) { |
- // Just do an string sort. |
- sort(strings->begin(), strings->end()); |
- return; |
- } |
- StringComparator c(collator.get()); |
- sort(strings->begin(), strings->end(), c); |
+ SortVectorWithStringKey(locale, strings, false); |
} |
const std::vector<std::wstring>& GetAvailableLocales() { |