pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3333 - in trunk/pingus: . src src/tinygettext


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3333 - in trunk/pingus: . src src/tinygettext
Date: Sat, 27 Oct 2007 06:52:22 +0200

Author: grumbel
Date: 2007-10-27 06:52:21 +0200 (Sat, 27 Oct 2007)
New Revision: 3333

Modified:
   trunk/pingus/TODO
   trunk/pingus/src/pingus_main.cpp
   trunk/pingus/src/tinygettext/dictionary.cpp
   trunk/pingus/src/tinygettext/dictionary.hpp
   trunk/pingus/src/tinygettext/dictionary_manager.cpp
   trunk/pingus/src/tinygettext/dictionary_manager.hpp
   trunk/pingus/src/tinygettext/language_def.cpp
   trunk/pingus/src/tinygettext/language_def.hpp
Log:
- cleaned up language handling a bit, pt_BR now works

Modified: trunk/pingus/TODO
===================================================================
--- trunk/pingus/TODO   2007-10-27 03:55:17 UTC (rev 3332)
+++ trunk/pingus/TODO   2007-10-27 04:52:21 UTC (rev 3333)
@@ -99,18 +99,21 @@
 
 - Levels: All levels lack name and description
 - check all entrances are properly done
-halloween1-grumbel.pingus - gfx test only, not playable
-halloween2-grumbel.pingus - rescue by jump - finished - needs testing
-halloween3-grumbel.pingus - digg tunnel - finished - needs testing
-halloween4-grumbel.pingus - wall bomb - finished - needs testing
-halloween5-grumbel.pingus - join-jump - not playable
-halloween6-grumbel.pingus - jump high - finished - needs testing
-halloween7-grumbel.pingus - rescue - finished - needs testing - number of 
pingus wrong
+- check that number of pingus and number to save are adjusted
+- check that actions are limited
+- add name and descriptions
 
+halloween1-grumbel.pingus - circle save - finished - needs testing (easy)
+halloween2-grumbel.pingus - rescue by jump - finished - needs testing (easy)
+halloween3-grumbel.pingus - digg tunnel - finished - needs testing (medium)
+halloween4-grumbel.pingus - wall bomb - finished - needs testing (easy/medium)
+halloween5-grumbel.pingus - join-jump - finished - needs testing (hard++)
+halloween6-grumbel.pingus - jump high - finished - needs testing  (easy)
+halloween7-grumbel.pingus - rescue - finished - needs testing - number of 
pingus wrong (hard--)
+halloween8-plouj.pingus - bridge broken - (hard+)
+
 - jumper dies sometimes in data/levels/tutorial/snow11-grumbel.scm when 
hitting the ground
 
-- fix pt_BR.po support, currently pt.po is loaded instead
-
 - implement option menu
 
 - make auto-scroll disableable in fullscreen

Modified: trunk/pingus/src/pingus_main.cpp
===================================================================
--- trunk/pingus/src/pingus_main.cpp    2007-10-27 03:55:17 UTC (rev 3332)
+++ trunk/pingus/src/pingus_main.cpp    2007-10-27 04:52:21 UTC (rev 3333)
@@ -186,7 +186,7 @@
       std::cout << "========================" << std::endl;
       std::set<std::string> lst = dictionary_manager.get_languages();
       for (std::set<std::string>::iterator i = lst.begin(); i != lst.end(); 
++i)
-        std::cout << TinyGetText::get_language_def(*i).name << " (" << *i << 
")" << std::endl;
+        std::cout << TinyGetText::get_language_def(*i)->name << " (" << *i << 
")" << std::endl;
 
       std::cout << "\nLanguages can be used via:\n\n    pingus --language 
de\n" << std::endl; 
 
@@ -218,7 +218,7 @@
 
   // Misc
   if (options.language.is_set())
-    dictionary_manager.set_language(options.language.get());
+    dictionary_manager.set_current_dictionary(options.language.get());
 
   if (options.auto_scrolling.is_set())
     auto_scrolling = options.auto_scrolling.get();
@@ -627,7 +627,12 @@
   std::cout << std::endl;
 
   std::cout << "data path:               " << path_manager.get_base_path() << 
std::endl;
-  std::cout << "language:                " << 
dictionary_manager.get_dictionary().get_language().name << std::endl;
+  std::cout << "language:                " 
+            << dictionary_manager.get_dictionary().get_language()->name 
+            << " ("
+            << dictionary_manager.get_dictionary().get_language()->code 
+            << ")"
+            << std::endl;
 
   Fonts::encoding = 
StringUtil::to_lower(dictionary_manager.get_dictionary().get_charset());
   std::cout << "font encoding:           " << Fonts::encoding << std::endl;

Modified: trunk/pingus/src/tinygettext/dictionary.cpp
===================================================================
--- trunk/pingus/src/tinygettext/dictionary.cpp 2007-10-27 03:55:17 UTC (rev 
3332)
+++ trunk/pingus/src/tinygettext/dictionary.cpp 2007-10-27 04:52:21 UTC (rev 
3333)
@@ -21,13 +21,15 @@
 
 namespace TinyGetText {
 
-Dictionary::Dictionary(const LanguageDef& language_, const std::string& 
charset_)
-  : language(language_), charset(charset_)
+Dictionary::Dictionary(LanguageDef* language_, const std::string& charset_)
+  : language(language_), 
+    charset(charset_)
 {
 }
 
 Dictionary::Dictionary()
-  : language(lang_en), charset("ISO-8859-1")
+  : language(&lang_en), 
+    charset("ISO-8859-1")
 {
 }
 
@@ -44,7 +46,7 @@
 }
 
 void
-Dictionary::set_language(const LanguageDef& lang)
+Dictionary::set_language(LanguageDef* lang)
 {
   language = lang;
 }
@@ -57,7 +59,7 @@
 
   if (i != plural_entries.end() && !msgstrs.empty())
     {
-      int g = language.plural(num);
+      int g = language->plural(num);
       std::map<int, std::string>::iterator j = msgstrs.find(g);
       if (j != msgstrs.end())
         {

Modified: trunk/pingus/src/tinygettext/dictionary.hpp
===================================================================
--- trunk/pingus/src/tinygettext/dictionary.hpp 2007-10-27 03:55:17 UTC (rev 
3332)
+++ trunk/pingus/src/tinygettext/dictionary.hpp 2007-10-27 04:52:21 UTC (rev 
3333)
@@ -39,11 +39,11 @@
   typedef std::map<std::string, std::map<int, std::string> > PluralEntries;
   PluralEntries plural_entries;
 
-  LanguageDef language;
-  std::string charset;
+  LanguageDef* language;
+  std::string  charset;
 public:
   /** */
-  Dictionary(const LanguageDef& language_, const std::string& charset = "");
+  Dictionary(LanguageDef* language_, const std::string& charset = "");
 
   Dictionary();
 
@@ -55,9 +55,9 @@
 
   /** Set the language that is used for this dictionary, this is
       mainly needed to evaluate plural forms */
-  void set_language(const LanguageDef& lang);
+  void set_language(LanguageDef* lang);
 
-  LanguageDef get_language() const { return language; }
+  LanguageDef* get_language() const { return language; }
 
   /** Translate the string \a msgid to its correct plural form, based
       on the number of items given by \a num. \a msgid2 is \a msgid in

Modified: trunk/pingus/src/tinygettext/dictionary_manager.cpp
===================================================================
--- trunk/pingus/src/tinygettext/dictionary_manager.cpp 2007-10-27 03:55:17 UTC 
(rev 3332)
+++ trunk/pingus/src/tinygettext/dictionary_manager.cpp 2007-10-27 04:52:21 UTC 
(rev 3333)
@@ -41,19 +41,23 @@
 }
 
 DictionaryManager::DictionaryManager()
-  : empty_dict(lang_en, "ISO-8859-1"),
-    current_dict(&empty_dict)
+  : empty_dict(&lang_en, "ISO-8859-1"),
+    current_dict(&empty_dict),
+    language(&lang_en)
 {
+#ifndef WIN32
   parseLocaleAliases();
+#endif
+
   // setup language from environment vars
   const char* lang = getenv("LC_ALL");
-  if(!lang)
+  if (!lang)
     lang = getenv("LC_MESSAGES");
-  if(!lang)
+  if (!lang)
     lang = getenv("LANG");
   
-  if(lang)
-    set_language(lang);
+  if (lang)
+    set_current_dictionary(lang);
 }
 
 void
@@ -80,23 +84,23 @@
     }
     while(isspace(c) && !in.eof())
       in.get(c);
-    std::string language;
+    std::string lang;
     while(!isspace(c) && !in.eof()) {
-      language += c;
+      lang += c;
       in.get(c);
     }
 
     if(in.eof())
       break;
-    set_language_alias(alias, language);
+    
+    set_language_alias(alias, lang);
   }
 }
   
 Dictionary&
-DictionaryManager::get_dictionary(const std::string& spec)
+DictionaryManager::get_dictionary(LanguageDef* lang)
 {
-  std::string lang = get_language_from_spec(spec);
-  Dictionaries::iterator i = dictionaries.find(get_language_from_spec(lang));
+  Dictionaries::iterator i = dictionaries.find(lang);
   if (i != dictionaries.end())
     {
       return i->second;
@@ -105,9 +109,9 @@
     {
       Dictionary& dict = dictionaries[lang];
 
-      dict.set_language(get_language_def(lang));
+      dict.set_language(lang);
 
-      for (SearchPath::iterator p = search_path.begin(); p != 
search_path.end(); ++p)
+      for(SearchPath::iterator p = search_path.begin(); p != 
search_path.end(); ++p)
         {
           DIR* dir = opendir(p->c_str());
           if (!dir)
@@ -119,7 +123,7 @@
               struct dirent* ent;
               while((ent = readdir(dir)))
                 {
-                  if (std::string(ent->d_name) == lang + ".po")
+                  if (std::string(ent->d_name) == std::string(lang->code) + 
".po")
                     {
                       std::string pofile = *p + "/" + ent->d_name;
                       std::ifstream in(pofile.c_str());
@@ -171,10 +175,20 @@
 }
 
 void
-DictionaryManager::set_language(const std::string& lang)
+DictionaryManager::set_current_dictionary(const std::string& lang)
 {
-  language = get_language_from_spec(lang);
-  current_dict = & (get_dictionary(language));
+  LanguageDef* new_lang = get_canonical_language(lang);
+  if (!new_lang)
+    {
+      std::cout << "Error: DictionaryManager: Couldn't find LanguageDef for '" 
<< lang
+                << "', leaving current dictionary unchanged" << std::endl;
+    }
+  else
+    {
+      language = new_lang;
+      // std::cout << "Language: supplied: '" << lang << "' -> canonical: '" 
<< language->code << "'" << std::endl;
+      current_dict = &(get_dictionary(language));
+    }
 }
 
 void
@@ -184,20 +198,29 @@
   language_aliases.insert(std::make_pair(alias, language));
 }
 
-std::string
-DictionaryManager::get_language_from_spec(const std::string& spec)
+LanguageDef*
+DictionaryManager::get_canonical_language(const std::string& spec)
 {
-  std::string lang = spec;
-  Aliases::iterator i = language_aliases.find(lang);
-  if(i != language_aliases.end()) {
-    lang = i->second;
-  }
-  
-  std::string::size_type s = lang.find_first_of("_.");
-  if(s == std::string::npos)
-    return lang;
+  std::string lang_code = spec;
 
-  return std::string(lang, 0, s);  
+  // Check for language aliases
+  Aliases::iterator i = language_aliases.find(spec);
+  if(i != language_aliases.end()) 
+    lang_code = i->second;
+
+  // Cut away any specification of the codeset (i.e. de_DE.ISO-8859-1)
+  std::string::size_type s = lang_code.find_first_of(".");
+
+  if (s != std::string::npos)
+    lang_code = std::string(spec, 0, s);
+
+  LanguageDef* lang_def = get_language_def(lang_code);
+  if (lang_def)
+    return lang_def;
+  else if (lang_code.length() == 5) // 'en_EN' failed, try 'en'
+    return get_language_def(lang_code.substr(0, 2));
+  else 
+    return 0;
 }
 
 void
@@ -205,7 +228,7 @@
 {
   dictionaries.clear(); // adding directories invalidates cache
   search_path.push_back(pathname);
-  set_language(language);
+  current_dict = &(get_dictionary(language));
 }
 
 } // namespace TinyGetText

Modified: trunk/pingus/src/tinygettext/dictionary_manager.hpp
===================================================================
--- trunk/pingus/src/tinygettext/dictionary_manager.hpp 2007-10-27 03:55:17 UTC 
(rev 3332)
+++ trunk/pingus/src/tinygettext/dictionary_manager.hpp 2007-10-27 04:52:21 UTC 
(rev 3333)
@@ -34,14 +34,15 @@
 private:
   Dictionary empty_dict;
   
-  typedef std::map<std::string, Dictionary> Dictionaries;
+  typedef std::map<LanguageDef*, Dictionary> Dictionaries;
   Dictionaries dictionaries;
   typedef std::vector<std::string> SearchPath;
   SearchPath search_path;
   typedef std::map<std::string, std::string> Aliases;
   Aliases language_aliases;
-  std::string language;
-  Dictionary* current_dict;
+  // The two (de) or five letter (de_DE) language code
+  LanguageDef* language;
+  Dictionary*  current_dict;
   
 public:
   DictionaryManager();
@@ -51,11 +52,11 @@
   Dictionary& get_dictionary()
   { return *current_dict; }
 
-  /** Get dictionary for lang */
-  Dictionary& get_dictionary(const std::string& langspec);
+  /** Get dictionary for the given lang_code */
+  Dictionary& get_dictionary(LanguageDef* lang);
 
   /** Set a language based on a four? letter country code */
-  void set_language(const std::string& langspec);
+  void set_current_dictionary(const std::string& langspec);
 
   /** Define an alias for a language */
   void set_language_alias(const std::string& alias, const std::string& lang);
@@ -68,8 +69,9 @@
 
 private:
   void parseLocaleAliases();
-  /// returns the language part in a language spec (like de_DE.UTF-8 -> de)
-  std::string get_language_from_spec(const std::string& spec);
+
+  // de_DE.ISO-8859-1 -> de_DE, german -> de_DE, etc.
+  LanguageDef* get_canonical_language(const std::string& language);
 };
 
 } // namespace TinyGetText

Modified: trunk/pingus/src/tinygettext/language_def.cpp
===================================================================
--- trunk/pingus/src/tinygettext/language_def.cpp       2007-10-27 03:55:17 UTC 
(rev 3332)
+++ trunk/pingus/src/tinygettext/language_def.cpp       2007-10-27 04:52:21 UTC 
(rev 3333)
@@ -69,43 +69,43 @@
 LanguageDef lang_sl("sl", "Slovenian",         3, plural3_sl); // "nplurals=4; 
plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
 //*}
 
-LanguageDef&
+LanguageDef*
 get_language_def(const std::string& name)
 {
-  if (name == "hu") return lang_hu;
-  else if (name == "ja") return lang_ja;
-  else if (name == "ko") return lang_ko;
-  else if (name == "tr") return lang_tr;
-  else if (name == "da") return lang_da;
-  else if (name == "nl") return lang_nl;
-  else if (name == "en") return lang_en;
-  else if (name == "fo") return lang_fo;
-  else if (name == "de") return lang_de;
-  else if (name == "nb") return lang_nb;
-  else if (name == "no") return lang_no;
-  else if (name == "nn") return lang_nn;
-  else if (name == "sv") return lang_sv;
-  else if (name == "et") return lang_et;
-  else if (name == "fi") return lang_fi;
-  else if (name == "el") return lang_el;
-  else if (name == "he") return lang_he;
-  else if (name == "it") return lang_it;
-  else if (name == "pt") return lang_pt;
-  else if (name == "es") return lang_es;
-  else if (name == "eo") return lang_eo;
-  else if (name == "fr") return lang_fr;
-  else if (name == "pt_BR") return lang_pt_BR;
-  else if (name == "lv") return lang_lv;
-  else if (name == "ga") return lang_ga;
-  else if (name == "lt") return lang_lt;
-  else if (name == "hr") return lang_hr;
-  else if (name == "cs") return lang_cs;
-  else if (name == "ru") return lang_ru;
-  else if (name == "uk") return lang_uk;
-  else if (name == "sk") return lang_sk;
-  else if (name == "pl") return lang_pl;
-  else if (name == "sl") return lang_sl;
-  else return lang_en; 
+  if (name == "hu") return &lang_hu;
+  else if (name == "ja") return &lang_ja;
+  else if (name == "ko") return &lang_ko;
+  else if (name == "tr") return &lang_tr;
+  else if (name == "da") return &lang_da;
+  else if (name == "nl") return &lang_nl;
+  else if (name == "en") return &lang_en;
+  else if (name == "fo") return &lang_fo;
+  else if (name == "de") return &lang_de;
+  else if (name == "nb") return &lang_nb;
+  else if (name == "no") return &lang_no;
+  else if (name == "nn") return &lang_nn;
+  else if (name == "sv") return &lang_sv;
+  else if (name == "et") return &lang_et;
+  else if (name == "fi") return &lang_fi;
+  else if (name == "el") return &lang_el;
+  else if (name == "he") return &lang_he;
+  else if (name == "it") return &lang_it;
+  else if (name == "pt") return &lang_pt;
+  else if (name == "es") return &lang_es;
+  else if (name == "eo") return &lang_eo;
+  else if (name == "fr") return &lang_fr;
+  else if (name == "pt_BR") return &lang_pt_BR;
+  else if (name == "lv") return &lang_lv;
+  else if (name == "ga") return &lang_ga;
+  else if (name == "lt") return &lang_lt;
+  else if (name == "hr") return &lang_hr;
+  else if (name == "cs") return &lang_cs;
+  else if (name == "ru") return &lang_ru;
+  else if (name == "uk") return &lang_uk;
+  else if (name == "sk") return &lang_sk;
+  else if (name == "pl") return &lang_pl;
+  else if (name == "sl") return &lang_sl;
+  else return 0;
 }
 
 } // namespace TinyGetText 

Modified: trunk/pingus/src/tinygettext/language_def.hpp
===================================================================
--- trunk/pingus/src/tinygettext/language_def.hpp       2007-10-27 03:55:17 UTC 
(rev 3332)
+++ trunk/pingus/src/tinygettext/language_def.hpp       2007-10-27 04:52:21 UTC 
(rev 3333)
@@ -39,7 +39,7 @@
 
 /** Read the content of the .po file given as \a in into the
     dictionary given as \a dict */
-LanguageDef& get_language_def(const std::string& name);
+LanguageDef* get_language_def(const std::string& name);
 
 extern LanguageDef lang_hu;
 extern LanguageDef lang_ja;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]