Made the list of languages WML-configurable.
This commit is contained in:
parent
cf47ae69b2
commit
3fbe2a5863
7 changed files with 219 additions and 67 deletions
|
@ -1,5 +1,7 @@
|
|||
{themes}
|
||||
|
||||
{language.cfg}
|
||||
|
||||
{traits.cfg}
|
||||
|
||||
{utils.cfg}
|
||||
|
@ -92,31 +94,6 @@ default=yes
|
|||
|
||||
[/game_config]
|
||||
|
||||
[textdomain]
|
||||
name="wesnoth"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-lib"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-editor"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-httt"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-ei"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-tdh"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-trow"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-sotbe"
|
||||
[/textdomain]
|
||||
|
||||
#ifdef APPLE
|
||||
[hotkey]
|
||||
command=preferences
|
||||
|
|
147
data/language.cfg
Normal file
147
data/language.cfg
Normal file
|
@ -0,0 +1,147 @@
|
|||
|
||||
[textdomain]
|
||||
name="wesnoth"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-lib"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-editor"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-httt"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-ei"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-tdh"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-trow"
|
||||
[/textdomain]
|
||||
[textdomain]
|
||||
name="wesnoth-sotbe"
|
||||
[/textdomain]
|
||||
|
||||
[locale]
|
||||
locale="af_ZA"
|
||||
name="Afrikaans"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="bg_BG"
|
||||
name="Български (Bulgarski)"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="ca_ES"
|
||||
name="Català"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="cs_CZ"
|
||||
name="Čeština"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="da_DK"
|
||||
name="Dansk"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="de_DE"
|
||||
name="Deutsch"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="el_GR"
|
||||
name="Ελληνικά (Ellinika)"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="et_EE"
|
||||
name="Eesti"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="en_GB"
|
||||
name="English [GB]"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="C"
|
||||
name="English [US]"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="es_ES"
|
||||
name="Español"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="eu_ES"
|
||||
name="Euskera"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="fr_FR"
|
||||
name="Français"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="it_IT"
|
||||
name="Italiano"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="la_IT"
|
||||
name="Latina"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="hu_HU"
|
||||
name="Magyar"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="nl_NL"
|
||||
name="Nederlands"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="ja_JP"
|
||||
name="日本語 (Nihongo)"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="no_NO"
|
||||
name="Norsk"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="oc_FR"
|
||||
name="Occitan"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="pl_PL"
|
||||
name="Polski"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="pt_BR"
|
||||
name="Português do Brasil"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="ru_RU"
|
||||
name="Русский (Russkij)"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="sk_SK"
|
||||
name="Slovenčina"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="sl_SI"
|
||||
name="Slovenščina"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="sr_CS"
|
||||
name="Srpski"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="tr_TR"
|
||||
name="Türkçe"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="fi_FI"
|
||||
name="Suomi"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="sv_SE"
|
||||
name="Svenska"
|
||||
[/locale]
|
||||
[locale]
|
||||
locale="zh_CN"
|
||||
name="中文 (Zhongwen)"
|
||||
[/locale]
|
||||
|
|
@ -378,9 +378,10 @@ void map_editor::change_language() {
|
|||
const int res = gui::show_dialog(gui_,NULL,_("Language"),
|
||||
_("Choose your preferred language:"),
|
||||
gui::OK_CANCEL,&langs);
|
||||
if(size_t(res) < langs.size()) {
|
||||
::set_language(known_languages[res]);
|
||||
preferences::set_language(known_languages[res].localename);
|
||||
const std::vector<language_def>& languages = get_languages();
|
||||
if(size_t(res) < languages.size()) {
|
||||
::set_language(languages[res]);
|
||||
preferences::set_language(languages[res].localename);
|
||||
|
||||
game_config_.reset_translation();
|
||||
|
||||
|
|
|
@ -235,12 +235,13 @@ int main(int argc, char** argv)
|
|||
//Set the locale first, then read the configuration, or else WML
|
||||
//strings are not correctly translated. Does this work on on the win32
|
||||
//platform?
|
||||
load_language_list();
|
||||
const bool lang_res = ::set_language(get_locale());
|
||||
if(!lang_res) {
|
||||
std::cerr << "No translation for locale '" << get_locale().language
|
||||
<< "', default to system locale\n";
|
||||
|
||||
const bool lang_res = ::set_language(known_languages[0]);
|
||||
const bool lang_res = ::set_language(get_languages()[0]);
|
||||
if(!lang_res) {
|
||||
std::cerr << "Language data not found\n";
|
||||
}
|
||||
|
|
39
src/game.cpp
39
src/game.cpp
|
@ -385,16 +385,11 @@ bool game_controller::init_config()
|
|||
|
||||
bool game_controller::init_language()
|
||||
{
|
||||
const bool lang_res = ::set_language(get_locale());
|
||||
if(!lang_res) {
|
||||
std::cerr << "No translation for locale '" << get_locale().language
|
||||
<< "', default to system locale\n";
|
||||
if(!::load_language_list())
|
||||
return false;
|
||||
|
||||
const bool lang_res = ::set_language(known_languages[0]);
|
||||
if(!lang_res) {
|
||||
std::cerr << "Language data not found\n";
|
||||
}
|
||||
}
|
||||
if (!::set_language(get_locale()))
|
||||
return false;
|
||||
|
||||
if(!no_gui_) {
|
||||
SDL_WM_SetCaption(_("The Battle for Wesnoth"), NULL);
|
||||
|
@ -1205,26 +1200,24 @@ bool game_controller::play_multiplayer()
|
|||
|
||||
bool game_controller::change_language()
|
||||
{
|
||||
std::vector<language_def> langdefs = get_languages();
|
||||
|
||||
// this only works because get_languages() returns a fresh vector at each calls
|
||||
// unless show_gui cleans the "*" flag
|
||||
const std::vector<language_def>::iterator current = std::find(langdefs.begin(),langdefs.end(),get_language());
|
||||
if(current != langdefs.end()) {
|
||||
(*current).language = "*" + (*current).language;
|
||||
}
|
||||
|
||||
// prepare a copy with just the labels for the list to be displayed
|
||||
const std::vector<language_def>& languages = get_languages();
|
||||
std::vector<std::string> langs;
|
||||
langs.reserve(langdefs.size());
|
||||
std::transform(langdefs.begin(),langdefs.end(),std::back_inserter(langs),languagedef_name);
|
||||
|
||||
for (std::vector<language_def>::const_iterator itor = languages.begin();
|
||||
itor != languages.end(); ++itor) {
|
||||
if (*itor == get_language()) {
|
||||
langs.push_back("*" + itor->language);
|
||||
} else {
|
||||
langs.push_back(itor->language);
|
||||
}
|
||||
}
|
||||
|
||||
const int res = gui::show_dialog(disp(),NULL,_("Language"),
|
||||
_("Choose your preferred language:"),
|
||||
gui::OK_CANCEL,&langs);
|
||||
if(size_t(res) < langs.size()) {
|
||||
::set_language(known_languages[res]);
|
||||
preferences::set_language(known_languages[res].localename);
|
||||
::set_language(languages[res]);
|
||||
preferences::set_language(languages[res].localename);
|
||||
|
||||
refresh_game_cfg(true);
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "util.hpp"
|
||||
#include "serialization/parser.hpp"
|
||||
#include "serialization/preprocessor.hpp"
|
||||
#include "wassert.hpp"
|
||||
#include "wesconfig.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
@ -37,6 +38,9 @@ namespace {
|
|||
string_map strings_;
|
||||
}
|
||||
|
||||
std::vector<language_def> known_languages;
|
||||
|
||||
#if 0
|
||||
language_def known_languages[] = {
|
||||
language_def("", N_("System default language")),
|
||||
language_def("af_ZA", "Afrikaans"),
|
||||
|
@ -73,6 +77,7 @@ language_def known_languages[] = {
|
|||
// end of list marker, do not remove
|
||||
language_def("", "")
|
||||
};
|
||||
#endif
|
||||
|
||||
std::string languagedef_name (const language_def& def)
|
||||
{
|
||||
|
@ -84,7 +89,7 @@ bool languagedef_lessthan_p (const language_def& def1, const language_def& def2)
|
|||
return (def1.language < def2.language);
|
||||
}
|
||||
|
||||
bool language_def::operator== (const language_def& a)
|
||||
bool language_def::operator== (const language_def& a) const
|
||||
{
|
||||
return ((language == a.language) /* && (localename == a.localename) */ );
|
||||
}
|
||||
|
@ -112,15 +117,30 @@ const t_string& symbol_table::operator[](const char* key) const
|
|||
return (*this)[std::string(key)];
|
||||
}
|
||||
|
||||
std::vector<language_def> get_languages()
|
||||
bool load_language_list()
|
||||
{
|
||||
std::vector<language_def> res;
|
||||
|
||||
for(int i = 0; known_languages[i].language[0] != '\0'; i++) {
|
||||
res.push_back(known_languages[i]);
|
||||
config cfg;
|
||||
try {
|
||||
scoped_istream stream = preprocess_file("data/language.cfg");
|
||||
read(cfg, *stream);
|
||||
} catch(config::error &e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return res;
|
||||
known_languages.clear();
|
||||
known_languages.push_back(language_def("", t_string(N_("System default language"), "wesnoth")));
|
||||
|
||||
config::const_child_itors langs = cfg.child_range("locale");
|
||||
for(;langs.first != langs.second; ++langs.first) {
|
||||
known_languages.push_back(language_def((**langs.first)["locale"], (**langs.first)["name"]));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<language_def> get_languages()
|
||||
{
|
||||
return known_languages;
|
||||
}
|
||||
|
||||
static void wesnoth_setlocale(int category, std::string const &slocale)
|
||||
|
@ -194,7 +214,6 @@ bool set_language(const language_def& locale)
|
|||
|
||||
current_language = locale;
|
||||
wesnoth_setlocale(LC_MESSAGES, locale.localename);
|
||||
known_languages[0].language = gettext("System default language");
|
||||
|
||||
// fill string_table (should be moved somwhere else some day)
|
||||
try {
|
||||
|
@ -216,6 +235,13 @@ bool set_language(const language_def& locale)
|
|||
}
|
||||
// end of string_table fill
|
||||
|
||||
// Reset translations for the name of current languages
|
||||
for (std::vector<language_def>::iterator itor = known_languages.begin();
|
||||
itor != known_languages.end(); ++itor) {
|
||||
|
||||
itor->language.reset_translation();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -224,13 +250,16 @@ const language_def& get_language() { return current_language; }
|
|||
const language_def& get_locale()
|
||||
{
|
||||
//TODO: Add in support for querying the locale on Windows
|
||||
|
||||
wassert(known_languages.size() != 0);
|
||||
|
||||
const std::string& prefs_locale = preferences::language();
|
||||
if(prefs_locale.empty() == false) {
|
||||
wesnoth_setlocale(LC_MESSAGES, prefs_locale);
|
||||
for(int i = 0; known_languages[i].language[0] != '\0'; i++) {
|
||||
if (prefs_locale == known_languages[i].localename)
|
||||
return known_languages[i];
|
||||
for(std::vector<language_def>::const_iterator i = known_languages.begin();
|
||||
i != known_languages.end(); ++i) {
|
||||
if (prefs_locale == i->localename)
|
||||
return *i;
|
||||
}
|
||||
std::cerr << "locale not found in known array; defaulting to system locale\n";
|
||||
return known_languages[0];
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#ifndef LANGUAGE_HPP_INCLUDED
|
||||
#define LANGUAGE_HPP_INCLUDED
|
||||
|
||||
#include "tstring.hpp"
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
@ -26,13 +28,13 @@ class config;
|
|||
struct language_def
|
||||
{
|
||||
language_def() {}
|
||||
language_def(const std::string& name, const std::string& lang) : localename(name), language(lang)
|
||||
language_def(const std::string& name, const t_string& lang) : localename(name), language(lang)
|
||||
{}
|
||||
std::string localename;
|
||||
std::string language;
|
||||
bool operator== (const language_def&);
|
||||
t_string language;
|
||||
bool operator== (const language_def&) const;
|
||||
};
|
||||
extern language_def known_languages[];
|
||||
|
||||
std::string languagedef_name (const language_def& def);
|
||||
bool languagedef_lessthan_p (const language_def& def1, const language_def& def2);
|
||||
|
||||
|
@ -66,4 +68,6 @@ const language_def& get_locale();
|
|||
/** Initializes the list of textdomains from a configuration object */
|
||||
void init_textdomains(const config& cfg);
|
||||
|
||||
bool load_language_list();
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue