aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/qml/qdeclarativelocale.cpp30
-rw-r--r--src/declarative/qml/qdeclarativelocale_p.h4
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp1
3 files changed, 35 insertions, 0 deletions
diff --git a/src/declarative/qml/qdeclarativelocale.cpp b/src/declarative/qml/qdeclarativelocale.cpp
index 8ec51b058c..39d0f6c378 100644
--- a/src/declarative/qml/qdeclarativelocale.cpp
+++ b/src/declarative/qml/qdeclarativelocale.cpp
@@ -834,6 +834,36 @@ v8::Handle<v8::Value> QDeclarativeLocale::locale(QV8Engine *v8engine, const QStr
return v8Value;
}
+static const char *localeCompareFunction =
+ "(function(localeCompareFunc) { "
+ " var orig_localeCompare;"
+ " orig_localeCompare = String.prototype.localeCompare;"
+ " String.prototype.localeCompare = (function() {"
+ " var val = localeCompareFunc.apply(this, arguments);"
+ " if (val == undefined) val = orig_localeCompare.call(this);"
+ " return val;"
+ " })"
+ "})";
+
+void QDeclarativeLocale::registerStringLocaleCompare(QV8Engine *engine)
+{
+ registerFunction(engine, localeCompareFunction, localeCompare);
+}
+
+v8::Handle<v8::Value> QDeclarativeLocale::localeCompare(const v8::Arguments &args)
+{
+ if (args.Length() != 1 || (!args[0]->IsString() && !args[0]->IsStringObject()))
+ return v8::Undefined();
+
+ if (!args.This()->IsString() && !args.This()->IsStringObject())
+ return v8::Undefined();
+
+ QString thisString = QJSConverter::toString(args.This()->ToString());
+ QString thatString = QJSConverter::toString(args[0]->ToString());
+
+ return v8::Integer::New(QString::localeAwareCompare(thisString, thatString));
+}
+
/*!
\enum QtQuick2::Locale::FormatType
diff --git a/src/declarative/qml/qdeclarativelocale_p.h b/src/declarative/qml/qdeclarativelocale_p.h
index 904e4e6b11..98370fbf8a 100644
--- a/src/declarative/qml/qdeclarativelocale_p.h
+++ b/src/declarative/qml/qdeclarativelocale_p.h
@@ -119,8 +119,12 @@ public:
static v8::Handle<v8::Value> locale(QV8Engine *v8engine, const QString &lang);
+ static void registerStringLocaleCompare(QV8Engine *engine);
+
private:
QDeclarativeLocale();
+
+ static v8::Handle<v8::Value> localeCompare(const v8::Arguments &args);
};
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp
index 92cd336e1c..04589fe244 100644
--- a/src/declarative/qml/v8/qv8engine.cpp
+++ b/src/declarative/qml/v8/qv8engine.cpp
@@ -636,6 +636,7 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global)
#undef STRING_ARG
}
+ QDeclarativeLocale::registerStringLocaleCompare(this);
QDeclarativeDateExtension::registerExtension(this);
QDeclarativeNumberExtension::registerExtension(this);