Выбор языка в самом клиенте игры

Maxwell

Auribus teneo lupum
Проверенный
Победитель в номинации 2022
Победитель в номинации 2021
Неукротимое пламя
Знаток письма
Hardware эксперт
За заслуги перед форумом
Победитель в номинации 2020
Любитель реакций
Победитель в номинации 2019
Сообщения
768
Розыгрыши
0
Репутация
803
Реакции
497
Баллы
773
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
Оверушенция подобная
Доброго времени суток.
Вопрос такого рода, есть ли в Джава серверах, функция выбора языка на предпочтение клиенту
То есть: Зашёл человек, его устраивает английский. он играет так.
Если зайду например я - но хочу что бы было всё на русском, и выбираю русский.
Соответственно сервер 1-му игроку показывает всё на англ, в том числе и диалоги а мне на русском.

Подскажите пожалуйста где это можно реализовать, если конечно это возможно.

Пы.Сы. - Хроники ХыФы-пиять.
 
Такое надо делать самому все

Я вот сейчас занимаюсь над JTS исходами много чего надо переписать в исход.. плюс html

Еще клиент файлы тоже
 
Такое надо делать самому все
Во первых хватит херачить по 2-3 слова в сообщении, пишите нормально и ёмко, во вторых я не просил мне сделать, а спросил возможно ли, и где рыть именно.
 
Написал как хотел , а после таких ответов даже нету желания вам помочь.
 
Доброго времени суток.
Вопрос такого рода, есть ли в Джава серверах, функция выбора языка на предпочтение клиенту
То есть: Зашёл человек, его устраивает английский. он играет так.
Если зайду например я - но хочу что бы было всё на русском, и выбираю русский.
Соответственно сервер 1-му игроку показывает всё на англ, в том числе и диалоги а мне на русском.

Подскажите пожалуйста где это можно реализовать, если конечно это возможно.

Пы.Сы. - Хроники ХыФы-пиять.
вроде бы на овероподобных такое реализовано, или я чего-то не понимаю
 
Нужно делать мультиязычный патч, но так же нужно будет иметь серверную чатсть ru en.
 
Нужно делать мультиязычный патч, но так же нужно будет иметь серверную чатсть ru en.
Патч есть, разделение по HTML есть. Чего ещё надо сделать?
Написал как хотел , а после таких ответов даже нету желания вам помочь.
Как хотел - будешь дома. А тут как минимум это раздражает, а во вторых правилами запрещено.
При желании помочь - не пишут кто чем занимается и на каких вы исходах, а отвечают по существу вопроса.
 
  • Мне нравится
Реакции: kick
Ну могу пожелать вам только удачи
 
По сути больше не чего, я просто тогда не пойму в чём затруднения тогда?
В том что - при выборе англ например с русского, он остаётся русским))) Диалог с НПЦ)
 
Maxwell, может хтмл не переведено?
 
Если я правильно понял ТС хочет что бы при входе в игру с ру клиента, сервер сайд автоматом понимал, что это ру клиент и на стороне сервера ставил ему ру штмл\месаги автоматом, и наоборот, с ен клиента ен штмл\мессаги.

в AuthLogin вроде как последние 4 байта отвечают за ид языка клиента с которого входят в игру.
 
Maxwell, может хтмл не переведено?
Да, по отдельности в конфиге если выставить ланги - то работают
Если я правильно понял ТС хочет что бы при входе в игру с ру клиента, сервер сайд автоматом понимал, что это ру клиент и на стороне сервера ставил ему ру штмл\месаги автоматом, и наоборот, с ен клиента ен штмл\мессаги.

в AuthLogin вроде как последние 4 байта отвечают за ид языка клиента с которого входят в игру.
Да, вот, именно это! Пасибочки, щас глянем
 
На лостах это реализовано. С мультиланг патчем работает. Делал себе как-то.
Код:
package org.mmocore.gameserver.network.l2.c2s;

import org.mmocore.gameserver.Shutdown;
import org.mmocore.gameserver.network.authcomm.AuthServerCommunication;
import org.mmocore.gameserver.network.authcomm.SessionKey;
import org.mmocore.gameserver.network.authcomm.gs2as.PlayerAuthRequest;
import org.mmocore.gameserver.network.l2.GameClient;
import org.mmocore.gameserver.network.l2.s2c.LoginFail;
import org.mmocore.gameserver.network.l2.s2c.ServerClose;
import org.mmocore.gameserver.utils.Language;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* cSddddd
* cSdddddQ
* loginName + keys must match what the loginserver used.
*/
public class AuthLogin extends L2GameClientPacket
{
    private static final Logger _log = LoggerFactory.getLogger(AuthLogin.class);

    private String _loginName;
    private int _playKey1;
    private int _playKey2;
    private int _loginKey1;
    private int _loginKey2;
    private Language _language;

    @Override
    protected void readImpl()
    {
        _loginName = readS(32).toLowerCase();
        _playKey2 = readD();
        _playKey1 = readD();
        _loginKey1 = readD();
        _loginKey2 = readD();
        _language = Language.valueOf(readD());
    }

    @Override
    protected void runImpl()
    {
        GameClient client = getClient();
        client.setLanguage(_language);
        if(_language == null)
        {
            _log.error("Trying to auth with unknown lang. " + client.toString());
            client.close(new LoginFail(LoginFail.SYSTEM_ERROR_LOGIN_LATER));
            return;
        }

        if(Shutdown.getInstance().getMode() != Shutdown.NONE && Shutdown.getInstance().getSeconds() <= 30)
        {
            client.closeNow(false);
            return;
        }

        if(AuthServerCommunication.getInstance().isShutdown())
        {
            client.close(new LoginFail(LoginFail.SYSTEM_ERROR_LOGIN_LATER));
            return;
        }

        SessionKey key = new SessionKey(_loginKey1, _loginKey2, _playKey1, _playKey2);
        client.setSessionId(key);
        client.setLoginName(_loginName);

        GameClient oldClient = AuthServerCommunication.getInstance().addWaitingClient(client);
        if(oldClient != null)
            oldClient.close(ServerClose.STATIC);

        AuthServerCommunication.getInstance().sendPacket(new PlayerAuthRequest(client));
    }
}

Код:
package org.mmocore.gameserver.data;

import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import org.mmocore.commons.data.xml.AbstractHolder;
import org.mmocore.gameserver.Config;
import org.mmocore.gameserver.model.Player;
import org.mmocore.gameserver.utils.Language;

/**
* Author: VISTALL
* Date:  19:27/29.12.2010
*/
public final class StringHolder extends AbstractHolder
{
    private static final StringHolder _instance = new StringHolder();
    private Map<Language, Map<String, String>> _strings = new HashMap<Language, Map<String, String>>();

    public static StringHolder getInstance()
    {
        return _instance;
    }

    private StringHolder()
    {

    }

    public String getString(String name, Player player)
    {
        Language lang = player == null ? Language.ENGLISH : player.getLanguage();
        return getString(name, lang);
    }
   
    public String getString(Player player, String name)
    {
        Language lang = player == null ? Language.ENGLISH : player.getLanguage();
        return getString(name, lang);
    }

    public String getString(String address, Language lang)
    {
        Map<String, String> strings = _strings.get(lang);
        return strings.get(address);
    }

    public void load()
    {
        for(Language lang : Language.VALUES)
        {
            _strings.put(lang, new HashMap<String, String>());

            File f = new File(Config.DATAPACK_ROOT, "data/string/strings_" + lang.getShortName() + ".properties");
            if(!f.exists())
            {
                warn("Not find file: " + f.getAbsolutePath());
                continue;
            }

            LineNumberReader reader = null;
            try
            {
                reader = new LineNumberReader(new FileReader(f));
                String line = null;

                while((line = reader.readLine()) != null)
                {
                    if(line.startsWith("#"))
                        continue;

                    StringTokenizer token = new StringTokenizer(line, "=");
                    if(token.countTokens() < 2)
                    {
                        error("Error on line: " + line + "; file: " + f.getName());
                        continue;
                    }

                    String name = token.nextToken();
                    String value = token.nextToken();
                    while(token.hasMoreTokens())
                        value += "=" + token.nextToken();

                    Map<String, String> strings = _strings.get(lang);

                    strings.put(name, value);
                }
            }
            catch(Exception e)
            {
                error("Exception: " + e, e);
            }
            finally
            {
                try{reader.close();}catch(Exception e){}
            }
        }

        log();
    }

    public void reload()
    {
        clear();
        load();
    }

    @Override
    public void log()
    {
        for(Map.Entry<Language, Map<String, String>> entry : _strings.entrySet())
            info("load strings: " + entry.getValue().size() + " for lang: " + entry.getKey());
    }

    @Override
    public int size()
    {
        return 0;
    }

    @Override
    public void clear()
    {
        _strings.clear();
    }
}
Код:
package org.mmocore.gameserver.utils;

/**
 * @author VISTALL
 * @date 13:50/29.03.2011
 */
public enum Language
{
    //вот эта херня отвечает за языки патча
    ENGLISH(1, "en"),
    RUSSIAN(8, "ru");

    public static final Language[] VALUES = Language.values();

    private int _clientIndex;
    private String _shortName;

    Language(int clientIndex, String shortName)
    {
        _clientIndex = clientIndex;
        _shortName = shortName;
    }

    public String getShortName()
    {
        return _shortName;
    }

    public static Language valueOf(int index)
    {
        for(Language l : VALUES)
            if(l._clientIndex == index)
                return l;
        return null;
    }

    public static Language findByShortName(String shortName)
    {
        for(Language l : VALUES)
            if(l.getShortName().equals(shortName))
                return l;
        return null;
    }
}
 
Последнее редактирование:
Реализацию на стороне сервера можешь вытащить с тех же лостов, реализация на стороне клиента(мультипатч) есть мауал на зг, что б во время переключения в клиенте сразу меняло на сервере достаточно будет заплатить денег тем кто работает с интерфейсом, человк сделает при переключении языка клиент будет слать байпасс на сервер.
 
мы на птсах такое через байпасы делали

определяем язык клиента и просто отправляем байпас с нужным

делается в интерфейсе, за 5 строчек кода
 
Внесу и я свою лепту, включаем в интерфейсе стандартное переключение: Идем в OptionWnd в файле interface.u
Ну и находим Onload ну и потом чутка в localization.ini
Код:
function OnLoad()
{
    local int i;
    local int nMultiSample;
    local bool bEnableEngSelection;
    local ELanguageType Language;
    local string strResolution;
    
    dScript = DialogBox(GetScript("DialogBox"));

    bPartyMember = false;
    bPartyMaster = false;
//    bPartyRoomMaster = false;
//    Lootingtype = 0;
    if(CREATE_ON_DEMAND==0)
        OnRegisterEvent();

    if(CREATE_ON_DEMAND==0)
        InitHandle();
    else
        InitHandleCOD();
    
    m_bAirState = false;

    // 2006/03/26 - added register state by NeverDie. multi-registering states can only be placed in uc...
    RegisterState( "OptionWnd", "GamingState" );
    RegisterState( "OptionWnd", "LoginState" );

    // Shader version
    GetShaderVersion( nPixelShaderVersion, nVertexShaderVersion );

    GetResolutionList( ResolutionList );
    
    SetOptionBool( "Game", "HideDropItem", false );
    
    for( i = 0; i < ResolutionList.Length; ++i )
    {
        strResolution = "" $ ResolutionList[ i ].nWidth $ "*" $ ResolutionList[ i ].nHeight $ " " $ ResolutionList[ i ].nColorBit $ "bit";
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.ResBox", strResolution );
    }

    ResetRefreshRate();
    
    GetRefreshRateList( RefreshRateList );
    class'UIAPI_COMBOBOX'.static.Clear( "OptionWnd.RefreshRateBox" );
    for( i = 0; i < RefreshRateList.Length; ++i )
    {
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.RefreshRateBox", RefreshRateList[ i ] $ "Hz" );
    }
    

    nMultiSample = GetMultiSample();
    if( 0 == nMultiSample )
    {
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 869 );
        class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.AABox" );
    }
    else if( 1 == nMultiSample )
    {
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 869 );
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 870 );
        class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.AABox" );
    }
    else if( 2 == nMultiSample )
    {
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 869 );
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 870 );
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.AABox", 871 );
        class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.AABox" );
    }

    bEnableEngSelection = IsEnableEngSelection();
    Language = GetLanguage();
    switch( Language )
    {
    case LANG_None:
        break;
    case LANG_Korean:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Korean" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
    case LANG_English:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Russia" );
        if( bEnableEngSelection )
            class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
            class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
    case LANG_Japanese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
            class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
            class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
    case LANG_Taiwan:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
            class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
            class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
    case LANG_Chinese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "China" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
            class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
            class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
    case LANG_Thai:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Thai" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
            class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
            class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
    case LANG_Philippine:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
    case LANG_Russia:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Russia" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
    default:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Russia " );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
    }

    if( CanUseHDR() )
    {
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.HDRBox", 1230 );
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.HDRBox", 1231 );
        class'UIAPI_COMBOBOX'.static.SYS_AddString( "OptionWnd.HDRBox", 1232 );
    }

    // 2007/11/16 Now new functions(LoadVideoOption,LoadAudioOption,LoadGameOption) load the ini configuration. - NeverDie
    //InitVideoOption();
    //InitAudioOption();
    //InitGameOption();
    LoadVideoOption();
    LoadAudioOption();
    LoadGameOption();

    bShow = false;
}
 
Доброго времени суток, есть проблемка, я забыл, а потом и не проверял должно. В data есть две папки: html-ru и html-en. Так вот все файлы он тянет с папки "en" - даже если есть папка с русской локализацией, подскажите пожалуйста - где рыть?
 
Доброго времени суток, есть проблемка, я забыл, а потом и не проверял должно. В data есть две папки: html-ru и html-en. Так вот все файлы он тянет с папки "en" - даже если есть папка с русской локализацией, подскажите пожалуйста - где рыть?
В конфигах ищи, у тебя указан En Укажешь Ru будет брать от туда.
 
Назад
Сверху Снизу