2 Türlü Çoklu Dil Sistemi

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 40

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba Arkadaşlar,

Yabancı forumda gördüğüm çoklu dil sistemini sizlerle paylaşmak istiyorum.

Not: Sistem'i yayımlıyan kişiye sordum sorunsuz çalıştığını bildirdi. O yüzden paylaşıyorum.



Kod:
#define LENGUAJE_SYSTEM_FIRE

Kod:
// Arat ACMD(do_ride); // Altına Ekle #ifdef LENGUAJE_SYSTEM_FIRE ACMD(do_idiomaenglish); ACMD(do_idiomaespanish); ACMD(do_idiomaportuges); ACMD(do_idiomarumano); #endif // Arat { "dragon_soul",                do_dragon_soul,                0,    POS_DEAD,    GM_PLAYER    }, // Altına Ekle #ifdef LENGUAJE_SYSTEM_FIRE     { "idioma_ingles",        do_idiomaenglish,                0,    POS_DEAD,    GM_PLAYER        },     { "idioma_espanol",        do_idiomaespanish,                0,    POS_DEAD,    GM_PLAYER        },     { "idioma_portuges",    do_idiomaportuges,                0,    POS_DEAD,    GM_PLAYER        },     { "idioma_rumano",        do_idiomarumano,                0,    POS_DEAD,    GM_PLAYER        }, #endif

Kod:
// Arat ACMD(do_ride)     // Altına Ekle     #ifdef LENGUAJE_SYSTEM_FIRE ACMD(do_idiomaenglish) {         char query[1024];         sprintf(query, "UPDATE account.account SET idioma = 'en' WHERE id = '%d'", ch->GetAID());         DBManager::instance().DirectQuery(query);         ch->ChatPacket(CHAT_TYPE_INFO, "your new lenguague is english");         ch->GetDesc()->DelayedDisconnect(5); } ACMD(do_idiomaespanish) {         char query[1024];         sprintf(query, "UPDATE account.account SET idioma = 'es' WHERE id = '%d'", ch->GetAID());         DBManager::instance().DirectQuery(query);         ch->ChatPacket(CHAT_TYPE_INFO, "Tu nuevo lenguaje es espanish.");         ch->GetDesc()->DelayedDisconnect(5);         }ACMD(do_idiomaportuges) {         char query[1024];         sprintf(query, "UPDATE account.account SET idioma = 'pt' WHERE id = '%d'", ch->GetAID());         DBManager::instance().DirectQuery(query);         ch->ChatPacket(CHAT_TYPE_INFO, "sua nova lingua e Portugal.");         ch->GetDesc()->DelayedDisconnect(5); } ACMD(do_idiomarumano) {         char query[1024];         sprintf(query, "UPDATE account.account SET idioma = 'ro' WHERE id = '%d'", ch->GetAID());         DBManager::instance().DirectQuery(query);         ch->ChatPacket(CHAT_TYPE_INFO, "noua limba in limba romana.");         ch->GetDesc()->DelayedDisconnect(5); } #endif

Kod:
#ifdef LENGUAJE_SYSTEM_FIRE     int pc_get_languaje(lua_State* L)     {         LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();         if(ch)         {             char szQuery[QUERY_MAX_LEN];             snprintf(szQuery,sizeof(szQuery),"SELECT idioma from account.account WHERE id = '%d'", ch->GetAID());             SQLMsg * pMsg = DBManager::instance().DirectQuery(szQuery);             MYSQL_ROW row;             for(int i = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++i)             {                 lua_pushstring(L,row[0]);             }         }         return 1;     } #endif #ifdef LENGUAJE_SYSTEM_FIRE             { "get_languaje",        pc_get_languaje    }, #endif

Kod:
import ui,dbg,app,net,os class Dialog1(ui.Window):     def __init__(self):         ui.Window.__init__(self)         self.BuildWindow()     def __del__(self):         ui.Window.__del__(self)     def BuildWindow(self):         self.Board = ui.BoardWithTitleBar()         self.Board.SetSize(202, 206)         self.Board.SetCenterPosition()         self.Board.AddFlag('movable')         self.Board.AddFlag('float')         self.Board.SetTitleName('Cambiar Idioma')         self.Board.SetCloseEvent(self.Close)         self.Board.Show()         self.comp = ui.Component()         self.img1 = self.comp.ExpandedImage(self.Board , 163, 54, 'firewall/lenguaje_venta/en.tga')         self.img2 = self.comp.ExpandedImage(self.Board , 163, 85, 'firewall/lenguaje_venta/es.tga')         self.img3 = self.comp.ExpandedImage(self.Board , 163, 116, 'firewall/lenguaje_venta/pt.tga')         self.img4 = self.comp.ExpandedImage(self.Board , 163, 148, 'firewall/lenguaje_venta/ro.tga')         self.base = self.comp.Button(self.Board, 'Ingles', '', 9, 49, self.base_func, 'firewall/lenguaje_venta/boton_base1.tga', 'firewall/lenguaje_venta/boton_base2.tga', 'firewall/lenguaje_venta/boton_base3.tga')         self.base1 = self.comp.Button(self.Board, 'Espanish', '', 9, 80, self.base1_func, 'firewall/lenguaje_venta/boton_base1.tga', 'firewall/lenguaje_venta/boton_base2.tga', 'firewall/lenguaje_venta/boton_base3.tga')         self.base2 = self.comp.Button(self.Board, 'Portuges', '', 9, 112, self.base2_func, 'firewall/lenguaje_venta/boton_base1.tga', 'firewall/lenguaje_venta/boton_base2.tga', 'firewall/lenguaje_venta/boton_base3.tga')         self.base3 = self.comp.Button(self.Board, 'Rumano', '', 9, 142, self.base3_func, 'firewall/lenguaje_venta/boton_base1.tga', 'firewall/lenguaje_venta/boton_base2.tga', 'firewall/lenguaje_venta/boton_base3.tga')         self.base.SetToolTipText('Convierte tu idioma en ingles')         self.base1.SetToolTipText('Convierte tu idioma en espanish')         self.base2.SetToolTipText('Convierte tu idioma en portuges')         self.base3.SetToolTipText('Convierte tu idioma en rumano')         def base_func(self):         os.remove('lang/idioma.txt')         file = open('lang/idioma.txt', 'a')         file.write("Espain") #Pones el idioma ejemplo español         file.close()         net.SendChatPacket("/idioma_ingles")         net.ExitApplication()         os.system('start Firewall.exe')         def base1_func(self):         os.remove('lang/idioma.txt')         file = open('lang/idioma.txt', 'a')         file.write("Espain")#Pones el idioma ejemplo ingles         file.close()         net.SendChatPacket("/idioma_espanol")         net.ExitApplication()         os.system('start Firewall.exe')         def base2_func(self):         os.remove('lang/idioma.txt')         file = open('lang/idioma.txt', 'a')         file.write("Espain")#Pones el idioma ejemplo ingles         file.close()         net.SendChatPacket("/idioma_portuges")         net.ExitApplication()         os.system('start Firewall.exe')         def base3_func(self):         os.remove('lang/idioma.txt')         file = open('lang/idioma.txt', 'a')         file.write("Espain")#Pones el idioma ejemplo ingles         file.close()         net.SendChatPacket("/idioma_rumano")         net.ExitApplication()         os.system('start Firewall.exe')             def Close(self):         self.Board.Hide() Dialog1().Show()

Kod:
# Arat ["locale","error"]     # Altına Ekle if os.path.exists("lang/idioma.txt"):     pass else:     file = open('lang/idioma.txt', 'a')     file.write("Espain")     file.close()   lines = open("lang/idioma.txt").readlines() firstLine = str(lines[0].replace("\n", ""))     if firstLine.split("=")[0] == "Italy":     LOCALE_FILE_NAME = "%s/locale_game.txt" % app.GetLocalePath()         elif firstLine.split("=")[0] == "Espain":     LOCALE_FILE_NAME = "lang\\es/locale_game.txt" elif firstLine.split("=")[0] == "Germany":     LOCALE_FILE_NAME = "lang\\gm/locale_game.txt" elif firstLine.split("=")[0] == "Poland":     LOCALE_FILE_NAME = "lang\\pl/locale_game.txt" elif firstLine.split("=")[0] == "Romany":     LOCALE_FILE_NAME = "lang\\rm/locale_game.txt"     elif firstLine.split("=")[0] == "Turkey":     LOCALE_FILE_NAME = "lang\\tk/locale_game.txt"     # Yazdığım anlatım yanlış olabilir gerçek anlatım şu şekilde, in localeinfo search and paste all = ["locale","error"]

Kod:
# Arat EMPIREDESC_C = "%s/empiredesc_c.txt" % (name) # Ekle import os     if os.path.exists("lang/idioma.txt"):         pass     else:         file = open('lang/idioma.txt', 'a')         file.write("Espain")         file.close()         lines = open("lang/idioma.txt").readlines()     firstLine = str(lines[0].replace("\n", ""))         if firstLine.split("=")[0] == "Italy":         LOCALE_INTERFACE_FILE_NAME = "%s/locale_interface.txt" % (name)             elif firstLine.split("=")[0] == "Espain":         LOCALE_INTERFACE_FILE_NAME = "lang\\es/locale_interface.txt"     elif firstLine.split("=")[0] == "Germany":         LOCALE_INTERFACE_FILE_NAME = "lang\\gm/locale_interface.txt"         elif firstLine.split("=")[0] == "Poland":         LOCALE_INTERFACE_FILE_NAME = "lang\\pl/locale_interface.txt"             elif firstLine.split("=")[0] == "Romany":         LOCALE_INTERFACE_FILE_NAME = "lang\\rm/locale_interface.txt"             elif firstLine.split("=")[0] == "Turkey":         LOCALE_INTERFACE_FILE_NAME = "lang\\tk/locale_interface.txt"             else:         LOCALE_INTERFACE_FILE_NAME = "%s/locale_interface.txt" % (name)

Kod:
in navicat  ro -- default lenguague the server ( Anlatım yukardaki şekilde tr sini anlıyamadım) ALTER TABLE account.account ADD idioma varchar(2) NOT NULL DEFAULT 'ro' ; (yapılacak da yukarıdaki gibi)

Kod:
quest multilenguaje begin     state start begin         when 20094.chat.gameforge.es.titulo with pc.get_languaje() ==  'es' begin             say(gameforge.es.say1)             say(gameforge.es.say2)         end                 when 20094.chat.gameforge.en.titulo with pc.get_languaje() ==  'en' begin             say(gameforge.en.say1)             say(gameforge.en.say2)         end         when 20094.chat.gameforge.pt.titulo with pc.get_languaje() ==  'pt' begin             say(gameforge.pt.say1)             say(gameforge.pt.say2)         end         when 20094.chat.gameforge.ro.titulo with pc.get_languaje() ==  'ro' begin             say(gameforge.ro.say1)             say(gameforge.ro.say2)         end     end end

Kod:
gameforge.es = {} gameforge.es.titulo = "hola prueba en español" gameforge.es.say1 = "funciona en español chao" gameforge.es.say2 = "chao me despido" gameforge.en = {} gameforge.en.titulo = "hola prueba en ingles" gameforge.en.say1 = "funciona en ingles chao" gameforge.en.say2 = "chao me despido" gameforge.pt = {} gameforge.pt.titulo = "hola prueba en portuges" gameforge.pt.say1 = "funciona en portuges chao" gameforge.pt.say2 = "chao me despido" gameforge.ro = {} gameforge.ro.titulo = "hola prueba en rumano" gameforge.ro.say1 = "funciona en rumano chao" gameforge.ro.say2 = "chao me despido"

Bunu' da indirin,

İNDİR:
VT:

İNDİR:
VT:


Metin2 Sunucularında 2 Türlü Çoklu Dil Sistemi

Metin2 özel sunucu geliştirme sürecinde, kullanıcı kitlesini genişletmek ve farklı ülkelerden oyuncuların daha rahat iletişim kurmasını sağlamak adına çoklu dil desteği büyük önem taşır.

Bu bağlamda, Metin2 projelerinde iki temel çoklu dil sistemi uygulaması mevcuttur: Client Tabanlı Dil Desteği ve Sunucu Tarafında Tanımlı Dil Sistemi. Her iki yöntem de farklı avantajlar sunar ve geliştiriciye göre tercih edilebilir.

1. Client Tabanlı Çoklu Dil Sistemi

Bu sistemde, dil dosyaları doğrudan istemci tarafında (client-side) tutulur. Oyuncu oynamak istediği dile göre kendi istemcisindeki dil ayarlarını değiştirir. Bu sistem genellikle uiscript ve py root klasörlerinde yer alan UI dosyaları üzerinden yönetilir.

Örneğin, bir Metin2 client dosyasında bulunan locale klasörü altında farklı dillere ait metinler barındırılır. Bu metinler genellikle .txt veya .py formatında olabilir. Oyuncu giriş yaparken seçtiği dil, client tarafından okunur ve arayüz buna göre yeniden yüklenir.

Avantajları:
- Daha hızlı yükleme süresi.
- Sunucu tarafında ekstra işlem yükü oluşturmaz.
- Kolayca özelleştirilebilir.

Dezavantajları:
- Her dil için ayrı client dosyası hazırlanması gerekebilir.
- Güncelleme sırasında tüm dillerin tekrar düzenlenmesi gerekir.

2. Sunucu Tabanlı Çoklu Dil Sistemi

Bu yöntemde, tüm dil çevirileri sunucu tarafında tanımlanır. Oyuncu oyun içi tercihler bölümünden dili seçer ve sunucu bu bilgiyi veritabanına kaydeder (db). Ardından, oynadığı dil ayarına göre sunucudan gelen mesajlar, item isimleri, sistem yazıları gibi içerikler dinamik olarak gönderilir.

Bu sistem genellikle C++ system üzerinde geliştirilen game server programming süreçlerinde kullanılır. Özellikle source edit işlemleri sırasında bu yapı daha esnek ve merkezi yönetim sağlar.

Avantajları:
- Tek client üzerinden birden fazla dili desteklemeye olanak tanır.
- Merkezi yönetim sayesinde kolay güncelleme yapılabilir.
- Sunucuya özel metinler tanımlanabilir.

Dezavantajları:
- Sunucuda daha fazla işlem gücü gerektirir.
- Veritabanı yapısı daha karmaşık hale gelebilir.

Uygulama Önerileri

Metin2 özel sunucularında çoklu dil desteği uygulamak isteyen geliştiriciler, öncelikle projenin büyüklüğüne ve hedef kitleye göre bir strateji belirlemelidir. Küçük çaplı sunucular için client tabanlı sistem yeterli olabilirken, global hedefli sunucularda sunucu tabanlı çözüm daha mantıklı olacaktır.

Ayrıca, martysama gibi popüler kaynaklardan alınan src dosyalarında halihazırda bazı dil desteği yapıları bulunabilir. Bu yapılar üzerine ek geliştirmeler yaparak özgün sistemler oluşturulabilir.

Sonuç

Metin2 özel sunucularında çoklu dil sistemi, hem kullanıcı deneyimini artırır hem de sunucunuzun rekabet gücünü yükseltir. Client ve sunucu tabanlı sistemlerin her birinin kendine özgü avantajları vardır. Geliştiricilerin ihtiyaçlarına göre doğru sistem seçilip entegre edilirse, kaliteli ve profesyonel bir oyun ortamı sağlanabilir.


Dual-Type Multilingual System in Metin2 Servers

In the process of developing private Metin2 servers, implementing multilingual support is crucial for expanding the user base and enabling players from different countries to communicate more easily.

Within this context, two main types of multilingual systems are used in Metin2 projects: Client-Based Language Support and Server-Side Defined Language System. Both methods offer distinct advantages and can be chosen according to the developer's preference.

1. Client-Based Multilingual System

In this system, language files are stored directly on the client side. Players can switch languages based on their preference within their own client application. This method is typically managed through UI files located in the uiscript and py root folders.

For instance, in a Metin2 client folder, the locale directory contains texts for different languages. These files are usually in .txt or .py formats. When the player logs in, the selected language is read by the client and the interface reloads accordingly.

Advantages:
- Faster loading times.
- No additional load on the server side.
- Easily customizable.

Disadvantages:
- May require separate client files for each language.
- All languages must be updated individually during updates.

2. Server-Based Multilingual System

In this approach, all language translations are defined on the server side. The player selects their preferred language from in-game settings, and the server saves this information into the database (db). Then, messages, item names, and system texts are sent dynamically based on the player's selected language setting.

This method is commonly used in game server programming processes developed with C++ system. Such structures allow for more flexible and centralized management, especially during source edit operations.

Advantages:
- Allows support for multiple languages via a single client file.
- Enables easy updates due to centralized management.
- Custom server-specific texts can be defined.

Disadvantages:
- Requires more processing power on the server side.
- Database structure can become more complex.

Implementation Recommendations

Developers aiming to implement multilingual support in private Metin2 servers should first define a strategy based on the project's scale and target audience. For smaller-scale servers, the client-based system may suffice, whereas server-based solutions are more suitable for globally targeted servers.

Additionally, popular sources like martysama often provide src files that already include some language support structures. Custom systems can be built upon these frameworks with further enhancements.

Conclusion

Implementing a multilingual system in private Metin2 servers enhances both the user experience and increases the competitiveness of your server. Each of the client-based and server-based systems has its own unique advantages. By choosing and integrating the right system according to the developers' needs, a high-quality and professional gaming environment can be achieved.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt