【Qt】通过QtCreator源码学习Qt(十):多国语言支持

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(""), 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

你可能感兴趣的:(Qt)