00001 /* $Id: language.h 23585 2011-12-17 23:16:16Z rubidium $ */ 00002 00003 /* 00004 * This file is part of OpenTTD. 00005 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. 00006 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00007 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. 00008 */ 00009 00012 #ifndef LANGUAGE_H 00013 #define LANGUAGE_H 00014 00015 #include "core/smallvec_type.hpp" 00016 #ifdef WITH_ICU 00017 #include <unicode/coll.h> 00018 #endif /* WITH_ICU */ 00019 00020 static const uint8 CASE_GENDER_LEN = 16; 00021 static const uint8 MAX_NUM_GENDERS = 8; 00022 static const uint8 MAX_NUM_CASES = 16; 00023 00024 static const uint TAB_SIZE_OFFSET = 0; 00025 static const uint TAB_SIZE_BITS = 11; 00026 static const uint TAB_SIZE = 1 << TAB_SIZE_BITS; 00027 static const uint TAB_COUNT_OFFSET = TAB_SIZE_BITS; 00028 static const uint TAB_COUNT_BITS = 5; 00029 static const uint TAB_COUNT = 1 << TAB_COUNT_BITS; 00030 00032 struct LanguagePackHeader { 00033 static const uint32 IDENT = 0x474E414C; 00034 00035 uint32 ident; 00036 uint32 version; 00037 char name[32]; 00038 char own_name[32]; 00039 char isocode[16]; 00040 uint16 offsets[TAB_COUNT]; 00041 00043 char digit_group_separator[8]; 00045 char digit_group_separator_currency[8]; 00047 char digit_decimal_separator[8]; 00048 uint16 missing; 00049 byte plural_form; 00050 byte text_dir; 00051 00059 uint16 winlangid; 00060 uint8 newgrflangid; 00061 uint8 num_genders; 00062 uint8 num_cases; 00063 byte pad[3]; 00064 00065 char genders[MAX_NUM_GENDERS][CASE_GENDER_LEN]; 00066 char cases[MAX_NUM_CASES][CASE_GENDER_LEN]; 00067 00068 bool IsValid() const; 00069 00075 uint8 GetGenderIndex(const char *gender_str) const 00076 { 00077 for (uint8 i = 0; i < MAX_NUM_GENDERS; i++) { 00078 if (strcmp(gender_str, this->genders[i]) == 0) return i; 00079 } 00080 return MAX_NUM_GENDERS; 00081 } 00082 00088 uint8 GetCaseIndex(const char *case_str) const 00089 { 00090 for (uint8 i = 0; i < MAX_NUM_CASES; i++) { 00091 if (strcmp(case_str, this->cases[i]) == 0) return i; 00092 } 00093 return MAX_NUM_CASES; 00094 } 00095 }; 00097 assert_compile(sizeof(LanguagePackHeader) % 4 == 0); 00098 00100 struct LanguageMetadata : public LanguagePackHeader { 00101 char file[MAX_PATH]; 00102 }; 00103 00105 typedef SmallVector<LanguageMetadata, 4> LanguageList; 00106 00108 extern LanguageList _languages; 00109 00111 extern const LanguageMetadata *_current_language; 00112 00113 #ifdef WITH_ICU 00114 extern Collator *_current_collator; 00115 #endif /* WITH_ICU */ 00116 00117 bool ReadLanguagePack(const LanguageMetadata *lang); 00118 const LanguageMetadata *GetLanguage(byte newgrflangid); 00119 00120 #endif /* LANGUAGE_H */