Search…

Xử Lý Đa Ngôn Ngữ Trong Game Với Cocos2d-x

27/09/20202 min read
Hướng dẫn kỹ thuật xử lý đa ngôn ngữ trong game với cocos2d-x.

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ả.

ss_3

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ả

ss_4

Code

CLASSES.ZIP

RESOURCES.ZIP

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024