/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_LOCALIZATION_H #define GAME_LOCALIZATION_H #include // GNUC_ATTRIBUTE #include #include #include class CLanguage { public: CLanguage() = default; CLanguage(const char *pName, const char *pFileName, int Code) : m_Name(pName), m_FileName(pFileName), m_CountryCode(Code) {} std::string m_Name; std::string m_FileName; int m_CountryCode; bool operator<(const CLanguage &Other) const { return m_Name < Other.m_Name; } }; class CLocalizationDatabase { class CString { public: unsigned m_Hash; unsigned m_ContextHash; const char *m_pReplacement; CString() {} CString(unsigned Hash, unsigned ContextHash, const char *pReplacement) : m_Hash(Hash), m_ContextHash(ContextHash), m_pReplacement(pReplacement) { } bool operator<(const CString &Other) const { return m_Hash < Other.m_Hash || (m_Hash == Other.m_Hash && m_ContextHash < Other.m_ContextHash); } bool operator<=(const CString &Other) const { return m_Hash < Other.m_Hash || (m_Hash == Other.m_Hash && m_ContextHash <= Other.m_ContextHash); } bool operator==(const CString &Other) const { return m_Hash == Other.m_Hash && m_ContextHash == Other.m_ContextHash; } }; std::vector m_vLanguages; std::vector m_vStrings; CHeap m_StringsHeap; int m_VersionCounter; int m_CurrentVersion; public: CLocalizationDatabase(); void LoadIndexfile(class IStorage *pStorage, class IConsole *pConsole); const std::vector &Languages() const { return m_vLanguages; } bool Load(const char *pFilename, class IStorage *pStorage, class IConsole *pConsole); int Version() const { return m_CurrentVersion; } void AddString(const char *pOrgStr, const char *pNewStr, const char *pContext); const char *FindString(unsigned Hash, unsigned ContextHash) const; }; extern CLocalizationDatabase g_Localization; class CLocConstString { const char *m_pDefaultStr; const char *m_pCurrentStr; unsigned m_Hash; unsigned m_ContextHash; int m_Version; public: CLocConstString(const char *pStr, const char *pContext = ""); void Reload(); inline operator const char *() { if(m_Version != g_Localization.Version()) Reload(); return m_pCurrentStr; } }; extern const char *Localize(const char *pStr, const char *pContext = "") GNUC_ATTRIBUTE((format_arg(1))); #endif