Lua: Add support for translation

Change-Id: I5398480233c830bb08c641bc8193b068fb037032
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-07-23 11:10:36 +02:00
parent 8777b01cb3
commit 1220db049e
9 changed files with 215 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ add_qtc_plugin(Lua
bindings/qtcprocess.cpp
bindings/settings.cpp
bindings/texteditor.cpp
bindings/translate.cpp
bindings/utils.cpp
luaengine.cpp
luaengine.h

View File

@@ -0,0 +1,23 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "../luaengine.h"
#include <QCoreApplication>
namespace Lua::Internal {
void addTranslateModule()
{
::Lua::LuaEngine::autoRegister([](sol::state_view lua) {
const ScriptPluginSpec *pluginSpec = lua.get<ScriptPluginSpec *>("PluginSpec");
const QString trContext
= QString(pluginSpec->name).replace(QRegularExpression("[^a-zA-Z]"), "_");
lua["tr"] = [trContext](const char *text) -> QString {
return QCoreApplication::translate(trContext.toUtf8().constData(), text);
};
});
}
} // namespace Lua::Internal

View File

@@ -192,8 +192,9 @@ expected_str<LuaPluginSpec *> LuaEngine::loadPlugin(const Utils::FilePath &path)
return make_unexpected(contents.error());
sol::state lua;
lua["tr"] = [](const QString &str) { return str; };
auto result = lua.safe_script(
sol::protected_function_result result = lua.safe_script(
std::string_view(contents->data(), contents->size()),
sol::script_pass_on_error,
path.fileName().toUtf8().constData());

View File

@@ -46,6 +46,7 @@ void addProcessModule();
void addQtModule();
void addSettingsModule();
void addTextEditorModule();
void addTranslateModule();
void addUtilsModule();
class LuaJsExtension : public QObject
@@ -262,6 +263,7 @@ public:
addQtModule();
addSettingsModule();
addTextEditorModule();
addTranslateModule();
addUtilsModule();
Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); });

View File

@@ -6,6 +6,8 @@
#include "luaengine.h"
#include "luatr.h"
#include <coreplugin/icore.h>
#include <extensionsystem/extensionsystemtr.h>
#include <utils/algorithm.h>
@@ -14,6 +16,7 @@
#include <QJsonDocument>
#include <QLoggingCategory>
#include <QTranslator>
Q_LOGGING_CATEGORY(luaPluginSpecLog, "qtc.lua.pluginspec", QtWarningMsg)
@@ -45,6 +48,7 @@ LuaPluginSpec::LuaPluginSpec()
expected_str<LuaPluginSpec *> LuaPluginSpec::create(const FilePath &filePath, sol::table pluginTable)
{
const FilePath directory = filePath.parentDir();
std::unique_ptr<LuaPluginSpec> pluginSpec(new LuaPluginSpec());
if (!pluginTable.get_or<sol::function>("setup", {}))
@@ -63,8 +67,20 @@ expected_str<LuaPluginSpec *> LuaPluginSpec::create(const FilePath &filePath, so
if (!r)
return make_unexpected(r.error());
const QString langId = Core::ICore::userInterfaceLanguage();
FilePath path = directory / "ts" / QString("%1_%2.qm").arg(directory.fileName()).arg(langId);
QTranslator *translator = new QTranslator(qApp);
bool success = translator->load(path.toFSPathString(), directory.toFSPathString());
if (success)
qApp->installTranslator(translator);
else {
delete translator;
qCInfo(luaPluginSpecLog) << "No translation found";
}
pluginSpec->setFilePath(filePath);
pluginSpec->setLocation(filePath.parentDir());
pluginSpec->setLocation(directory);
pluginSpec->d->pluginScriptPath = filePath;
pluginSpec->d->printToOutputPane = pluginTable.get_or("printToOutputPane", false);

View File

@@ -1,5 +1,9 @@
---@meta
---@class PluginSpec
---@field name string The name of the plugin.
---@field pluginDirectory FilePath The directory of the plugin.
PluginSpec = {}
---The global qtc object defined in the Lua plugin.
---@class qtc
Qtc = {}
@@ -24,6 +28,7 @@ Qtc = {}
---@field Mimetypes? string XML MIME-info for registering additional or adapting built-in MIME types.
---@field JsonWizardPaths? string[] A list of paths relative to the plugin location or paths to the Qt resource system that are searched for template-based wizards.
---@field printToOutputPane? boolean Whether the `print(...)` function should print to the output pane or not. ( Default: false )
---@field languages? string[] A list of languages that the plugin supports.
QtcPlugin = {}
---@class QtcPluginDependency