diff src/gui/locale.cc @ 109:79714c95a145

*: add translation files and locale files I forgot to add these in the last commit :p also now you have to ask cmake to update the translations because before the ts files were not tracked (obviously)
author Paper <mrpapersonic@gmail.com>
date Mon, 06 Nov 2023 01:51:44 -0500
parents
children 39521c47c7a3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/locale.cc	Mon Nov 06 01:51:44 2023 -0500
@@ -0,0 +1,108 @@
+#include "gui/locale.h"
+#include "core/strings.h"
+#include <QTranslator>
+#include <QLocale>
+#include <QDir>
+#include <QString>
+#include <QApplication>
+#include <iostream>
+
+namespace Locale {
+
+std::string GetLocaleFullName(const QLocale& locale) {
+	QString res = QLocale::languageToString(locale.language());
+	if (locale.country() != QLocale::AnyCountry)
+		res += " (" + QLocale::countryToString(locale.country()) + ")";
+	return Strings::ToUtf8String(res);
+}
+
+Locale::Locale() {
+	RefreshAvailableLocales();
+
+	/* default to en_US */
+	if (!IsLocaleAvailable(QLocale()))
+		SetActiveLocale(QLocale("en_US"));
+	else /* TODO: is this needed? */
+		SetActiveLocale(QLocale());
+}
+
+Locale::Locale(const std::string& name) {
+	RefreshAvailableLocales();
+	SetActiveLocale(QLocale(Strings::ToQString(name)));
+}
+
+QLocale Locale::GetLocale() {
+	return _locale;
+}
+
+std::vector<QLocale> Locale::GetAvailableLocales() {
+	return _available_translations;
+}
+
+void Locale::RefreshAvailableLocales() {
+	_available_translations.clear();
+
+	/* we will always have en_US */
+	_available_translations.push_back(QLocale("en_US"));
+
+	QDir dir(":/locale");
+	if (!dir.exists())
+		return;
+
+	QStringList translations = dir.entryList({"*.qm"}, QDir::Files);
+
+	_available_translations.reserve(translations.size());
+	for (const QString& str : translations) {
+		_available_translations.push_back(QLocale(str.mid(0, str.lastIndexOf("."))));
+	}
+}
+
+bool Locale::IsLocaleAvailable(const QLocale& locale) {
+	for (const QLocale& l : _available_translations)
+		if (l == locale)
+			return true;
+	return false;
+}
+
+bool Locale::SetActiveLocale(const QLocale& locale) {
+	if (!IsLocaleAvailable(locale))
+		return false;
+	if (_locale == locale)
+		return true; /* we're... already on this locale :) */
+
+	_locale = locale;
+	QLocale::setDefault(_locale);
+
+	/* we can still do stuff even if one thing fails! */
+	bool return_value = true;
+
+	const QString name = _locale.name();
+	if (!SwitchTranslator(_translator, QString(":/locale/%1.qm").arg(name)))
+		return_value = false;
+
+	const QString path = qApp->applicationDirPath();
+	if (!SwitchTranslator(_translator_qt, path + QString("/translations/qt_%1.qm").arg(name))) {
+		/* Sometimes Qt will have proper translations for the language, but not the specific
+		   country. In that case, we still want to use that language. */
+		const int underscore_index = name.lastIndexOf("_");
+		if (!underscore_index)
+			return false;
+
+		const QString short_name = name.mid(0, underscore_index);
+		if (!SwitchTranslator(_translator_qt, path + QString("/translations/qt_%1.qm").arg(short_name)))
+			return_value = false;
+	}
+
+	return return_value;
+}
+
+bool Locale::SwitchTranslator(QTranslator& translator, const QString& path) {
+	qApp->removeTranslator(&translator);
+
+	if (!translator.load(path))
+		return false;
+	qApp->installTranslator(&translator);
+	return true;
+}
+
+}