// WARNING: what should be done in case the locale does not exist on the system?
setlocale(LC_NUMERIC, mlt.attribute("LC_NUMERIC").toUtf8().constData());
documentLocale = QLocale(mlt.attribute("LC_NUMERIC"));
+
+ // Make sure Qt locale and C++ locale have the same numeric separator, might not be the case
+ // With some locales since C++ and Qt use a different database for locales
+ char *separator = localeconv()->decimal_point;
+ if (separator != documentLocale.decimalPoint()) {
+ kDebug()<<"------\n!!! system locale is not similar to Qt's locale... be prepared for bugs!!!\n------";
+ // HACK: There is a locale conflict, so set locale to at least have correct decimal point
+ if (strncmp(separator, ".", 1) == 0) documentLocale = QLocale::c();
+ else if (strncmp(separator, ",", 1) == 0) documentLocale = QLocale("fr_FR.UTF-8");
+ }
}
documentLocale.setNumberOptions(QLocale::OmitGroupSeparator);
- if (documentLocale != QLocale()) {
+ if (documentLocale.decimalPoint() != QLocale().decimalPoint()) {
+ // If loading an older MLT file without LC_NUMERIC, set locale to C which was previously the default
+ if (!mlt.hasAttribute("LC_NUMERIC")) setlocale(LC_NUMERIC, "C");
+
QLocale::setDefault(documentLocale);
// locale conversion might need to be redone
initEffects::parseEffectFiles();
}
- // TODO: remove after string freeze
- if (0)
- KMessageBox::sorry(kapp->activeWindow(), i18n("The document you are opening uses a different locale (%1) than your system. You can only open and render it, no editing is supported unless you change your system's locale.", mlt.attribute("LC_NUMERIC")), i18n("Read only project"));
-
// Upgrade the document to the latest version
if (!upgrade(documentLocale.toDouble(kdenliveDoc.attribute("version")), currentVersion))
return false;
}
QDomNodeList effects = m_doc.elementsByTagName("filter");
-
- for(int i = 0; i < effects.count(); ++i) {
+ int max = effects.count();
+ QStringList safeEffects;
+ for(int i = 0; i < max; ++i) {
QDomElement effect = effects.at(i).toElement();
QString effectId = EffectsList::property(effect, "kdenlive_id");
+ if (safeEffects.contains(effectId)) {
+ // Do not check the same effect twice if it is at the correct version
+ // (assume we don't have different versions of the same effect in a project file)
+ continue;
+ }
QString effectTag = EffectsList::property(effect, "tag");
QString effectVersionStr = EffectsList::property(effect, "version");
double effectVersion = effectVersionStr.isNull() ? -1 : effectVersionStr.toDouble();
QString effectString = updateRules.call(QScriptValue(), QScriptValueList() << serviceVersion << effectVersion << scriptDoc.toString()).toString();
- if (!effectString.isEmpty()) {
+ if (!effectString.isEmpty() && !scriptEngine.hasUncaughtException()) {
scriptDoc.setContent(effectString);
QDomNode updatedEffect = effect.ownerDocument().importNode(scriptDoc.documentElement(), true);
effect.parentNode().replaceChild(updatedEffect, effect);
} else {
m_modified = updateEffectParameters(effect.childNodes(), &updateRules, serviceVersion, effectVersion);
}
+
+ // set version number since MLT won't change it (only initially set it)
+ QDomElement versionElem = effect.firstChildElement("version");
+ if (EffectsList::property(effect, "version").isNull()) {
+ versionElem = effect.ownerDocument().createTextNode(QLocale().toString(serviceVersion)).toElement();
+ versionElem.setTagName("property");
+ versionElem.setAttribute("name", "version");
+ effect.appendChild(versionElem);
+ } else {
+ EffectsList::setProperty(effect, "version", QLocale().toString(serviceVersion));
+ }
}
+ else safeEffects.append(effectId);
}
}
}