- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在评估 C++ 框架 Qt v5.4.1。目前我是试图理解和应用Internationalization with Qt .
我通过文章帮助How to create a multi lingual application that can switchthe language at runtime?我知道如何使用 Qt Linguist Translation源 (.ts) 文件以及如何生成 Qt Linguist Message (.qm) 文件。我用构建系统 CMake自动生成,效果非常好。
在我的项目中,翻译是从 Qt 资源集合 (.qrc) 加载的文件编译到应用程序中。我知道如何通过翻译“静态”字符串成员函数 QObject::tr()
和 QObject::translate()
.
现在是棘手的部分:我想在我的应用程序发展的同时添加语言。目前我有以下两个 .ts 文件:
foo_ui_de_DE.ts
foo_ui_en_US.ts
这些是通过构建通过lrelease
编译成以下两个.qm文件过程:
foo_ui_de_DE.qm
foo_ui_en_US.qm
构建过程自动生成一个 .qrc 文件 translations.qrc
和通过rcc
将该文件编译成可执行文件。
来自声明文件(.h)的相关源代码:
#include <QMainWindow>
#include <QLocale>
#include <QString>
#include <QTranslator>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
/**
* Initializes a new instance of the MainWindow class with the given parent.
*
* @param parent The parent.
*/
explicit MainWindow(QWidget* parent = 0);
private slots:
/**
* Loads a language by the given language shortcut (e.g. `de_DE`, `en_US`).
*/
void LoadLanguage(QLocale const& kLocale);
void SwitchTranslator(QTranslator& translator,
QString const& kLocale,
QString const& kFilename);
/**
* Creates the language menu dynamically.
*/
void CreateLanguageMenu();
protected:
/**
* Handler which is activated when a new translator is loaded or the system
* language is changed.
*/
void changeEvent(QEvent* event);
protected slots:
/**
* Slot which is called by the language menu actions.
*/
void slotLanguageChanged(QAction* action);
private:
/**
* The translations for this application.
*/
QTranslator translator_;
/**
* The translations for the Qt Widgets used in this application.
*/
QTranslator qt_translator_;
/**
* Contains the currently loaded locale.
*/
QLocale locale_;
/**
* The main window of the application.
*/
Ui::MainWindow* ui_;
};
来自定义文件(.cc)的相关源代码:
#include <QLibraryInfo>
#include "main_window.h"
#include "ui_main_window.h"
MainWindow::MainWindow(QWidget* the_parent)
: QMainWindow{the_parent},
ui_{new Ui::MainWindow} {
ui_->setupUi(this);
CreateLanguageMenu();
}
MainWindow::~MainWindow() {
delete ui_;
}
void MainWindow::LoadLanguage(QLocale const& kNewLocale) {
QLocale::setDefault(kNewLocale);
QString const kLanguageName{QLocale::languageToString(kNewLocale.language())};
SwitchTranslator(translator_, "qt_" + kNewLocale.bcp47Name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
SwitchTranslator(qt_translator_,
qApp->applicationName() + '_' + kNewLocale.name(),
":/translations");
statusBar()->showMessage(
tr("Language changed to %1").arg(kLanguageName));
locale_ = kNewLocale;
}
void MainWindow::SwitchTranslator(QTranslator& translator,
QString const& kLocale,
QString const& kFilename) {
qApp->removeTranslator(&translator);
if (translator.load(kLocale, kFilename)) {
qApp->installTranslator(&translator);
}
}
void MainWindow::CreateLanguageMenu() {
// TODO(wolters): This is not optimal, since it does not work automatically
// with the .qm files added as a resource to the application.
//: Translation for the human language German.
QT_TR_NOOP("German");
//: Translation for the human language English.
QT_TR_NOOP("English");
QActionGroup* language_group{new QActionGroup(ui_->menuLanguage)};
language_group->setExclusive(true);
connect(language_group, SIGNAL(triggered(QAction*)), this,
SLOT(slotLanguageChanged(QAction*)));
QLocale const kDefaultLocale{QLocale::system()};
QDir const kDirectory{QApplication::applicationDirPath() + "/.."};
QStringList const kFileNames{kDirectory.entryList(QStringList("*.qm"))};
for (QString const& kFileName : kFileNames) {
QLocale const kLocale{QFileInfo{kFileName}.completeBaseName().replace(
qApp->applicationName() + "_", "")};
QString const kCountryCode{
kLocale.name().toLower().mid(kLocale.name().lastIndexOf('_') + 1)};
QIcon const kIcon{":/icons/flags/" + kCountryCode + ".png"};
QAction* action{new QAction{
kIcon,
// TODO(wolters): This does not work.
tr(QLocale::languageToString(kLocale.language()).toStdString().c_str()),
this}};
action->setCheckable(true);
action->setData(kLocale);
ui_->menuLanguage->addAction(action);
language_group->addAction(action);
if (kDefaultLocale == kLocale) {
action->setChecked(true);
}
}
}
void MainWindow::changeEvent(QEvent* the_event) {
if (nullptr != the_event) {
switch (the_event->type()) {
// QEvent::LanguageChange is send if a translator is loaded.
case QEvent::LanguageChange:
ui_->retranslateUi(this);
break;
// QEvent::LocaleChange is send, if the system language changes.
case QEvent::LocaleChange:
LoadLanguage(QLocale::system());
break;
default:
break;
}
}
QMainWindow::changeEvent(the_event);
}
void MainWindow::slotLanguageChanged(QAction* action) {
if (nullptr != action) {
LoadLanguage(qvariant_cast<QLocale>(action->data()));
}
}
源码已经在评论中描述了我遇到的问题。
Languages
以德语人类语言出现(我已经翻译了这两个项目在 .ts 文件中)。但是当我通过菜单将语言从德语切换到英语,两个项目标签不得到翻译。QT_TR_NOOP
上面),如果一种新的人类语言被添加到应用。最佳工作流程是:
我想我误解了什么,但我找不到解决办法在 WWW 上搜索了一会儿。
2015-04-01 更新:我想我使用了错误的方法。重要的部分是 Languages 菜单是在成员函数 CreateLanguageMenu()
中动态创建的。我需要如何翻译动态创建的菜单项这个问题的答案。所以这都是关于 QAction* action{new QAction{kIcon, tr(QLocale::languageToString(kLocale.language()).toStdString().c_str()), this}};
行那个功能。我认为我需要某种在编译时可用的查找功能...
最佳答案
正如您已经提到的,您需要实时查找功能。我建议这样的黑客:创建 QAction 对象时使用对象名称作为语言标识符
QT_TR_NOOP("LANG_ENG")
QAction* langAction = ...;
langAction->setObjectName("LANG_ENG");
在 Language Change 事件上调用一些方法来重新定义这个 Action
void retranslateLangActions()
{
QList<QAction*> widgetActions = this->findChildren<QAction*>();
foreach(QAction* act, widgetActions) // qt foreach macro
{
QString objName = act->objectName();
if (objName.startsWith("LANG_"))
{
act->setText(tr(objName.toStdString().c_str()));
}
}
}
关于c++ - 如果在 Qt 中使用国际化,则翻译 "dynamic"内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29376918/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!