版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/88558973
1、获取系统支持的语言
QStringList uiLanguages;
uiLanguages = QLocale::system().uiLanguages();
2、从设置中获取想要显示的语言,尝试覆盖默认的
QString overrideLanguage = settings->value(QLatin1String("General/OverrideLanguage")).toString();
if (!overrideLanguage.isEmpty())
//将想要设置的语言插入字符链表的最开始,以便优先设置
uiLanguages.prepend(overrideLanguage);
3、获取保存翻译的文件路径:
如QtCreator程序中翻译:~/Qt5.6.3/Tools/QtCreator/share/qtcreator/translations
const QString &creatorTrPath = QCoreApplication::applicationDirPath() + QLatin1String(SHARE_PATH) + QLatin1String("/translations");
4、循环加载
foreach (QString locale, uiLanguages) {
//该步骤的功能:如果locale不合法,尝试返回最近的或默认的
locale = QLocale(locale).name();
5、如果加载成功,查找Qt本身的翻译部件,然后一起注册
if (translator.load(QLatin1String("qtcreator_") + locale, creatorTrPath)) {
//Qt安装目录中的翻译:~/Qt5.6.3/5.6.3/gcc_64/translations
const QString &qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
const QString &qtTrFile = QLatin1String("qt_") + locale;
//安装二进制可执行程序时,会将Qt安装目录中的翻译拷贝到可执行程序中
//注意:这里是以QtCreator为例,一般程序中没有share(SHARE_PATH)目录
//,直接在程序所在目录下的translations中
if (qtTranslator.load(qtTrFile, qtTrPath) || qtTranslator.load(qtTrFile, creatorTrPath)) {
app.installTranslator(&translator);
app.installTranslator(&qtTranslator);
app.setProperty("qtc_locale", locale);
break;
}
translator.load(QString()); // unload()
}
}
6、界面设置:使用QComboBox来实现
参见QtCreator源码:src/plugins/coreplugin/generalsettings.cpp
void GeneralSettings::fillLanguageBox() const
{
// 获取当前语言设置
const QString currentLocale = ICore::settings()->value(QLatin1String("General/OverrideLanguage")).toString();
m_page->languageBox->addItem(tr("<System Language>"), QString());
// 需要显式地添加这个,因为没有用于英语的qm文件
m_page->languageBox->addItem(QLatin1String("English"), QLatin1String("C"));
if (currentLocale == QLatin1String("C"))
m_page->languageBox->setCurrentIndex(m_page->languageBox->count() - 1); //将上面新添加的addItem设置为当前项
//获取翻译文件列表
const QString creatorTrPath = ICore::resourcePath() + QLatin1String("/translations");
const QStringList languageFiles = QDir(creatorTrPath).entryList(QStringList(QLatin1String("qtcreator*.qm")));
foreach (const QString &languageFile, languageFiles) {
int start = languageFile.indexOf(QLatin1Char('_'))+1;
int end = languageFile.lastIndexOf(QLatin1Char('.'));
const QString locale = languageFile.mid(start, end-start);
// 无需显示创建者无论如何都不会加载的语言
// hasQmFilesForLocale函数会查找qt_开头的翻译文件,如果没有就没必要加载程序的翻译文件了
if (hasQmFilesForLocale(locale, creatorTrPath)) {
QLocale tmpLocale(locale);
QString languageItem = QLocale::languageToString(tmpLocale.language()) + QLatin1String(" (")
+ QLocale::countryToString(tmpLocale.country()) + QLatin1Char(')');
m_page->languageBox->addItem(languageItem, locale);
if (locale == currentLocale)
////将上面新添加的addItem设置为当前项
m_page->languageBox->setCurrentIndex(m_page->languageBox->count() - 1);
}
}
}
// hasQmFilesForLocale函数会查找qt_开头的翻译文件,如果没有,就没必要加载程序的
翻译文件了
static bool hasQmFilesForLocale(const QString &locale, const QString &creatorTrPath)
{
static const QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
const QString trFile = QLatin1String("/qt_") + locale + QLatin1String(".qm");
return QFile::exists(qtTrPath + trFile) || QFile::exists(creatorTrPath + trFile);
}
7、其它操作(重置、设置)见源码
src/plugins/coreplugin/generalsettings.cpp中搜索languageBox