Made the list of languages WML-configurable.

This commit is contained in:
Philippe Plantier 2005-09-21 22:22:20 +00:00
parent cf47ae69b2
commit 3fbe2a5863
7 changed files with 219 additions and 67 deletions

View file

@ -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
View 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]

View file

@ -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();

View file

@ -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";
}

View file

@ -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);
}

View file

@ -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];

View file

@ -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