languages.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * languages.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "languages.h"
  12. #include "../lib/CConfigHandler.h"
  13. #include "../lib/texts/Languages.h"
  14. #include "../lib/texts/CGeneralTextHandler.h"
  15. #include <QComboBox>
  16. #include <QListWidget>
  17. // list of language names, for generation of translations. Do not use directly, use Languages namespace instead
  18. static const std::array<std::string, 27> languageTranslatedNamesGenerator = {
  19. {
  20. QT_TRANSLATE_NOOP("Language", "Belarusian"),
  21. QT_TRANSLATE_NOOP("Language", "Bulgarian"),
  22. QT_TRANSLATE_NOOP("Language", "Czech"),
  23. QT_TRANSLATE_NOOP("Language", "Chinese"),
  24. QT_TRANSLATE_NOOP("Language", "Dutch"),
  25. QT_TRANSLATE_NOOP("Language", "English"),
  26. QT_TRANSLATE_NOOP("Language", "Filipino"),
  27. QT_TRANSLATE_NOOP("Language", "Finnish"),
  28. QT_TRANSLATE_NOOP("Language", "French"),
  29. QT_TRANSLATE_NOOP("Language", "German"),
  30. QT_TRANSLATE_NOOP("Language", "Greek"),
  31. QT_TRANSLATE_NOOP("Language", "Hungarian"),
  32. QT_TRANSLATE_NOOP("Language", "Italian"),
  33. QT_TRANSLATE_NOOP("Language", "Japanese"),
  34. QT_TRANSLATE_NOOP("Language", "Korean"),
  35. QT_TRANSLATE_NOOP("Language", "Latvian"),
  36. QT_TRANSLATE_NOOP("Language", "Norwegian"),
  37. QT_TRANSLATE_NOOP("Language", "Polish"),
  38. QT_TRANSLATE_NOOP("Language", "Portuguese"),
  39. QT_TRANSLATE_NOOP("Language", "Romanian"),
  40. QT_TRANSLATE_NOOP("Language", "Russian"),
  41. QT_TRANSLATE_NOOP("Language", "Serbian"),
  42. QT_TRANSLATE_NOOP("Language", "Spanish"),
  43. QT_TRANSLATE_NOOP("Language", "Swedish"),
  44. QT_TRANSLATE_NOOP("Language", "Turkish"),
  45. QT_TRANSLATE_NOOP("Language", "Ukrainian"),
  46. QT_TRANSLATE_NOOP("Language", "Vietnamese"),
  47. }
  48. };
  49. static_assert(languageTranslatedNamesGenerator.size() == static_cast<size_t>(Languages::ELanguages::COUNT), "Languages array is missing a value!");
  50. QString Languages::getHeroesDataLanguage()
  51. {
  52. CGeneralTextHandler::detectInstallParameters();
  53. QString language = QString::fromStdString(settings["session"]["language"].String());
  54. double deviation = settings["session"]["languageDeviation"].Float();
  55. if(deviation > 0.1)
  56. return QString();
  57. return language;
  58. }
  59. QString generateAutodetectedLanguageName(QString const & language)
  60. {
  61. std::string languageNameEnglish = Languages::getLanguageOptions(language.toStdString()).nameEnglish;
  62. QString languageName = QApplication::translate( "Language", languageNameEnglish.c_str());
  63. QString itemName = QApplication::translate("Language", "Auto (%1)").arg(languageName);
  64. return itemName;
  65. }
  66. QString Languages::generateLanguageName(const Languages::Options & language)
  67. {
  68. std::string activeLanguage = settings["general"]["language"].String();
  69. QString localizedName = QApplication::translate("Language", language.nameEnglish.c_str());
  70. QString nativeName = language.nameNative.c_str();
  71. if(activeLanguage == language.identifier)
  72. return nativeName;
  73. QString displayName = QString("%1 (%2)").arg(localizedName, nativeName);
  74. return displayName;
  75. }
  76. void Languages::fillLanguages(QComboBox * widget, bool includeAll)
  77. {
  78. QSignalBlocker guard(widget); // we do not want calls caused by initialization
  79. widget->clear();
  80. std::string activeLanguage = includeAll ?
  81. settings["general"]["gameDataLanguage"].String():
  82. settings["general"]["language"].String();
  83. if (includeAll)
  84. {
  85. QString language = getHeroesDataLanguage();
  86. if (!language.isEmpty())
  87. widget->addItem(generateAutodetectedLanguageName(language), QString("auto"));
  88. if (activeLanguage == "auto")
  89. widget->setCurrentIndex(0);
  90. }
  91. for(const auto & language : Languages::getLanguageList())
  92. {
  93. if(!language.selectable && activeLanguage != language.identifier)
  94. continue;
  95. QString displayName = generateLanguageName(language);
  96. QVariant userData = QString::fromStdString(language.identifier);
  97. widget->addItem(displayName, userData);
  98. if(activeLanguage == language.identifier)
  99. widget->setCurrentIndex(widget->count() - 1);
  100. }
  101. }
  102. void Languages::fillLanguages(QListWidget * widget, bool includeAll)
  103. {
  104. QSignalBlocker guard(widget); // we do not want calls caused by initialization
  105. widget->clear();
  106. std::string activeLanguage = includeAll ?
  107. settings["general"]["gameDataLanguage"].String():
  108. settings["general"]["language"].String();
  109. if (includeAll)
  110. {
  111. QString language = getHeroesDataLanguage();
  112. if (!language.isEmpty())
  113. {
  114. widget->addItem(generateAutodetectedLanguageName(language));
  115. widget->item(widget->count() - 1)->setData(Qt::UserRole, QString("auto"));
  116. if (activeLanguage == "auto")
  117. widget->setCurrentRow(0);
  118. }
  119. }
  120. for(const auto & language : Languages::getLanguageList())
  121. {
  122. if(!language.selectable && activeLanguage != language.identifier)
  123. continue;
  124. QString displayName = generateLanguageName(language);
  125. QVariant userData = QString::fromStdString(language.identifier);
  126. widget->addItem(displayName);
  127. widget->item(widget->count() - 1)->setData(Qt::UserRole, userData);
  128. if(activeLanguage == language.identifier)
  129. widget->setCurrentRow(widget->count() - 1);
  130. }
  131. }