Hầu hết các game hiện nay trên thế giới đều chọn tiếng Anh làm ngôn ngữ chính bởi tính phổ biến của nó. Tuy nhiên, điều gì sẽ xảy ra nếu đối tượng chơi game không biết gì về loại ngôn ngữ trên? Chắc chắn là điều đó sẽ không vui vẻ gì dù cho game có hay hơn đi chăng nữa? Để giải quyết được vấn đề và tăng tính thân thiện, gần gũi hơn cho game với người chơi, các lập trình viên thường phát triển game theo hướng đa ngôn ngữ.
Hiện thực
Hiện thực lớp LanguageManager
class LanguageManager { public: static LanguageManager* getInstance(); string getStringForKey(string key) const; private: static LanguageManager* _instance; LanguageManager(); virtual ~LanguageManager(); Document _document; string _fileName; };
Bên trên là lớp LanguageManager
được hiện thực với kỹ thuật Singleton.
Hàm khởi tạo
LanguageManager::LanguageManager() { auto def = UserDefault::sharedUserDefault(); auto languageCurrent = def-> getStringForKey("LANGUAGE", "en"); if (languageCurrent == "en") _fileName = "en.json"; // english language else if (languageCurrent == "vi") _fileName = "vi.json"; // vietnamese language else _fileName = "en.json"; // default languge ssize_t size; const char* buf = (const char*)FileUtils::getInstance()->getFileData(_fileName.c_str(), "r", &size); string content(buf); string clearContent = content.substr(0, content.rfind('}') + 1); _document.Parse<0>(clearContent.c_str()); }
Hàm khởi tạo của lớp LanguageManager hỗ trợ lựa chọn file json chứa loại ngôn ngữ tương ứng để đọc dữ liệu lên _document
.
Phương thức getStringForKey
Phương thức này giúp lấy được đoạn string
cần hiển thị lên game từ các giá trị bên trong biến _document
và key
truyền vào.
string LanguageManager::getStringForKey(string key) const { return _document[key.c_str()].GetString(); }
Cách dùng
Giả sử có 2 file json tương ứng với 2 ngôn ngữ Anh và Việt như sau:
File en.json
{ "STR_ASKFORSOUND":"DO YOU WANT TO PLAY SOUND?", "STR_GAMENAME":"SINS", "STR_VERSION":"V1.1.0" }
File vi.json
{ "STR_ASKFORSOUND":"BẠN MUỐN BẬT ÂM THANH?", "STR_GAMENAME":"SINS", "STR_VERSION":"V1.1.0" }
Vào source code của game và thử tạo 1 label với nội dung tương ứng với key là "STR_ASKFORSOUND
":
auto label = LabelTTF::create(LanguageManager::getInstance()->getStringForKey("STR_ASKFORSOUND").c_str(), "fonts/arial.ttf", 24);
Kết quả.
Thử thay đổi ngôn ngữ hiển thị là Việt:
auto def = UserDefault::sharedUserDefault(); def->setStringForKey("LANGUAGE", "vi"); auto label = LabelTTF::create(LanguageManager::getInstance()->getStringForKey("STR_ASKFORSOUND").c_str(), "fonts/arial.ttf", 24);
Kết quả