+// helper functions of GetSystemLanguage()
+#ifdef __UNIX__
+
+// get just the language part
+static inline wxString ExtractLang(const wxString& langFull)
+{
+ return langFull.Left(LEN_LANG);
+}
+
+// get everything else (including the leading '_')
+static inline wxString ExtractNotLang(const wxString& langFull)
+{
+ return langFull.Mid(LEN_LANG);
+}
+
+#endif // __UNIX__
+
+
+// ----------------------------------------------------------------------------
+// wxMsgCatalogFile corresponds to one disk-file message catalog.
+//
+// This is a "low-level" class and is used only by wxMsgCatalog
+// ----------------------------------------------------------------------------
+
+WX_DECLARE_EXPORTED_STRING_HASH_MAP(wxString, wxMessagesHash);
+
+class wxMsgCatalogFile
+{
+public:
+ // ctor & dtor
+ wxMsgCatalogFile();
+ ~wxMsgCatalogFile();
+
+ // load the catalog from disk (szDirPrefix corresponds to language)
+ bool Load(const wxChar *szDirPrefix, const wxChar *szName);
+
+ // fills the hash with string-translation pairs
+ void FillHash(wxMessagesHash& hash, bool convertEncoding) const;
+
+private:
+ // this implementation is binary compatible with GNU gettext() version 0.10
+
+ // an entry in the string table
+ struct wxMsgTableEntry
+ {
+ size_t32 nLen; // length of the string
+ size_t32 ofsString; // pointer to the string
+ };
+
+ // header of a .mo file
+ struct wxMsgCatalogHeader
+ {
+ size_t32 magic, // offset +00: magic id
+ revision, // +04: revision
+ numStrings; // +08: number of strings in the file
+ size_t32 ofsOrigTable, // +0C: start of original string table
+ ofsTransTable; // +10: start of translated string table
+ size_t32 nHashSize, // +14: hash table size
+ ofsHashTable; // +18: offset of hash table start
+ };
+
+ // all data is stored here, NULL if no data loaded
+ size_t8 *m_pData;
+
+ // data description
+ size_t32 m_numStrings; // number of strings in this domain
+ wxMsgTableEntry *m_pOrigTable, // pointer to original strings
+ *m_pTransTable; // translated
+
+ const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const
+ { return (const char *)(m_pData + Swap(pTable[index].ofsString)); }
+
+ wxString GetCharset() const;
+
+ // utility functions
+ // big<->little endian
+ inline size_t32 Swap(size_t32 ui) const;
+
+ bool m_bSwapped; // wrong endianness?
+
+ DECLARE_NO_COPY_CLASS(wxMsgCatalogFile)
+};
+
+