attempted to implement localization loading
This commit is contained in:
+16
-11
@@ -43,6 +43,7 @@ add_subdirectory(shaders)
|
||||
add_subdirectory(task)
|
||||
add_subdirectory(threading)
|
||||
add_subdirectory(timeline)
|
||||
add_subdirectory(ts)
|
||||
add_subdirectory(tool)
|
||||
add_subdirectory(ui)
|
||||
add_subdirectory(undo)
|
||||
@@ -62,11 +63,25 @@ if(APPLE)
|
||||
)
|
||||
endif()
|
||||
|
||||
# Add translations
|
||||
qt5_add_translation(OLIVE_QM_FILES ${OLIVE_TS_FILES})
|
||||
|
||||
set(QRC_BODY "")
|
||||
foreach(QM_FILE ${OLIVE_QM_FILES})
|
||||
get_filename_component(QM_FILENAME_COMPONENT ${QM_FILE} NAME_WE)
|
||||
string(APPEND QRC_BODY "<file alias=\"${QM_FILENAME_COMPONENT}\">${QM_FILE}</file>\n")
|
||||
endforeach()
|
||||
configure_file(ts/translations.qrc.in ts/translations.qrc @ONLY)
|
||||
|
||||
set(OLIVE_RESOURCES
|
||||
${OLIVE_RESOURCES}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ts/translations.qrc
|
||||
)
|
||||
|
||||
# Add executable
|
||||
add_executable(${OLIVE_TARGET}
|
||||
${OLIVE_SOURCES}
|
||||
${OLIVE_RESOURCES}
|
||||
${OLIVE_QM_FILES}
|
||||
)
|
||||
|
||||
if(APPLE)
|
||||
@@ -265,16 +280,6 @@ endif()
|
||||
# Set compiler definitions
|
||||
target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS})
|
||||
|
||||
set(OLIVE_TS_FILES
|
||||
# FIXME: Empty variable
|
||||
)
|
||||
|
||||
if(UPDATE_TS)
|
||||
qt5_create_translation(OLIVE_QM_FILES ${CMAKE_SOURCE_DIR} ${OLIVE_TS_FILES})
|
||||
else()
|
||||
qt5_add_translation(OLIVE_QM_FILES ${OLIVE_TS_FILES})
|
||||
endif()
|
||||
|
||||
add_subdirectory(packaging)
|
||||
|
||||
if(DOXYGEN_FOUND)
|
||||
|
||||
@@ -34,11 +34,11 @@ CommandLineParser::~CommandLineParser()
|
||||
}
|
||||
}
|
||||
|
||||
const CommandLineParser::Option *CommandLineParser::AddOption(const QStringList &strings, const QString &description)
|
||||
const CommandLineParser::Option *CommandLineParser::AddOption(const QStringList &strings, const QString &description, bool takes_arg, const QString &arg_placeholder)
|
||||
{
|
||||
Option* o = new Option();
|
||||
|
||||
options_.append({strings, description, o});
|
||||
options_.append({strings, description, o, takes_arg, arg_placeholder});
|
||||
|
||||
return o;
|
||||
}
|
||||
@@ -72,6 +72,12 @@ void CommandLineParser::Process(int argc, char **argv)
|
||||
if (!s.compare(arg_basename, Qt::CaseInsensitive)) {
|
||||
// Flag discovered!
|
||||
o.option->Set();
|
||||
|
||||
if (o.takes_arg && i+1 < argc) {
|
||||
o.option->SetSetting(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
|
||||
matched_known = true;
|
||||
goto found_flag;
|
||||
}
|
||||
@@ -147,7 +153,11 @@ void CommandLineParser::PrintHelp(const char* filename)
|
||||
all_args.append(this_arg);
|
||||
}
|
||||
|
||||
printf(" %s\n", all_args.toUtf8().constData());
|
||||
if (o.arg_placeholder.isEmpty()) {
|
||||
printf(" %s\n", all_args.toUtf8().constData());
|
||||
} else {
|
||||
printf(" %s <%s>\n", all_args.toUtf8().constData(), o.arg_placeholder.toUtf8().constData());
|
||||
}
|
||||
|
||||
printf(" %s\n\n", o.description.toUtf8().constData());
|
||||
}
|
||||
|
||||
@@ -33,7 +33,27 @@ public:
|
||||
|
||||
DISABLE_COPY_MOVE(CommandLineParser)
|
||||
|
||||
class Option {
|
||||
class PositionalArgument
|
||||
{
|
||||
public:
|
||||
PositionalArgument() = default;
|
||||
|
||||
const QString& GetSetting() const
|
||||
{
|
||||
return setting_;
|
||||
}
|
||||
|
||||
void SetSetting(const QString& s)
|
||||
{
|
||||
setting_ = s;
|
||||
}
|
||||
|
||||
private:
|
||||
QString setting_;
|
||||
|
||||
};
|
||||
|
||||
class Option : public PositionalArgument {
|
||||
public:
|
||||
Option()
|
||||
{
|
||||
@@ -55,29 +75,9 @@ public:
|
||||
|
||||
};
|
||||
|
||||
class PositionalArgument
|
||||
{
|
||||
public:
|
||||
PositionalArgument() = default;
|
||||
|
||||
const QString& GetSetting() const
|
||||
{
|
||||
return setting_;
|
||||
}
|
||||
|
||||
void SetSetting(const QString& s)
|
||||
{
|
||||
setting_ = s;
|
||||
}
|
||||
|
||||
private:
|
||||
QString setting_;
|
||||
|
||||
};
|
||||
|
||||
CommandLineParser() = default;
|
||||
|
||||
const Option* AddOption(const QStringList& strings, const QString& description);
|
||||
const Option* AddOption(const QStringList& strings, const QString& description, bool takes_arg = false, const QString& arg_placeholder = QString());
|
||||
|
||||
const PositionalArgument* AddPositionalArgument(const QString& name, const QString& description, bool required = false);
|
||||
|
||||
@@ -90,6 +90,8 @@ private:
|
||||
QStringList args;
|
||||
QString description;
|
||||
Option* option;
|
||||
bool takes_arg;
|
||||
QString arg_placeholder;
|
||||
};
|
||||
|
||||
struct KnownPositionalArgument {
|
||||
|
||||
@@ -68,7 +68,7 @@ void Config::SetDefaults()
|
||||
SetEntryInternal(QStringLiteral("AudioScrubbing"), NodeParam::kBoolean, true);
|
||||
SetEntryInternal(QStringLiteral("AutorecoveryInterval"), NodeParam::kInt, 1);
|
||||
SetEntryInternal(QStringLiteral("DiskCacheSaveInterval"), NodeParam::kInt, 10000);
|
||||
SetEntryInternal(QStringLiteral("Language"), NodeParam::kString, QLocale::system().name());
|
||||
SetEntryInternal(QStringLiteral("Language"), NodeParam::kString, QString());
|
||||
SetEntryInternal(QStringLiteral("ScrollZooms"), NodeParam::kBoolean, false);
|
||||
SetEntryInternal(QStringLiteral("EnableSeekToImport"), NodeParam::kBoolean, false);
|
||||
SetEntryInternal(QStringLiteral("EditToolAlsoSeeks"), NodeParam::kBoolean, false);
|
||||
|
||||
@@ -83,6 +83,8 @@ Core::Core(const CoreParams& params) :
|
||||
// Store reference to this object, making the assumption that Core will only ever be made in
|
||||
// main(). This will obviously break if not.
|
||||
instance_ = this;
|
||||
|
||||
translator_ = new QTranslator(this);
|
||||
}
|
||||
|
||||
Core *Core::instance()
|
||||
@@ -119,6 +121,9 @@ void Core::Start()
|
||||
// Load application config
|
||||
Config::Load();
|
||||
|
||||
// Set locale based on either startup arg, config, or auto-detect
|
||||
SetStartupLocale();
|
||||
|
||||
// Declare custom types for Qt signal/slot system
|
||||
DeclareTypesForQt();
|
||||
|
||||
@@ -906,6 +911,34 @@ QString Core::GetRecentProjectsFilePath()
|
||||
return QDir(FileFunctions::GetConfigurationLocation()).filePath(QStringLiteral("recent"));
|
||||
}
|
||||
|
||||
void Core::SetStartupLocale()
|
||||
{
|
||||
// Set language
|
||||
if (!core_params_.startup_language().isEmpty()) {
|
||||
if (translator_->load(core_params_.startup_language())) {
|
||||
if (QApplication::installTranslator(translator_)) {
|
||||
qDebug() << "Successfully installed language at" << translator_->filePath();
|
||||
} else {
|
||||
qDebug() << "Failed to install translator";
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
qWarning() << "Failed to load translation file. Falling back to defaults.";
|
||||
}
|
||||
}
|
||||
|
||||
QString use_locale = Config::Current()[QStringLiteral("Language")].toString();
|
||||
|
||||
if (use_locale.isEmpty()) {
|
||||
// No configured locale, auto-detect the system's locale
|
||||
use_locale = QLocale::system().name();
|
||||
}
|
||||
|
||||
if (!SetLanguage(use_locale)) {
|
||||
qWarning() << "Trying to use locale" << use_locale << "but couldn't find a translation for it";
|
||||
}
|
||||
}
|
||||
|
||||
bool Core::SaveProject(ProjectPtr p)
|
||||
{
|
||||
if (p->filename().isEmpty()) {
|
||||
@@ -1307,6 +1340,18 @@ bool Core::ValidateFootageInLoadedProject(ProjectPtr project, const QString& pro
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core::SetLanguage(const QString &locale)
|
||||
{
|
||||
QApplication::removeTranslator(translator_);
|
||||
|
||||
QString resource_path = QStringLiteral(":/ts/%1").arg(locale);
|
||||
if (translator_->load(resource_path) && QApplication::installTranslator(translator_)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Core::CloseAllProjects()
|
||||
{
|
||||
return CloseAllProjects(true);
|
||||
|
||||
+28
@@ -24,6 +24,7 @@
|
||||
#include <QFileInfoList>
|
||||
#include <QList>
|
||||
#include <QTimer>
|
||||
#include <QTranslator>
|
||||
|
||||
#include "common/rational.h"
|
||||
#include "common/timecodefunctions.h"
|
||||
@@ -93,11 +94,23 @@ public:
|
||||
startup_project_ = p;
|
||||
}
|
||||
|
||||
const QString& startup_language() const
|
||||
{
|
||||
return startup_language_;
|
||||
}
|
||||
|
||||
void set_startup_language(const QString& s)
|
||||
{
|
||||
startup_language_ = s;
|
||||
}
|
||||
|
||||
private:
|
||||
RunMode mode_;
|
||||
|
||||
QString startup_project_;
|
||||
|
||||
QString startup_language_;
|
||||
|
||||
bool run_fullscreen_;
|
||||
|
||||
};
|
||||
@@ -273,6 +286,11 @@ public:
|
||||
*/
|
||||
bool ValidateFootageInLoadedProject(ProjectPtr project, const QString &project_saved_url);
|
||||
|
||||
/**
|
||||
* @brief Changes the current language
|
||||
*/
|
||||
bool SetLanguage(const QString& locale);
|
||||
|
||||
static const uint kProjectVersion;
|
||||
|
||||
public slots:
|
||||
@@ -431,6 +449,11 @@ private:
|
||||
*/
|
||||
static QString GetRecentProjectsFilePath();
|
||||
|
||||
/**
|
||||
* @brief Called only on startup to set the locale
|
||||
*/
|
||||
void SetStartupLocale();
|
||||
|
||||
/**
|
||||
* @brief Saves a specific project
|
||||
*/
|
||||
@@ -527,6 +550,11 @@ private:
|
||||
*/
|
||||
static Core* instance_;
|
||||
|
||||
/**
|
||||
* @brief Internal translator
|
||||
*/
|
||||
QTranslator* translator_;
|
||||
|
||||
private slots:
|
||||
void SaveAutorecovery();
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <QPushButton>
|
||||
|
||||
#include "common/autoscroll.h"
|
||||
#include "core.h"
|
||||
#include "dialog/sequence/sequence.h"
|
||||
#include "project/item/sequence/sequence.h"
|
||||
|
||||
@@ -46,34 +47,23 @@ PreferencesGeneralTab::PreferencesGeneralTab()
|
||||
language_combobox_ = new QComboBox();
|
||||
|
||||
// Add default language (en-US)
|
||||
language_combobox_->addItem(QLocale("en_US").nativeLanguageName());
|
||||
QDir language_dir(QStringLiteral(":/ts"));
|
||||
QStringList languages = language_dir.entryList();
|
||||
foreach (const QString& l, languages) {
|
||||
AddLanguage(l);
|
||||
}
|
||||
|
||||
/*
|
||||
// add languages from file
|
||||
QList<QString> translation_paths = get_language_paths();
|
||||
QString current_language = Config::Current()[QStringLiteral("Language")].toString();
|
||||
if (current_language.isEmpty()) {
|
||||
// No configured language, use system language
|
||||
current_language = QLocale::system().name();
|
||||
|
||||
// iterate through all language search paths
|
||||
for (int j=0;j<translation_paths.size();j++) {
|
||||
QDir translation_dir(translation_paths.at(j));
|
||||
if (translation_dir.exists()) {
|
||||
QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot);
|
||||
for (int i=0;i<translation_files.size();i++) {
|
||||
// get path of translation relative to the application path
|
||||
QString locale_full_path = translation_dir.filePath(translation_files.at(i));
|
||||
QString locale_relative_path = QDir(get_app_path()).relativeFilePath(locale_full_path);
|
||||
|
||||
QFileInfo locale_file(translation_files.at(i));
|
||||
QString locale_file_basename = locale_file.baseName();
|
||||
QString locale_str = locale_file_basename.mid(locale_file_basename.lastIndexOf('_')+1);
|
||||
language_combobox->addItem(QLocale(locale_str).nativeLanguageName(), locale_relative_path);
|
||||
|
||||
if (olive::config.language_file == locale_relative_path) {
|
||||
language_combobox->setCurrentIndex(language_combobox->count() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
// If we don't have a language for this, default to en_US
|
||||
if (!languages.contains(current_language)) {
|
||||
current_language = QStringLiteral("en_US");
|
||||
}
|
||||
*/
|
||||
}
|
||||
language_combobox_->setCurrentIndex(languages.indexOf(current_language));
|
||||
|
||||
general_layout->addWidget(language_combobox_, row, 1);
|
||||
|
||||
@@ -112,11 +102,30 @@ PreferencesGeneralTab::PreferencesGeneralTab()
|
||||
|
||||
void PreferencesGeneralTab::Accept()
|
||||
{
|
||||
Config::Current()["RectifiedWaveforms"] = rectified_waveforms_->isChecked();
|
||||
Config::Current()[QStringLiteral("RectifiedWaveforms")] = rectified_waveforms_->isChecked();
|
||||
|
||||
Config::Current()["Autoscroll"] = autoscroll_method_->currentData();
|
||||
Config::Current()[QStringLiteral("Autoscroll")] = autoscroll_method_->currentData();
|
||||
|
||||
Config::Current()["DefaultStillLength"] = QVariant::fromValue(rational::fromDouble(default_still_length_->GetValue()));
|
||||
Config::Current()[QStringLiteral("DefaultStillLength")] = QVariant::fromValue(rational::fromDouble(default_still_length_->GetValue()));
|
||||
|
||||
QString set_language = language_combobox_->currentData().toString();
|
||||
if (QLocale::system().name() == set_language) {
|
||||
// Language is set to the system, assume this is effectively "auto"
|
||||
set_language = QString();
|
||||
}
|
||||
|
||||
// If the language has changed, set it now
|
||||
if (Config::Current()[QStringLiteral("Language")].toString() != set_language) {
|
||||
Config::Current()[QStringLiteral("Language")] = set_language;
|
||||
Core::instance()->SetLanguage(set_language.isEmpty() ? QLocale::system().name() : set_language);
|
||||
}
|
||||
}
|
||||
|
||||
void PreferencesGeneralTab::AddLanguage(const QString &locale_name)
|
||||
{
|
||||
language_combobox_->addItem(tr("%1 (%2)").arg(QLocale(locale_name).nativeLanguageName(),
|
||||
locale_name));;
|
||||
language_combobox_->setItemData(language_combobox_->count() - 1, locale_name);
|
||||
}
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
@@ -40,6 +40,8 @@ public:
|
||||
virtual void Accept() override;
|
||||
|
||||
private:
|
||||
void AddLanguage(const QString& locale_name);
|
||||
|
||||
QComboBox* language_combobox_;
|
||||
|
||||
QComboBox* autoscroll_method_;
|
||||
|
||||
@@ -94,6 +94,12 @@ int main(int argc, char *argv[])
|
||||
parser.AddOption({QStringLiteral("x"), QStringLiteral("-export")},
|
||||
QCoreApplication::translate("main", "Export only (No GUI)"));
|
||||
|
||||
const CommandLineParser::Option* ts_option =
|
||||
parser.AddOption({QStringLiteral("-ts")},
|
||||
QCoreApplication::translate("main", "Override language with file"),
|
||||
true,
|
||||
QCoreApplication::translate("main", "qm-file"));
|
||||
|
||||
const CommandLineParser::PositionalArgument* project_argument =
|
||||
parser.AddPositionalArgument(QStringLiteral("project"),
|
||||
QCoreApplication::translate("main", "Project to open on startup"));
|
||||
@@ -116,6 +122,14 @@ int main(int argc, char *argv[])
|
||||
startup_params.set_run_mode(OLIVE_NAMESPACE::Core::CoreParams::kHeadlessExport);
|
||||
}
|
||||
|
||||
if (ts_option->IsSet()) {
|
||||
if (ts_option->GetSetting().isEmpty()) {
|
||||
qWarning() << "--ts was set but no translation file was provided";
|
||||
} else {
|
||||
startup_params.set_startup_language(ts_option->GetSetting());
|
||||
}
|
||||
}
|
||||
|
||||
startup_params.set_fullscreen(fullscreen_option->IsSet());
|
||||
|
||||
startup_params.set_startup_project(project_argument->GetSetting());
|
||||
@@ -156,6 +170,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Start core
|
||||
OLIVE_NAMESPACE::Core c(startup_params);
|
||||
|
||||
c.Start();
|
||||
|
||||
int ret = a->exec();
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Olive - Non-Linear Video Editor
|
||||
# Copyright (C) 2019 Olive Team
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
set(OLIVE_TS_FILES
|
||||
ts/en_US.ts
|
||||
PARENT_SCOPE
|
||||
)
|
||||
+4762
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/ts">
|
||||
@QRC_BODY@
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -31,7 +31,8 @@ OLIVE_NAMESPACE_ENTER
|
||||
/**
|
||||
* @brief A widget that is always dockable within the MainWindow.
|
||||
*/
|
||||
class PanelWidget : public QDockWidget {
|
||||
class PanelWidget : public QDockWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
/**
|
||||
|
||||
@@ -49,7 +49,8 @@ OLIVE_NAMESPACE_ENTER
|
||||
/**
|
||||
* @brief Olive's main window responsible for docking widgets and the main menu bar.
|
||||
*/
|
||||
class MainWindow : public QMainWindow {
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MainWindow(QWidget *parent = nullptr);
|
||||
|
||||
Reference in New Issue
Block a user