From d6eb0d4342dd581feb43ce0c24a6bec255eb69da Mon Sep 17 00:00:00 2001 From: GDroid Chinese Localization Date: Fri, 16 Oct 2026 14:15:54 +0000 Subject: [PATCH] Add Chinese (Simplified & Traditional) localization support - Add language selection page in Options dialog (OptionsSubLanguage) - Support switching between English, Simplified Chinese, Traditional Chinese, Japanese, Korean, German, French, Spanish, Russian - Auto-reload localization files when language changes - Create Simplified Chinese localization files: gameui_schinese.txt, valve_schinese.txt, platform_schinese.txt, vgui_schinese.txt - Create Traditional Chinese localization files: gameui_tchinese.txt, valve_tchinese.txt, platform_tchinese.txt, vgui_tchinese.txt - Android: auto-detect system language from system properties - Android: fix JNI string leaks (release GetStringUTFChars) - Android: use __system_property_get instead of popen(getprop) - Android: use sysinfo() for memory detection - Add FCVAR_ARCHIVE to cl_language so language setting persists --- engine/cl_main.cpp | 2 +- gameui/OptionsDialog.cpp | 4 + gameui/OptionsSubLanguage.cpp | 133 ++++++++++++ gameui/OptionsSubLanguage.h | 48 ++++ gameui/resource/gameui_schinese.txt | 301 ++++++++++++++++++++++++++ gameui/resource/gameui_tchinese.txt | 298 +++++++++++++++++++++++++ gameui/resource/platform_schinese.txt | 151 +++++++++++++ gameui/resource/platform_tchinese.txt | 142 ++++++++++++ gameui/resource/valve_schinese.txt | 135 ++++++++++++ gameui/resource/valve_tchinese.txt | 134 ++++++++++++ gameui/resource/vgui_schinese.txt | 177 +++++++++++++++ gameui/resource/vgui_tchinese.txt | 168 ++++++++++++++ gameui/wscript | 1 + launcher/android/main.cpp | 80 ++++--- vgui2/vgui_surfacelib/linuxfont.cpp | 2 +- 15 files changed, 1742 insertions(+), 34 deletions(-) create mode 100644 gameui/OptionsSubLanguage.cpp create mode 100644 gameui/OptionsSubLanguage.h create mode 100644 gameui/resource/gameui_schinese.txt create mode 100644 gameui/resource/gameui_tchinese.txt create mode 100644 gameui/resource/platform_schinese.txt create mode 100644 gameui/resource/platform_tchinese.txt create mode 100644 gameui/resource/valve_schinese.txt create mode 100644 gameui/resource/valve_tchinese.txt create mode 100644 gameui/resource/vgui_schinese.txt create mode 100644 gameui/resource/vgui_tchinese.txt diff --git a/engine/cl_main.cpp b/engine/cl_main.cpp index 52a5a5811a..55548ed070 100644 --- a/engine/cl_main.cpp +++ b/engine/cl_main.cpp @@ -2736,7 +2736,7 @@ void CL_SetSteamCrashComment() // static ConCommand startupmenu( "startupmenu", &CL_CheckToDisplayStartupMenus, "Opens initial menu screen and loads the background bsp, but only if no other level is being loaded, and we're not in developer mode." ); -ConVar cl_language( "cl_language", "english", FCVAR_USERINFO, "Language (from HKCU\\Software\\Valve\\Steam\\Language)" ); +ConVar cl_language( "cl_language", "english", FCVAR_USERINFO | FCVAR_ARCHIVE, "Language (from HKCU\\Software\\Valve\\Steam\\Language)" ); void CL_InitLanguageCvar() { Msg("CL_InitLanguageCvar\n"); diff --git a/gameui/OptionsDialog.cpp b/gameui/OptionsDialog.cpp index 6ecdbe27ae..1d4e3caade 100644 --- a/gameui/OptionsDialog.cpp +++ b/gameui/OptionsDialog.cpp @@ -29,6 +29,7 @@ #include "OptionsSubMultiplayer.h" #include "OptionsSubDifficulty.h" #include "OptionsSubPortal.h" +#include "OptionsSubLanguage.h" #ifdef WIN32 // NVNT haptic configuration dialog #include "OptionsSubHaptics.h" @@ -96,6 +97,9 @@ COptionsDialog::COptionsDialog(vgui::Panel *parent) : PropertyDialog(parent, "Op m_pOptionsSubVideo = new COptionsSubVideo(this); AddPage(m_pOptionsSubVideo, "#GameUI_Video"); + // Language selection page + AddPage(new COptionsSubLanguage(this), "#GameUI_Language"); + if ( !ModInfo().IsSinglePlayerOnly() ) { AddPage(new COptionsSubVoice(this), "#GameUI_Voice"); diff --git a/gameui/OptionsSubLanguage.cpp b/gameui/OptionsSubLanguage.cpp new file mode 100644 index 0000000000..ce742d348a --- /dev/null +++ b/gameui/OptionsSubLanguage.cpp @@ -0,0 +1,133 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Language selection options page +// +//=============================================================================// +#include "OptionsSubLanguage.h" + +#include "EngineInterface.h" +#include "vgui_controls/ComboBox.h" +#include "vgui_controls/Label.h" + +#include +#include +#include +#include "tier1/convar.h" +#include "common/language.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include + +using namespace vgui; + +// Languages offered in the UI selection +struct LanguageOption_t +{ + ELanguage eLang; + const char *pchName; // Display name (localization token) +}; + +static const LanguageOption_t s_LanguageOptions[] = +{ + { k_Lang_English, "#GameUI_Language_English" }, + { k_Lang_Simplified_Chinese, "#GameUI_Language_Simplified_Chinese" }, + { k_Lang_Traditional_Chinese, "#GameUI_Language_Traditional_Chinese" }, + { k_Lang_Japanese, "#GameUI_Language_Japanese" }, + { k_Lang_Korean, "#GameUI_Language_Korean" }, + { k_Lang_German, "#GameUI_Language_German" }, + { k_Lang_French, "#GameUI_Language_French" }, + { k_Lang_Spanish, "#GameUI_Language_Spanish" }, + { k_Lang_Russian, "#GameUI_Language_Russian" }, +}; + +COptionsSubLanguage::COptionsSubLanguage(vgui::Panel *parent) : PropertyPage(parent, NULL) +{ + m_pLanguageLabel = new Label(this, "LanguageLabel", "#GameUI_Language"); + + m_pLanguageCombo = new ComboBox(this, "LanguageCombo", 10, false); + m_pLanguageCombo->AddActionSignalTarget(this); + + for ( int i = 0; i < Q_ARRAYSIZE(s_LanguageOptions); ++i ) + { + KeyValues *pData = new KeyValues("Language", "lang", (int)s_LanguageOptions[i].eLang); + m_pLanguageCombo->AddItem(s_LanguageOptions[i].pchName, pData); + } + + LoadControlSettings("Resource\\OptionsSubLanguage.res"); +} + +COptionsSubLanguage::~COptionsSubLanguage() +{ +} + +void COptionsSubLanguage::ApplySchemeSettings(vgui::IScheme *pScheme) +{ + BaseClass::ApplySchemeSettings(pScheme); +} + +void COptionsSubLanguage::OnResetData() +{ + // Read the current language from cl_language + ConVarRef cl_language("cl_language"); + const char *pchLang = cl_language.IsValid() ? cl_language.GetString() : "english"; + + ELanguage eLang = PchLanguageToELanguage(pchLang, k_Lang_English); + m_nCurrentLanguage = (int)eLang; + + // Select the matching item + for ( int i = 0; i < m_pLanguageCombo->GetItemCount(); ++i ) + { + KeyValues *pData = m_pLanguageCombo->GetItemUserData(i); + if ( pData && pData->GetInt("lang") == m_nCurrentLanguage ) + { + m_pLanguageCombo->ActivateItem(i); + break; + } + } +} + +void COptionsSubLanguage::OnApplyChanges() +{ + KeyValues *pData = m_pLanguageCombo->GetActiveItemUserData(); + if ( !pData ) + return; + + int nLang = pData->GetInt("lang", k_Lang_English); + if ( nLang == m_nCurrentLanguage ) + return; + + ELanguage eLang = (ELanguage)nLang; + const char *pchShortName = GetLanguageShortName(eLang); + + // Update cl_language + ConVarRef cl_language("cl_language"); + if ( cl_language.IsValid() ) + { + cl_language.SetValue(pchShortName); + } + + // Reload all localization files so the new language takes effect + if ( g_pVGuiLocalize ) + { + g_pVGuiLocalize->RemoveAll(); + g_pVGuiLocalize->AddFile("Resource/gameui_%language%.txt", "GAME", true); + g_pVGuiLocalize->AddFile("Resource/valve_%language%.txt", "GAME", true); + g_pVGuiLocalize->AddFile("Resource/platform_%language%.txt"); + g_pVGuiLocalize->AddFile("Resource/vgui_%language%.txt"); + } + + m_nCurrentLanguage = nLang; +} + +void COptionsSubLanguage::OnControlModified(Panel *panel) +{ + if ( panel == m_pLanguageCombo ) + { + SetModified(true); + } +} + +void COptionsSubLanguage::OnTextChanged(Panel *panel) +{ + OnControlModified(panel); +} diff --git a/gameui/OptionsSubLanguage.h b/gameui/OptionsSubLanguage.h new file mode 100644 index 0000000000..5db4688717 --- /dev/null +++ b/gameui/OptionsSubLanguage.h @@ -0,0 +1,48 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Language selection options page +// +//=============================================================================// + +#ifndef OPTIONS_SUB_LANGUAGE_H +#define OPTIONS_SUB_LANGUAGE_H +#ifdef _WIN32 +#pragma once +#endif + +#include + +namespace vgui +{ + class Label; + class ComboBox; + class Panel; +} + +//----------------------------------------------------------------------------- +// Purpose: Language selection, Part of OptionsDialog +//----------------------------------------------------------------------------- +class COptionsSubLanguage : public vgui::PropertyPage +{ + DECLARE_CLASS_SIMPLE( COptionsSubLanguage, vgui::PropertyPage ); + +public: + COptionsSubLanguage(vgui::Panel *parent); + ~COptionsSubLanguage(); + + virtual void OnResetData(); + virtual void OnApplyChanges(); + +protected: + virtual void ApplySchemeSettings(vgui::IScheme *pScheme); + + MESSAGE_FUNC_PTR( OnControlModified, "ControlModified", panel ); + MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel ); + +private: + vgui::ComboBox *m_pLanguageCombo; + vgui::Label *m_pLanguageLabel; + int m_nCurrentLanguage; +}; + +#endif // OPTIONS_SUB_LANGUAGE_H diff --git a/gameui/resource/gameui_schinese.txt b/gameui/resource/gameui_schinese.txt new file mode 100644 index 0000000000..b2622600ae --- /dev/null +++ b/gameui/resource/gameui_schinese.txt @@ -0,0 +1,301 @@ +"lang" +{ +"Language" "schinese" +"Tokens" +{ +// +// Main menu +// +"GameUI_GameTitle" "Garry's Mod" +"GameUI_Options" "选项" +"GameUI_Quit" "退出游戏" +"GameUI_QuitConfirmation" "确定要退出游戏吗?" +"GameUI_Yes" "是" +"GameUI_No" "否" +"GameUI_OK" "确定" +"GameUI_Cancel" "取消" +"GameUI_Apply" "应用" +"GameUI_Close" "关闭" +"GameUI_Back" "返回" +"GameUI_Next" "下一步" +"GameUI_Previous" "上一步" +"GameUI_Finish" "完成" +"GameUI_Loading" "加载中..." +"GameUI_Console" "控制台" +"GameUI_NewGame" "开始新游戏" +"GameUI_LoadGame" "读取游戏" +"GameUI_SaveGame" "保存游戏" +"GameUI_Disconnect" "断开连接" +"GameUI_FindServers" "查找服务器" +"GameUI_CreateServer" "创建服务器" +"GameUI_ResumeGame" "继续游戏" +"GameUI_RestartLevel" "重新开始关卡" +"GameUI_Workshop" "创意工坊" +"GameUI_Addons" "插件" +"GameUI_Demos" "演示" +"GameUI_Saves" "存档" + +// +// Options dialog tabs +// +"GameUI_Keyboard" "键盘" +"GameUI_Mouse" "鼠标" +"GameUI_Audio" "音频" +"GameUI_Video" "视频" +"GameUI_Voice" "语音" +"GameUI_Multiplayer" "多人游戏" +"GameUI_Difficulty" "难度" +"GameUI_Portal" "传送门" +"GameUI_Touch" "触摸" +"GameUI_Language" "语言" + +// +// Language names +// +"GameUI_Language_English" "英语" +"GameUI_Language_German" "德语" +"GameUI_Language_French" "法语" +"GameUI_Language_Italian" "意大利语" +"GameUI_Language_Korean" "韩语" +"GameUI_Language_Spanish" "西班牙语" +"GameUI_Language_Simplified_Chinese" "简体中文" +"GameUI_Language_Traditional_Chinese" "繁体中文" +"GameUI_Language_Russian" "俄语" +"GameUI_Language_Thai" "泰语" +"GameUI_Language_Japanese" "日语" +"GameUI_Language_Portuguese" "葡萄牙语" +"GameUI_Language_Polish" "波兰语" +"GameUI_Language_Danish" "丹麦语" +"GameUI_Language_Dutch" "荷兰语" +"GameUI_Language_Finnish" "芬兰语" +"GameUI_Language_Norwegian" "挪威语" +"GameUI_Language_Swedish" "瑞典语" +"GameUI_Language_Romanian" "罗马尼亚语" +"GameUI_Language_Turkish" "土耳其语" +"GameUI_Language_Hungarian" "匈牙利语" +"GameUI_Language_Czech" "捷克语" +"GameUI_Language_Brazilian" "巴西葡萄牙语" +"GameUI_Language_Bulgarian" "保加利亚语" +"GameUI_Language_Greek" "希腊语" +"GameUI_Language_Ukrainian" "乌克兰语" + +// +// Language change dialog +// +"GameUI_ChangeLanguageRestart_Title" "更改语言" +"GameUI_ChangeLanguageRestart_Info" "更改语言后需要重启游戏才能完全生效。是否继续?" +"GameUI_ChangeLanguageRestart_OkButton" "更改语言" +"GameUI_ChangeLanguageRestart_CancelButton" "取消" + +// +// Video options +// +"GameUI_Resolution" "分辨率" +"GameUI_AspectRatio" "宽高比" +"GameUI_RefreshRate" "刷新率" +"GameUI_Fullscreen" "全屏模式" +"GameUI_Windowed" "窗口模式" +"GameUI_WindowedNoBorder" "无边框窗口" +"GameUI_Antialiasing" "抗锯齿" +"GameUI_FilteringMode" "纹理过滤模式" +"GameUI_Bilinear" "双线性" +"GameUI_Trilinear" "三线性" +"GameUI_Anisotropic" "各向异性" +"GameUI_VerticalSync" "垂直同步" +"GameUI_MulticoreRendering" "多核渲染" +"GameUI_Brightness" "亮度" +"GameUI_Gamma" "伽马值" +"GameUI_AdjustGamma" "调整伽马" +"GameUI_AdjustGamma_Title" "伽马校正" +"GameUI_HDR" "高动态范围" +"GameUI_HDR_Quality" "HDR 质量" +"GameUI_ShadowQuality" "阴影质量" +"GameUI_TextureQuality" "纹理质量" +"GameUI_FilteringMode_Trilinear" "三线性过滤" +"GameUI_PixelShader" "像素着色器" +"GameUI_Mat_DxLevel" "DirectX 级别" +"GameUI_Auto" "自动" + +// +// Audio options +// +"GameUI_SpeakerSetup" "扬声器设置" +"GameUI_SoundQuality" "声音质量" +"GameUI_High" "高" +"GameUI_Medium" "中" +"GameUI_Low" "低" +"GameUI_MasterVolume" "主音量" +"GameUI_MusicVolume" "音乐音量" +"GameUI_SFXVolume" "音效音量" +"GameUI_VoiceVolume" "语音音量" +"GameUI_NoClosedCaptions" "无字幕" +"GameUI_SubtitlesAndSoundEffects" "字幕和音效" +"GameUI_Subtitles" "仅字幕" +"GameUI_Captions" "字幕" +"GameUI_CloseCaptioning" "字幕" +"GameUI_SpokenLanguage" "配音语言" + +// +// Keyboard options +// +"GameUI_UseDefaults" "使用默认值" +"GameUI_Key" "按键" +"GameUI_Bind" "绑定" +"GameUI_Clear" "清除" +"GameUI_AdvancedEllipsis" "高级..." +"GameUI_KeyboardSettings" "键盘设置" +"GameUI_KeyBinding" "按键绑定" + +// +// Mouse options +// +"GameUI_MouseSensitivity" "鼠标灵敏度" +"GameUI_InvertMouse" "鼠标反向" +"GameUI_MouseFilter" "鼠标过滤" +"GameUI_RawMouseInput" "原始鼠标输入" +"GameUI_JoyLook" "摇杆视角" +"GameUI_JoyForward" "摇杆前进" +"GameUI_Joystick" "手柄" +"GameUI_JoystickLookSpeedYaw" "水平视角速度" +"GameUI_JoystickLookSpeedPitch" "垂直视角速度" +"GameUI_JoystickYawSensitivity" "水平灵敏度" +"GameUI_JoystickPitchSensitivity" "垂直灵敏度" + +// +// Touch options +// +"GameUI_TouchEnable" "启用触摸" +"GameUI_TouchDraw" "显示触摸按钮" +"GameUI_TouchReverse" "反向触摸" +"GameUI_TouchFilter" "触摸过滤" +"GameUI_TouchAcceleration" "触摸加速" +"GameUI_TouchSensitivity" "触摸灵敏度" + +// +// Multiplayer options +// +"GameUI_PlayerName" "玩家名称" +"GameUI_PlayerModel" "玩家模型" +"GameUI_Crosshair" "准星" +"GameUI_CrosshairColor" "准星颜色" +"GameUI_Crosshair_Thickness" "准星粗细" +"GameUI_Crosshair_Size" "准星大小" +"GameUI_Crosshair_Gap" "准星间隙" +"GameUI_Crosshair_Alpha" "准星透明度" +"GameUI_CrosshairColor_Red" "红" +"GameUI_CrosshairColor_Green" "绿" +"GameUI_CrosshairColor_Blue" "蓝" +"GameUI_CrosshairColor_Alpha" "透明度" +"GameUI_Crosshair_Dynamic" "动态准星" +"GameUI_Crosshair_Dot" "准星中心点" +"GameUI_Crosshair_Blend" "准星混合" +"GameUI_CrosshairScale" "准星缩放" + +// +// Dialog titles and messages +// +"GameUI_ConfirmNewGame_Title" "开始新游戏" +"GameUI_NewGameWarning" "开始新游戏将丢失当前进度。是否继续?" +"GameUI_ConfirmLoadGame_Title" "读取游戏" +"GameUI_LoadWarning" "读取存档将丢失当前进度。是否继续?" +"GameUI_ConfirmSaveGame_Title" "保存游戏" +"GameUI_ConfirmOverwriteSaveGame_Title" "覆盖存档" +"GameUI_ConfirmOverwriteSaveGame_Info" "是否覆盖此存档?" +"GameUI_ConfirmDeleteSaveGame_Title" "删除存档" +"GameUI_ConfirmDeleteSaveGame_Info" "是否删除此存档?" +"GameUI_SavingWarning" "正在保存...请勿关闭游戏" +"GameUI_CommentaryDialogTitle" "解说" +"GameUI_CommentaryUnlock" "解锁解说" +"GameUI_Dialog_Warning" "警告" +"GameUI_Action" "操作" + +// +// Server browser +// +"GameUI_Servers" "服务器" +"GameUI_Internet" "互联网" +"GameUI_LAN" "局域网" +"GameUI_Favorites" "收藏" +"GameUI_History" "历史" +"GameUI_Refresh" "刷新" +"GameUI_Connect" "连接" +"GameUI_AddServer" "添加服务器" +"GameUI_GameInfo" "游戏信息" +"GameUI_ServerPassword" "服务器密码" + +// +// Load/Save +// +"GameUI_Load" "读取" +"GameUI_Save" "保存" +"GameUI_Delete" "删除" +"GameUI_FileName" "文件名" +"GameUI_Date" "日期" +"GameUI_ElapsedTime" "游戏时间" +"GameUI_MapName" "地图名称" + +// +// Create server +// +"GameUI_Map" "地图" +"GameUI_ServerName" "服务器名称" +"GameUI_MaxPlayers" "最大玩家数" +"GameUI_ServerPassword" "服务器密码" +"GameUI_Start" "开始" +"GameUI_Settings" "设置" + +// +// Achievements +// +"GameUI_Achievements" "成就" +"GameUI_Achievements_SteamRequired_Title" "需要 Steam" +"GameUI_Achievements_SteamRequired_Message" "需要 Steam 才能查看成就。" + +// +// Common +// +"GameUI_Accept" "接受" +"GameUI_Decline" "拒绝" +"GameUI_Retry" "重试" +"GameUI_Reset" "重置" +"GameUI_Default" "默认" +"GameUI_Advanced" "高级" +"GameUI_General" "常规" +"GameUI_Details" "详情" +"GameUI_Play" "开始游戏" +"GameUI_Stop" "停止" +"GameUI_Pause" "暂停" +"GameUI_Continue" "继续" +"GameUI_Enabled" "已启用" +"GameUI_Disabled" "已禁用" +"GameUI_On" "开" +"GameUI_Off" "关" +"GameUI_Yes" "是" +"GameUI_No" "否" +"GameUI_None" "无" +"GameUI_Unknown" "未知" + +// +// Controller +// +"GameUI_ControllerSettingsText" "控制器设置" + +// +// Console warnings +// +"GameUI_Console_QuitWarning" "退出游戏" +"GameUI_Console_FileCorrupt" "文件已损坏" +"GameUI_Console_NoStorageDeviceSelectedTitle" "未选择存储设备" +"GameUI_Console_NoStorageDeviceSelectedBody" "请选择一个存储设备以继续。" +"GameUI_Console_NoUserProfileSelectedTitle" "未选择用户档案" +"GameUI_Console_NoUserProfileSelectedBody" "请选择一个用户档案以继续。" +"GameUI_Console_StorageDeviceRequiredBody" "需要存储设备。" +"GameUI_Console_StorageNeededBody" "需要更多存储空间。" +"GameUI_Console_StorageRemovedTitle" "存储设备已移除" +"GameUI_Console_StorageRemovedBody" "存储设备已被移除。" +"GameUI_Console_StorageTooFullTitle" "存储空间不足" +"GameUI_Console_StorageTooFullBody" "存储空间已满。" +"GameUI_Console_UserProfileRequiredBody" "需要用户档案。" + +} +} diff --git a/gameui/resource/gameui_tchinese.txt b/gameui/resource/gameui_tchinese.txt new file mode 100644 index 0000000000..5ce3ffe363 --- /dev/null +++ b/gameui/resource/gameui_tchinese.txt @@ -0,0 +1,298 @@ +"lang" +{ +"Language" "tchinese" +"Tokens" +{ +// +// Main menu +// +"GameUI_GameTitle" "Garry's Mod" +"GameUI_Options" "選項" +"GameUI_Quit" "離開遊戲" +"GameUI_QuitConfirmation" "確定要離開遊戲嗎?" +"GameUI_Yes" "是" +"GameUI_No" "否" +"GameUI_OK" "確定" +"GameUI_Cancel" "取消" +"GameUI_Apply" "套用" +"GameUI_Close" "關閉" +"GameUI_Back" "返回" +"GameUI_Next" "下一步" +"GameUI_Previous" "上一步" +"GameUI_Finish" "完成" +"GameUI_Loading" "載入中..." +"GameUI_Console" "控制台" +"GameUI_NewGame" "開始新遊戲" +"GameUI_LoadGame" "讀取遊戲" +"GameUI_SaveGame" "儲存遊戲" +"GameUI_Disconnect" "中斷連線" +"GameUI_FindServers" "尋找伺服器" +"GameUI_CreateServer" "建立伺服器" +"GameUI_ResumeGame" "繼續遊戲" +"GameUI_RestartLevel" "重新開始關卡" +"GameUI_Workshop" "創意工坊" +"GameUI_Addons" "擴充包" +"GameUI_Demos" "示範" +"GameUI_Saves" "存檔" + +// +// Options dialog tabs +// +"GameUI_Keyboard" "鍵盤" +"GameUI_Mouse" "滑鼠" +"GameUI_Audio" "音訊" +"GameUI_Video" "影片" +"GameUI_Voice" "語音" +"GameUI_Multiplayer" "多人遊戲" +"GameUI_Difficulty" "難度" +"GameUI_Portal" "傳送門" +"GameUI_Touch" "觸控" +"GameUI_Language" "語言" + +// +// Language names +// +"GameUI_Language_English" "英語" +"GameUI_Language_German" "德語" +"GameUI_Language_French" "法語" +"GameUI_Language_Italian" "義大利語" +"GameUI_Language_Korean" "韓語" +"GameUI_Language_Spanish" "西班牙語" +"GameUI_Language_Simplified_Chinese" "簡體中文" +"GameUI_Language_Traditional_Chinese" "繁體中文" +"GameUI_Language_Russian" "俄語" +"GameUI_Language_Thai" "泰語" +"GameUI_Language_Japanese" "日語" +"GameUI_Language_Portuguese" "葡萄牙語" +"GameUI_Language_Polish" "波蘭語" +"GameUI_Language_Danish" "丹麥語" +"GameUI_Language_Dutch" "荷蘭語" +"GameUI_Language_Finnish" "芬蘭語" +"GameUI_Language_Norwegian" "挪威語" +"GameUI_Language_Swedish" "瑞典語" +"GameUI_Language_Romanian" "羅馬尼亞語" +"GameUI_Language_Turkish" "土耳其語" +"GameUI_Language_Hungarian" "匈牙利語" +"GameUI_Language_Czech" "捷克語" +"GameUI_Language_Brazilian" "巴西葡萄牙語" +"GameUI_Language_Bulgarian" "保加利亞語" +"GameUI_Language_Greek" "希臘語" +"GameUI_Language_Ukrainian" "烏克蘭語" + +// +// Language change dialog +// +"GameUI_ChangeLanguageRestart_Title" "變更語言" +"GameUI_ChangeLanguageRestart_Info" "變更語言後需要重新啟動遊戲才能完全生效。是否繼續?" +"GameUI_ChangeLanguageRestart_OkButton" "變更語言" +"GameUI_ChangeLanguageRestart_CancelButton" "取消" + +// +// Video options +// +"GameUI_Resolution" "解析度" +"GameUI_AspectRatio" "畫面比例" +"GameUI_RefreshRate" "更新率" +"GameUI_Fullscreen" "全螢幕模式" +"GameUI_Windowed" "視窗模式" +"GameUI_WindowedNoBorder" "無邊框視窗" +"GameUI_Antialiasing" "反鋸齒" +"GameUI_FilteringMode" "材質過濾模式" +"GameUI_Bilinear" "雙線性" +"GameUI_Trilinear" "三線性" +"GameUI_Anisotropic" "各向異性" +"GameUI_VerticalSync" "垂直同步" +"GameUI_MulticoreRendering" "多核算繪" +"GameUI_Brightness" "亮度" +"GameUI_Gamma" "伽瑪值" +"GameUI_AdjustGamma" "調整伽瑪" +"GameUI_AdjustGamma_Title" "伽瑪校正" +"GameUI_HDR" "高動態範圍" +"GameUI_HDR_Quality" "HDR 品質" +"GameUI_ShadowQuality" "陰影品質" +"GameUI_TextureQuality" "材質品質" +"GameUI_FilteringMode_Trilinear" "三線性過濾" +"GameUI_PixelShader" "像素著色器" +"GameUI_Mat_DxLevel" "DirectX 等級" +"GameUI_Auto" "自動" + +// +// Audio options +// +"GameUI_SpeakerSetup" "喇叭設定" +"GameUI_SoundQuality" "音質" +"GameUI_High" "高" +"GameUI_Medium" "中" +"GameUI_Low" "低" +"GameUI_MasterVolume" "主音量" +"GameUI_MusicVolume" "音樂音量" +"GameUI_SFXVolume" "音效音量" +"GameUI_VoiceVolume" "語音音量" +"GameUI_NoClosedCaptions" "無字幕" +"GameUI_SubtitlesAndSoundEffects" "字幕和音效" +"GameUI_Subtitles" "僅字幕" +"GameUI_Captions" "字幕" +"GameUI_CloseCaptioning" "字幕" +"GameUI_SpokenLanguage" "配音語言" + +// +// Keyboard options +// +"GameUI_UseDefaults" "使用預設值" +"GameUI_Key" "按鍵" +"GameUI_Bind" "綁定" +"GameUI_Clear" "清除" +"GameUI_AdvancedEllipsis" "進階..." +"GameUI_KeyboardSettings" "鍵盤設定" +"GameUI_KeyBinding" "按鍵綁定" + +// +// Mouse options +// +"GameUI_MouseSensitivity" "滑鼠靈敏度" +"GameUI_InvertMouse" "滑鼠反轉" +"GameUI_MouseFilter" "滑鼠過濾" +"GameUI_RawMouseInput" "原始滑鼠輸入" +"GameUI_JoyLook" "搖桿視角" +"GameUI_JoyForward" "搖桿前進" +"GameUI_Joystick" "手把" +"GameUI_JoystickLookSpeedYaw" "水平視角速度" +"GameUI_JoystickLookSpeedPitch" "垂直視角速度" +"GameUI_JoystickYawSensitivity" "水平靈敏度" +"GameUI_JoystickPitchSensitivity" "垂直靈敏度" + +// +// Touch options +// +"GameUI_TouchEnable" "啟用觸控" +"GameUI_TouchDraw" "顯示觸控按鈕" +"GameUI_TouchReverse" "反向觸控" +"GameUI_TouchFilter" "觸控過濾" +"GameUI_TouchAcceleration" "觸控加速" +"GameUI_TouchSensitivity" "觸控靈敏度" + +// +// Multiplayer options +// +"GameUI_PlayerName" "玩家名稱" +"GameUI_PlayerModel" "玩家模型" +"GameUI_Crosshair" "準星" +"GameUI_CrosshairColor" "準星顏色" +"GameUI_Crosshair_Thickness" "準星粗細" +"GameUI_Crosshair_Size" "準星大小" +"GameUI_Crosshair_Gap" "準星間隙" +"GameUI_Crosshair_Alpha" "準星透明度" +"GameUI_CrosshairColor_Red" "紅" +"GameUI_CrosshairColor_Green" "綠" +"GameUI_CrosshairColor_Blue" "藍" +"GameUI_CrosshairColor_Alpha" "透明度" +"GameUI_Crosshair_Dynamic" "動態準星" +"GameUI_Crosshair_Dot" "準星中心點" +"GameUI_Crosshair_Blend" "準星混合" +"GameUI_CrosshairScale" "準星縮放" + +// +// Dialog titles and messages +// +"GameUI_ConfirmNewGame_Title" "開始新遊戲" +"GameUI_NewGameWarning" "開始新遊戲將遺失目前進度。是否繼續?" +"GameUI_ConfirmLoadGame_Title" "讀取遊戲" +"GameUI_LoadWarning" "讀取存檔將遺失目前進度。是否繼續?" +"GameUI_ConfirmSaveGame_Title" "儲存遊戲" +"GameUI_ConfirmOverwriteSaveGame_Title" "覆蓋存檔" +"GameUI_ConfirmOverwriteSaveGame_Info" "是否覆蓋此存檔?" +"GameUI_ConfirmDeleteSaveGame_Title" "刪除存檔" +"GameUI_ConfirmDeleteSaveGame_Info" "是否刪除此存檔?" +"GameUI_SavingWarning" "正在儲存...請勿關閉遊戲" +"GameUI_CommentaryDialogTitle" "解說" +"GameUI_CommentaryUnlock" "解鎖解說" +"GameUI_Dialog_Warning" "警告" +"GameUI_Action" "操作" + +// +// Server browser +// +"GameUI_Servers" "伺服器" +"GameUI_Internet" "網際網路" +"GameUI_LAN" "區域網路" +"GameUI_Favorites" "我的最愛" +"GameUI_History" "歷史" +"GameUI_Refresh" "重新整理" +"GameUI_Connect" "連線" +"GameUI_AddServer" "新增伺服器" +"GameUI_GameInfo" "遊戲資訊" +"GameUI_ServerPassword" "伺服器密碼" + +// +// Load/Save +// +"GameUI_Load" "讀取" +"GameUI_Save" "儲存" +"GameUI_Delete" "刪除" +"GameUI_FileName" "檔案名稱" +"GameUI_Date" "日期" +"GameUI_ElapsedTime" "遊戲時間" +"GameUI_MapName" "地圖名稱" + +// +// Create server +// +"GameUI_Map" "地圖" +"GameUI_ServerName" "伺服器名稱" +"GameUI_MaxPlayers" "最大玩家數" +"GameUI_Start" "開始" +"GameUI_Settings" "設定" + +// +// Achievements +// +"GameUI_Achievements" "成就" +"GameUI_Achievements_SteamRequired_Title" "需要 Steam" +"GameUI_Achievements_SteamRequired_Message" "需要 Steam 才能檢視成就。" + +// +// Common +// +"GameUI_Accept" "接受" +"GameUI_Decline" "拒絕" +"GameUI_Retry" "重試" +"GameUI_Reset" "重設" +"GameUI_Default" "預設" +"GameUI_Advanced" "進階" +"GameUI_General" "一般" +"GameUI_Details" "詳細資料" +"GameUI_Play" "開始遊戲" +"GameUI_Stop" "停止" +"GameUI_Pause" "暫停" +"GameUI_Continue" "繼續" +"GameUI_Enabled" "已啟用" +"GameUI_Disabled" "已停用" +"GameUI_On" "開" +"GameUI_Off" "關" +"GameUI_None" "無" +"GameUI_Unknown" "未知" + +// +// Controller +// +"GameUI_ControllerSettingsText" "控制器設定" + +// +// Console warnings +// +"GameUI_Console_QuitWarning" "離開遊戲" +"GameUI_Console_FileCorrupt" "檔案已損毀" +"GameUI_Console_NoStorageDeviceSelectedTitle" "未選取儲存裝置" +"GameUI_Console_NoStorageDeviceSelectedBody" "請選取一個儲存裝置以繼續。" +"GameUI_Console_NoUserProfileSelectedTitle" "未選取使用者設定檔" +"GameUI_Console_NoUserProfileSelectedBody" "請選取一個使用者設定檔以繼續。" +"GameUI_Console_StorageDeviceRequiredBody" "需要儲存裝置。" +"GameUI_Console_StorageNeededBody" "需要更多儲存空間。" +"GameUI_Console_StorageRemovedTitle" "儲存裝置已移除" +"GameUI_Console_StorageRemovedBody" "儲存裝置已被移除。" +"GameUI_Console_StorageTooFullTitle" "儲存空間不足" +"GameUI_Console_StorageTooFullBody" "儲存空間已滿。" +"GameUI_Console_UserProfileRequiredBody" "需要使用者設定檔。" + +} +} diff --git a/gameui/resource/platform_schinese.txt b/gameui/resource/platform_schinese.txt new file mode 100644 index 0000000000..e9a82e052a --- /dev/null +++ b/gameui/resource/platform_schinese.txt @@ -0,0 +1,151 @@ +"lang" +{ +"Language" "schinese" +"Tokens" +{ +"Platform_OK" "确定" +"Platform_Cancel" "取消" +"Platform_Yes" "是" +"Platform_No" "否" +"Platform_Apply" "应用" +"Platform_Close" "关闭" +"Platform_Back" "返回" +"Platform_Next" "下一步" +"Platform_Previous" "上一步" +"Platform_Finish" "完成" +"Platform_Retry" "重试" +"Platform_Abort" "中止" +"Platform_Ignore" "忽略" +"Platform_Continue" "继续" +"Platform_Save" "保存" +"Platform_Load" "读取" +"Platform_Delete" "删除" +"Platform_Rename" "重命名" +"Platform_New" "新建" +"Platform_Open" "打开" +"Platform_Exit" "退出" +"Platform_Quit" "退出" +"Platform_Options" "选项" +"Platform_Settings" "设置" +"Platform_Help" "帮助" +"Platform_About" "关于" +"Platform_File" "文件" +"Platform_Edit" "编辑" +"Platform_View" "查看" +"Platform_Tools" "工具" +"Platform_Window" "窗口" +"Platform_Error" "错误" +"Platform_Warning" "警告" +"Platform_Information" "信息" +"Platform_Question" "询问" +"Platform_Input" "输入" +"Platform_Output" "输出" +"Platform_InputRequired" "需要输入" +"Platform_InvalidInput" "输入无效" +"Platform_OutOfMemory" "内存不足" +"Platform_OutOfDiskSpace" "磁盘空间不足" +"Platform_FileNotFound" "文件未找到" +"Platform_AccessDenied" "访问被拒绝" +"Platform_DiskFull" "磁盘已满" +"Platform_NetworkError" "网络错误" +"Platform_ConnectionLost" "连接丢失" +"Platform_Timeout" "超时" +"Platform_Retry" "重试" +"Platform_Canceled" "已取消" +"Platform_Failed" "失败" +"Platform_Success" "成功" +"Platform_UnknownError" "未知错误" +"Platform_PleaseWait" "请稍候" +"Platform_Loading" "加载中" +"Platform_Processing" "处理中" +"Platform_Downloading" "下载中" +"Platform_Uploading" "上传中" +"Platform_Installing" "安装中" +"Platform_Updating" "更新中" +"Platform_Checking" "检查中" +"Platform_Verifying" "验证中" +"Platform_Ready" "就绪" +"Platform_NotReady" "未就绪" +"Platform_Enabled" "已启用" +"Platform_Disabled" "已禁用" +"Platform_On" "开" +"Platform_Off" "关" +"Platform_Yes" "是" +"Platform_No" "否" +"Platform_None" "无" +"Platform_Unknown" "未知" +"Platform_Default" "默认" +"Platform_Custom" "自定义" +"Platform_Advanced" "高级" +"Platform_Basic" "基本" +"Platform_General" "常规" +"Platform_Details" "详情" +"Platform_Summary" "摘要" +"Platform_Description" "描述" +"Platform_Properties" "属性" +"Platform_Settings" "设置" +"Platform_Preferences" "偏好设置" +"Platform_Configuration" "配置" +"Platform_Options" "选项" +"Platform_Controls" "控制" +"Platform_Display" "显示" +"Platform_Audio" "音频" +"Platform_Video" "视频" +"Platform_Network" "网络" +"Platform_Security" "安全" +"Platform_Privacy" "隐私" +"Platform_Account" "账户" +"Platform_Profile" "个人资料" +"Platform_Stats" "统计" +"Platform_Achievements" "成就" +"Platform_Leaderboard" "排行榜" +"Platform_Friends" "好友" +"Platform_Chat" "聊天" +"Platform_Message" "消息" +"Platform_Notification" "通知" +"Platform_Update" "更新" +"Platform_Upgrade" "升级" +"Platform_Downgrade" "降级" +"Platform_Install" "安装" +"Platform_Uninstall" "卸载" +"Platform_Repair" "修复" +"Platform_Verify" "验证" +"Platform_Backup" "备份" +"Platform_Restore" "还原" +"Platform_Import" "导入" +"Platform_Export" "导出" +"Platform_Copy" "复制" +"Platform_Cut" "剪切" +"Platform_Paste" "粘贴" +"Platform_SelectAll" "全选" +"Platform_DeselectAll" "取消全选" +"Platform_InvertSelection" "反选" +"Platform_Find" "查找" +"Platform_Replace" "替换" +"Platform_Undo" "撤销" +"Platform_Redo" "重做" +"Platform_Cut" "剪切" +"Platform_Copy" "复制" +"Platform_Paste" "粘贴" +"Platform_Delete" "删除" +"Platform_Remove" "移除" +"Platform_Add" "添加" +"Platform_Insert" "插入" +"Platform_Move" "移动" +"Platform_MoveUp" "上移" +"Platform_MoveDown" "下移" +"Platform_MoveLeft" "左移" +"Platform_MoveRight" "右移" +"Platform_Expand" "展开" +"Platform_Collapse" "折叠" +"Platform_ZoomIn" "放大" +"Platform_ZoomOut" "缩小" +"Platform_FitToScreen" "适应屏幕" +"Platform_ActualSize" "实际大小" +"Platform_Fullscreen" "全屏" +"Platform_Windowed" "窗口化" +"Platform_Minimize" "最小化" +"Platform_Maximize" "最大化" +"Platform_Restore" "还原" +} +} diff --git a/gameui/resource/platform_tchinese.txt b/gameui/resource/platform_tchinese.txt new file mode 100644 index 0000000000..e595e0f8ad --- /dev/null +++ b/gameui/resource/platform_tchinese.txt @@ -0,0 +1,142 @@ +"lang" +{ +"Language" "tchinese" +"Tokens" +{ +"Platform_OK" "確定" +"Platform_Cancel" "取消" +"Platform_Yes" "是" +"Platform_No" "否" +"Platform_Apply" "套用" +"Platform_Close" "關閉" +"Platform_Back" "返回" +"Platform_Next" "下一步" +"Platform_Previous" "上一步" +"Platform_Finish" "完成" +"Platform_Retry" "重試" +"Platform_Abort" "中止" +"Platform_Ignore" "忽略" +"Platform_Continue" "繼續" +"Platform_Save" "儲存" +"Platform_Load" "讀取" +"Platform_Delete" "刪除" +"Platform_Rename" "重新命名" +"Platform_New" "新增" +"Platform_Open" "開啟" +"Platform_Exit" "結束" +"Platform_Quit" "離開" +"Platform_Options" "選項" +"Platform_Settings" "設定" +"Platform_Help" "說明" +"Platform_About" "關於" +"Platform_File" "檔案" +"Platform_Edit" "編輯" +"Platform_View" "檢視" +"Platform_Tools" "工具" +"Platform_Window" "視窗" +"Platform_Error" "錯誤" +"Platform_Warning" "警告" +"Platform_Information" "資訊" +"Platform_Question" "詢問" +"Platform_Input" "輸入" +"Platform_Output" "輸出" +"Platform_InputRequired" "需要輸入" +"Platform_InvalidInput" "輸入無效" +"Platform_OutOfMemory" "記憶體不足" +"Platform_OutOfDiskSpace" "磁碟空間不足" +"Platform_FileNotFound" "找不到檔案" +"Platform_AccessDenied" "拒絕存取" +"Platform_DiskFull" "磁碟已滿" +"Platform_NetworkError" "網路錯誤" +"Platform_ConnectionLost" "連線遺失" +"Platform_Timeout" "逾時" +"Platform_Canceled" "已取消" +"Platform_Failed" "失敗" +"Platform_Success" "成功" +"Platform_UnknownError" "未知錯誤" +"Platform_PleaseWait" "請稍候" +"Platform_Loading" "載入中" +"Platform_Processing" "處理中" +"Platform_Downloading" "下載中" +"Platform_Uploading" "上傳中" +"Platform_Installing" "安裝中" +"Platform_Updating" "更新中" +"Platform_Checking" "檢查中" +"Platform_Verifying" "驗證中" +"Platform_Ready" "就緒" +"Platform_NotReady" "未就緒" +"Platform_Enabled" "已啟用" +"Platform_Disabled" "已停用" +"Platform_On" "開" +"Platform_Off" "關" +"Platform_None" "無" +"Platform_Unknown" "未知" +"Platform_Default" "預設" +"Platform_Custom" "自訂" +"Platform_Advanced" "進階" +"Platform_Basic" "基本" +"Platform_General" "一般" +"Platform_Details" "詳細資料" +"Platform_Summary" "摘要" +"Platform_Description" "描述" +"Platform_Properties" "屬性" +"Platform_Preferences" "偏好設定" +"Platform_Configuration" "組態" +"Platform_Controls" "控制" +"Platform_Display" "顯示" +"Platform_Audio" "音訊" +"Platform_Video" "影片" +"Platform_Network" "網路" +"Platform_Security" "安全性" +"Platform_Privacy" "隱私權" +"Platform_Account" "帳戶" +"Platform_Profile" "個人檔案" +"Platform_Stats" "統計" +"Platform_Achievements" "成就" +"Platform_Leaderboard" "排行榜" +"Platform_Friends" "好友" +"Platform_Chat" "聊天" +"Platform_Message" "訊息" +"Platform_Notification" "通知" +"Platform_Update" "更新" +"Platform_Upgrade" "升級" +"Platform_Downgrade" "降級" +"Platform_Install" "安裝" +"Platform_Uninstall" "解除安裝" +"Platform_Repair" "修復" +"Platform_Verify" "驗證" +"Platform_Backup" "備份" +"Platform_Restore" "還原" +"Platform_Import" "匯入" +"Platform_Export" "匯出" +"Platform_Copy" "複製" +"Platform_Cut" "剪下" +"Platform_Paste" "貼上" +"Platform_SelectAll" "全選" +"Platform_DeselectAll" "取消全選" +"Platform_InvertSelection" "反向選取" +"Platform_Find" "尋找" +"Platform_Replace" "取代" +"Platform_Undo" "復原" +"Platform_Redo" "重做" +"Platform_Remove" "移除" +"Platform_Add" "新增" +"Platform_Insert" "插入" +"Platform_Move" "移動" +"Platform_MoveUp" "上移" +"Platform_MoveDown" "下移" +"Platform_MoveLeft" "左移" +"Platform_MoveRight" "右移" +"Platform_Expand" "展開" +"Platform_Collapse" "摺疊" +"Platform_ZoomIn" "放大" +"Platform_ZoomOut" "縮小" +"Platform_FitToScreen" "符合螢幕" +"Platform_ActualSize" "實際大小" +"Platform_Fullscreen" "全螢幕" +"Platform_Windowed" "視窗化" +"Platform_Minimize" "最小化" +"Platform_Maximize" "最大化" +"Platform_Restore" "還原" +} +} diff --git a/gameui/resource/valve_schinese.txt b/gameui/resource/valve_schinese.txt new file mode 100644 index 0000000000..c659680ddd --- /dev/null +++ b/gameui/resource/valve_schinese.txt @@ -0,0 +1,135 @@ +"lang" +{ +"Language" "schinese" +"Tokens" +{ +"Valve_Title" "Valve" +"Valve_Loading" "加载中" +"Valve_Error" "错误" +"Valve_Warning" "警告" +"Valve_Information" "信息" +"Valve_Yes" "是" +"Valve_No" "否" +"Valve_OK" "确定" +"Valve_Cancel" "取消" +"Valve_Apply" "应用" +"Valve_Close" "关闭" +"Valve_Back" "返回" +"Valve_Next" "下一步" +"Valve_Previous" "上一步" +"Valve_Finish" "完成" +"Valve_Retry" "重试" +"Valve_Abort" "中止" +"Valve_Ignore" "忽略" +"Valve_Continue" "继续" +"Valve_Save" "保存" +"Valve_Load" "读取" +"Valve_Delete" "删除" +"Valve_Rename" "重命名" +"Valve_New" "新建" +"Valve_Open" "打开" +"Valve_Exit" "退出" +"Valve_Quit" "退出" +"Valve_Options" "选项" +"Valve_Settings" "设置" +"Valve_Preferences" "偏好设置" +"Valve_Help" "帮助" +"Valve_About" "关于" +"Valve_File" "文件" +"Valve_Edit" "编辑" +"Valve_View" "查看" +"Valve_Tools" "工具" +"Valve_Window" "窗口" +"Valve_Game" "游戏" +"Valve_Server" "服务器" +"Valve_Client" "客户端" +"Valve_Player" "玩家" +"Valve_Map" "地图" +"Valve_Model" "模型" +"Valve_Texture" "纹理" +"Valve_Material" "材质" +"Valve_Sound" "声音" +"Valve_Animation" "动画" +"Valve_Particle" "粒子" +"Valve_Script" "脚本" +"Valve_Console" "控制台" +"Valve_Developer" "开发者" +"Valve_Debug" "调试" +"Valve_Release" "发布" +"Valve_Build" "构建" +"Valve_Version" "版本" +"Valve_Date" "日期" +"Valve_Time" "时间" +"Valve_Name" "名称" +"Valve_Type" "类型" +"Valve_Size" "大小" +"Valve_Path" "路径" +"Valve_Status" "状态" +"Valve_Progress" "进度" +"Valve_Ready" "就绪" +"Valve_Busy" "忙碌" +"Valve_Done" "完成" +"Valve_Failed" "失败" +"Valve_Success" "成功" +"Valve_Canceled" "已取消" +"Valve_Pending" "等待中" +"Valve_Connecting" "连接中" +"Valve_Connected" "已连接" +"Valve_Disconnected" "已断开" +"Valve_Downloading" "下载中" +"Valve_Uploading" "上传中" +"Valve_Installing" "安装中" +"Valve_Uninstalling" "卸载中" +"Valve_Updating" "更新中" +"Valve_Checking" "检查中" +"Valve_Verifying" "验证中" +"Valve_Processing" "处理中" +"Valve_Waiting" "等待中" +"Valve_LoadingResources" "正在加载资源" +"Valve_ParsingMap" "正在解析地图" +"Valve_LoadingTextures" "正在加载纹理" +"Valve_LoadingModels" "正在加载模型" +"Valve_LoadingSounds" "正在加载声音" +"Valve_LoadingMaterials" "正在加载材质" +"Valve_Precaching" "正在预缓存" +"Valve_Initializing" "正在初始化" +"Valve_Starting" "正在启动" +"Valve_Stopping" "正在停止" +"Valve_ShuttingDown" "正在关闭" +"Valve_ConnectedToServer" "已连接到服务器" +"Valve_DisconnectedFromServer" "已从服务器断开" +"Valve_ConnectionFailed" "连接失败" +"Valve_ConnectionTimedOut" "连接超时" +"Valve_ServerFull" "服务器已满" +"Valve_ServerBanned" "您被服务器封禁" +"Valve_InvalidPassword" "密码错误" +"Valve_LoadingScreen" "加载画面" +"Valve_DisconnectReason" "断开原因" +"Valve_PressAnyKey" "按任意键继续" +"Valve_PressStart" "按开始键" +"Valve_Continue" "继续" +"Valve_Skip" "跳过" +"Valve_Replay" "重播" +"Valve_Pause" "暂停" +"Valve_Resume" "恢复" +"Valve_Restart" "重新开始" +"Valve_QuitToMenu" "返回主菜单" +"Valve_QuitToDesktop" "退出到桌面" +"Valve_ChangeLevel" "更换地图" +"Valve_RestartLevel" "重新开始关卡" +"Valve_LoadGame" "读取游戏" +"Valve_SaveGame" "保存游戏" +"Valve_QuickLoad" "快速读取" +"Valve_QuickSave" "快速保存" +"Valve_AutoSave" "自动保存" +"Valve_Checkpoint" "检查点" +"Valve_Saved" "已保存" +"Valve_Loaded" "已读取" +"Valve_FailedToSave" "保存失败" +"Valve_FailedToLoad" "读取失败" +"Valve_NoSaves" "没有存档" +"Valve_CorruptedSave" "存档已损坏" +"Valve_DeleteSaveConfirm" "确定要删除此存档吗?" +"Valve_OverwriteSaveConfirm" "确定要覆盖此存档吗?" +} +} diff --git a/gameui/resource/valve_tchinese.txt b/gameui/resource/valve_tchinese.txt new file mode 100644 index 0000000000..6475fc4dd0 --- /dev/null +++ b/gameui/resource/valve_tchinese.txt @@ -0,0 +1,134 @@ +"lang" +{ +"Language" "tchinese" +"Tokens" +{ +"Valve_Title" "Valve" +"Valve_Loading" "載入中" +"Valve_Error" "錯誤" +"Valve_Warning" "警告" +"Valve_Information" "資訊" +"Valve_Yes" "是" +"Valve_No" "否" +"Valve_OK" "確定" +"Valve_Cancel" "取消" +"Valve_Apply" "套用" +"Valve_Close" "關閉" +"Valve_Back" "返回" +"Valve_Next" "下一步" +"Valve_Previous" "上一步" +"Valve_Finish" "完成" +"Valve_Retry" "重試" +"Valve_Abort" "中止" +"Valve_Ignore" "忽略" +"Valve_Continue" "繼續" +"Valve_Save" "儲存" +"Valve_Load" "讀取" +"Valve_Delete" "刪除" +"Valve_Rename" "重新命名" +"Valve_New" "新增" +"Valve_Open" "開啟" +"Valve_Exit" "結束" +"Valve_Quit" "離開" +"Valve_Options" "選項" +"Valve_Settings" "設定" +"Valve_Preferences" "偏好設定" +"Valve_Help" "說明" +"Valve_About" "關於" +"Valve_File" "檔案" +"Valve_Edit" "編輯" +"Valve_View" "檢視" +"Valve_Tools" "工具" +"Valve_Window" "視窗" +"Valve_Game" "遊戲" +"Valve_Server" "伺服器" +"Valve_Client" "用戶端" +"Valve_Player" "玩家" +"Valve_Map" "地圖" +"Valve_Model" "模型" +"Valve_Texture" "紋理" +"Valve_Material" "材質" +"Valve_Sound" "聲音" +"Valve_Animation" "動畫" +"Valve_Particle" "粒子" +"Valve_Script" "腳本" +"Valve_Console" "控制台" +"Valve_Developer" "開發者" +"Valve_Debug" "偵錯" +"Valve_Release" "發行" +"Valve_Build" "建置" +"Valve_Version" "版本" +"Valve_Date" "日期" +"Valve_Time" "時間" +"Valve_Name" "名稱" +"Valve_Type" "類型" +"Valve_Size" "大小" +"Valve_Path" "路徑" +"Valve_Status" "狀態" +"Valve_Progress" "進度" +"Valve_Ready" "就緒" +"Valve_Busy" "忙碌" +"Valve_Done" "完成" +"Valve_Failed" "失敗" +"Valve_Success" "成功" +"Valve_Canceled" "已取消" +"Valve_Pending" "等待中" +"Valve_Connecting" "連線中" +"Valve_Connected" "已連線" +"Valve_Disconnected" "已中斷" +"Valve_Downloading" "下載中" +"Valve_Uploading" "上傳中" +"Valve_Installing" "安裝中" +"Valve_Uninstalling" "解除安裝中" +"Valve_Updating" "更新中" +"Valve_Checking" "檢查中" +"Valve_Verifying" "驗證中" +"Valve_Processing" "處理中" +"Valve_Waiting" "等待中" +"Valve_LoadingResources" "正在載入資源" +"Valve_ParsingMap" "正在解析地圖" +"Valve_LoadingTextures" "正在載入紋理" +"Valve_LoadingModels" "正在載入模型" +"Valve_LoadingSounds" "正在載入聲音" +"Valve_LoadingMaterials" "正在載入材質" +"Valve_Precaching" "正在預先快取" +"Valve_Initializing" "正在初始化" +"Valve_Starting" "正在啟動" +"Valve_Stopping" "正在停止" +"Valve_ShuttingDown" "正在關閉" +"Valve_ConnectedToServer" "已連線到伺服器" +"Valve_DisconnectedFromServer" "已從伺服器中斷" +"Valve_ConnectionFailed" "連線失敗" +"Valve_ConnectionTimedOut" "連線逾時" +"Valve_ServerFull" "伺服器已滿" +"Valve_ServerBanned" "您被伺服器封鎖" +"Valve_InvalidPassword" "密碼錯誤" +"Valve_LoadingScreen" "載入畫面" +"Valve_DisconnectReason" "中斷原因" +"Valve_PressAnyKey" "按任意鍵繼續" +"Valve_PressStart" "按開始鍵" +"Valve_Skip" "跳過" +"Valve_Replay" "重播" +"Valve_Pause" "暫停" +"Valve_Resume" "恢復" +"Valve_Restart" "重新開始" +"Valve_QuitToMenu" "返回主選單" +"Valve_QuitToDesktop" "離開到桌面" +"Valve_ChangeLevel" "更換地圖" +"Valve_RestartLevel" "重新開始關卡" +"Valve_LoadGame" "讀取遊戲" +"Valve_SaveGame" "儲存遊戲" +"Valve_QuickLoad" "快速讀取" +"Valve_QuickSave" "快速儲存" +"Valve_AutoSave" "自動儲存" +"Valve_Checkpoint" "檢查點" +"Valve_Saved" "已儲存" +"Valve_Loaded" "已讀取" +"Valve_FailedToSave" "儲存失敗" +"Valve_FailedToLoad" "讀取失敗" +"Valve_NoSaves" "沒有存檔" +"Valve_CorruptedSave" "存檔已損毀" +"Valve_DeleteSaveConfirm" "確定要刪除此存檔嗎?" +"Valve_OverwriteSaveConfirm" "確定要覆蓋此存檔嗎?" +} +} diff --git a/gameui/resource/vgui_schinese.txt b/gameui/resource/vgui_schinese.txt new file mode 100644 index 0000000000..4d45d55c5d --- /dev/null +++ b/gameui/resource/vgui_schinese.txt @@ -0,0 +1,177 @@ +"lang" +{ +"Language" "schinese" +"Tokens" +{ +"VGUI_OK" "确定" +"VGUI_Cancel" "取消" +"VGUI_Yes" "是" +"VGUI_No" "否" +"VGUI_Apply" "应用" +"VGUI_Close" "关闭" +"VGUI_Back" "返回" +"VGUI_Next" "下一步" +"VGUI_Previous" "上一步" +"VGUI_Finish" "完成" +"VGUI_Retry" "重试" +"VGUI_Abort" "中止" +"VGUI_Ignore" "忽略" +"VGUI_Continue" "继续" +"VGUI_Save" "保存" +"VGUI_Load" "读取" +"VGUI_Delete" "删除" +"VGUI_Rename" "重命名" +"VGUI_New" "新建" +"VGUI_Open" "打开" +"VGUI_Exit" "退出" +"VGUI_Quit" "退出" +"VGUI_Options" "选项" +"VGUI_Settings" "设置" +"VGUI_Help" "帮助" +"VGUI_About" "关于" +"VGUI_File" "文件" +"VGUI_Edit" "编辑" +"VGUI_View" "查看" +"VGUI_Tools" "工具" +"VGUI_Window" "窗口" +"VGUI_Error" "错误" +"VGUI_Warning" "警告" +"VGUI_Information" "信息" +"VGUI_Question" "询问" +"VGUI_Input" "输入" +"VGUI_Output" "输出" +"VGUI_PleaseWait" "请稍候" +"VGUI_Loading" "加载中" +"VGUI_Processing" "处理中" +"VGUI_Downloading" "下载中" +"VGUI_Uploading" "上传中" +"VGUI_Installing" "安装中" +"VGUI_Updating" "更新中" +"VGUI_Checking" "检查中" +"VGUI_Verifying" "验证中" +"VGUI_Ready" "就绪" +"VGUI_NotReady" "未就绪" +"VGUI_Enabled" "已启用" +"VGUI_Disabled" "已禁用" +"VGUI_On" "开" +"VGUI_Off" "关" +"VGUI_None" "无" +"VGUI_Unknown" "未知" +"VGUI_Default" "默认" +"VGUI_Custom" "自定义" +"VGUI_Advanced" "高级" +"VGUI_Basic" "基本" +"VGUI_General" "常规" +"VGUI_Details" "详情" +"VGUI_Summary" "摘要" +"VGUI_Description" "描述" +"VGUI_Properties" "属性" +"VGUI_Configuration" "配置" +"VGUI_Controls" "控制" +"VGUI_Display" "显示" +"VGUI_Audio" "音频" +"VGUI_Video" "视频" +"VGUI_Network" "网络" +"VGUI_Security" "安全" +"VGUI_Privacy" "隐私" +"VGUI_Account" "账户" +"VGUI_Profile" "个人资料" +"VGUI_Stats" "统计" +"VGUI_Achievements" "成就" +"VGUI_Leaderboard" "排行榜" +"VGUI_Friends" "好友" +"VGUI_Chat" "聊天" +"VGUI_Message" "消息" +"VGUI_Notification" "通知" +"VGUI_Update" "更新" +"VGUI_Upgrade" "升级" +"VGUI_Downgrade" "降级" +"VGUI_Install" "安装" +"VGUI_Uninstall" "卸载" +"VGUI_Repair" "修复" +"VGUI_Verify" "验证" +"VGUI_Backup" "备份" +"VGUI_Restore" "还原" +"VGUI_Import" "导入" +"VGUI_Export" "导出" +"VGUI_Copy" "复制" +"VGUI_Cut" "剪切" +"VGUI_Paste" "粘贴" +"VGUI_SelectAll" "全选" +"VGUI_DeselectAll" "取消全选" +"VGUI_Find" "查找" +"VGUI_Replace" "替换" +"VGUI_Undo" "撤销" +"VGUI_Redo" "重做" +"VGUI_Add" "添加" +"VGUI_Insert" "插入" +"VGUI_Move" "移动" +"VGUI_Expand" "展开" +"VGUI_Collapse" "折叠" +"VGUI_ZoomIn" "放大" +"VGUI_ZoomOut" "缩小" +"VGUI_FitToScreen" "适应屏幕" +"VGUI_ActualSize" "实际大小" +"VGUI_Fullscreen" "全屏" +"VGUI_Windowed" "窗口化" +"VGUI_Minimize" "最小化" +"VGUI_Maximize" "最大化" +"VGUI_Restore" "还原" +"VGUI_Cut" "剪切" +"VGUI_Copy" "复制" +"VGUI_Paste" "粘贴" +"VGUI_Delete" "删除" +"VGUI_Remove" "移除" +"VGUI_Color" "颜色" +"VGUI_Font" "字体" +"VGUI_Size" "大小" +"VGUI_Position" "位置" +"VGUI_Alignment" "对齐" +"VGUI_Left" "左" +"VGUI_Right" "右" +"VGUI_Center" "居中" +"VGUI_Top" "顶部" +"VGUI_Bottom" "底部" +"VGUI_Middle" "中间" +"VGUI_Width" "宽度" +"VGUI_Height" "高度" +"VGUI_Opacity" "不透明度" +"VGUI_Transparency" "透明度" +"VGUI_Visible" "可见" +"VGUI_Hidden" "隐藏" +"VGUI_Enabled" "启用" +"VGUI_Disabled" "禁用" +"VGUI_ReadOnly" "只读" +"VGUI_Writeable" "可写" +"VGUI_Editable" "可编辑" +"VGUI_Selectable" "可选" +"VGUI_Checkable" "可勾选" +"VGUI_Checked" "已勾选" +"VGUI_Unchecked" "未勾选" +"VGUI_Indeterminate" "不确定" +"VGUI_Expanded" "已展开" +"VGUI_Collapsed" "已折叠" +"VGUI_Selected" "已选中" +"VGUI_Unselected" "未选中" +"VGUI_Active" "活动" +"VGUI_Inactive" "非活动" +"VGUI_Focused" "已聚焦" +"VGUI_Unfocused" "未聚焦" +"VGUI_Hover" "悬停" +"VGUI_Pressed" "已按下" +"VGUI_Released" "已释放" +"VGUI_Clicked" "已点击" +"VGUI_DoubleClicked" "已双击" +"VGUI_RightClicked" "已右键点击" +"VGUI_MiddleClicked" "已中键点击" +"VGUI_Dragged" "已拖动" +"VGUI_Dropped" "已放下" +"VGUI_Scrolled" "已滚动" +"VGUI_Resized" "已调整大小" +"VGUI_Moved" "已移动" +"VGUI_Shown" "已显示" +"VGUI_Hidden" "已隐藏" +"VGUI_Enabled" "已启用" +"VGUI_Disabled" "已禁用" +} +} diff --git a/gameui/resource/vgui_tchinese.txt b/gameui/resource/vgui_tchinese.txt new file mode 100644 index 0000000000..6ba637c48a --- /dev/null +++ b/gameui/resource/vgui_tchinese.txt @@ -0,0 +1,168 @@ +"lang" +{ +"Language" "tchinese" +"Tokens" +{ +"VGUI_OK" "確定" +"VGUI_Cancel" "取消" +"VGUI_Yes" "是" +"VGUI_No" "否" +"VGUI_Apply" "套用" +"VGUI_Close" "關閉" +"VGUI_Back" "返回" +"VGUI_Next" "下一步" +"VGUI_Previous" "上一步" +"VGUI_Finish" "完成" +"VGUI_Retry" "重試" +"VGUI_Abort" "中止" +"VGUI_Ignore" "忽略" +"VGUI_Continue" "繼續" +"VGUI_Save" "儲存" +"VGUI_Load" "讀取" +"VGUI_Delete" "刪除" +"VGUI_Rename" "重新命名" +"VGUI_New" "新增" +"VGUI_Open" "開啟" +"VGUI_Exit" "結束" +"VGUI_Quit" "離開" +"VGUI_Options" "選項" +"VGUI_Settings" "設定" +"VGUI_Help" "說明" +"VGUI_About" "關於" +"VGUI_File" "檔案" +"VGUI_Edit" "編輯" +"VGUI_View" "檢視" +"VGUI_Tools" "工具" +"VGUI_Window" "視窗" +"VGUI_Error" "錯誤" +"VGUI_Warning" "警告" +"VGUI_Information" "資訊" +"VGUI_Question" "詢問" +"VGUI_Input" "輸入" +"VGUI_Output" "輸出" +"VGUI_PleaseWait" "請稍候" +"VGUI_Loading" "載入中" +"VGUI_Processing" "處理中" +"VGUI_Downloading" "下載中" +"VGUI_Uploading" "上傳中" +"VGUI_Installing" "安裝中" +"VGUI_Updating" "更新中" +"VGUI_Checking" "檢查中" +"VGUI_Verifying" "驗證中" +"VGUI_Ready" "就緒" +"VGUI_NotReady" "未就緒" +"VGUI_Enabled" "已啟用" +"VGUI_Disabled" "已停用" +"VGUI_On" "開" +"VGUI_Off" "關" +"VGUI_None" "無" +"VGUI_Unknown" "未知" +"VGUI_Default" "預設" +"VGUI_Custom" "自訂" +"VGUI_Advanced" "進階" +"VGUI_Basic" "基本" +"VGUI_General" "一般" +"VGUI_Details" "詳細資料" +"VGUI_Summary" "摘要" +"VGUI_Description" "描述" +"VGUI_Properties" "屬性" +"VGUI_Configuration" "組態" +"VGUI_Controls" "控制" +"VGUI_Display" "顯示" +"VGUI_Audio" "音訊" +"VGUI_Video" "影片" +"VGUI_Network" "網路" +"VGUI_Security" "安全性" +"VGUI_Privacy" "隱私權" +"VGUI_Account" "帳戶" +"VGUI_Profile" "個人檔案" +"VGUI_Stats" "統計" +"VGUI_Achievements" "成就" +"VGUI_Leaderboard" "排行榜" +"VGUI_Friends" "好友" +"VGUI_Chat" "聊天" +"VGUI_Message" "訊息" +"VGUI_Notification" "通知" +"VGUI_Update" "更新" +"VGUI_Upgrade" "升級" +"VGUI_Downgrade" "降級" +"VGUI_Install" "安裝" +"VGUI_Uninstall" "解除安裝" +"VGUI_Repair" "修復" +"VGUI_Verify" "驗證" +"VGUI_Backup" "備份" +"VGUI_Restore" "還原" +"VGUI_Import" "匯入" +"VGUI_Export" "匯出" +"VGUI_Copy" "複製" +"VGUI_Cut" "剪下" +"VGUI_Paste" "貼上" +"VGUI_SelectAll" "全選" +"VGUI_DeselectAll" "取消全選" +"VGUI_Find" "尋找" +"VGUI_Replace" "取代" +"VGUI_Undo" "復原" +"VGUI_Redo" "重做" +"VGUI_Add" "新增" +"VGUI_Insert" "插入" +"VGUI_Move" "移動" +"VGUI_Expand" "展開" +"VGUI_Collapse" "摺疊" +"VGUI_ZoomIn" "放大" +"VGUI_ZoomOut" "縮小" +"VGUI_FitToScreen" "符合螢幕" +"VGUI_ActualSize" "實際大小" +"VGUI_Fullscreen" "全螢幕" +"VGUI_Windowed" "視窗化" +"VGUI_Minimize" "最小化" +"VGUI_Maximize" "最大化" +"VGUI_Restore" "還原" +"VGUI_Remove" "移除" +"VGUI_Color" "顏色" +"VGUI_Font" "字型" +"VGUI_Size" "大小" +"VGUI_Position" "位置" +"VGUI_Alignment" "對齊" +"VGUI_Left" "左" +"VGUI_Right" "右" +"VGUI_Center" "置中" +"VGUI_Top" "頂部" +"VGUI_Bottom" "底部" +"VGUI_Middle" "中間" +"VGUI_Width" "寬度" +"VGUI_Height" "高度" +"VGUI_Opacity" "不透明度" +"VGUI_Transparency" "透明度" +"VGUI_Visible" "可見" +"VGUI_Hidden" "隱藏" +"VGUI_ReadOnly" "唯讀" +"VGUI_Writeable" "可寫入" +"VGUI_Editable" "可編輯" +"VGUI_Selectable" "可選取" +"VGUI_Checkable" "可勾選" +"VGUI_Checked" "已勾選" +"VGUI_Unchecked" "未勾選" +"VGUI_Indeterminate" "不確定" +"VGUI_Expanded" "已展開" +"VGUI_Collapsed" "已摺疊" +"VGUI_Selected" "已選取" +"VGUI_Unselected" "未選取" +"VGUI_Active" "作用中" +"VGUI_Inactive" "非作用中" +"VGUI_Focused" "已取得焦點" +"VGUI_Unfocused" "未取得焦點" +"VGUI_Hover" "暫留" +"VGUI_Pressed" "已按下" +"VGUI_Released" "已放開" +"VGUI_Clicked" "已點擊" +"VGUI_DoubleClicked" "已雙擊" +"VGUI_RightClicked" "已右鍵點擊" +"VGUI_MiddleClicked" "已中鍵點擊" +"VGUI_Dragged" "已拖曳" +"VGUI_Dropped" "已放下" +"VGUI_Scrolled" "已捲動" +"VGUI_Resized" "已調整大小" +"VGUI_Moved" "已移動" +"VGUI_Shown" "已顯示" +} +} diff --git a/gameui/wscript b/gameui/wscript index 2cbbe18055..b33b54076a 100755 --- a/gameui/wscript +++ b/gameui/wscript @@ -89,6 +89,7 @@ def build(bld): 'OptionsSubKeyboard.cpp', 'OptionsSubMouse.cpp', 'OptionsSubTouch.cpp', + 'OptionsSubLanguage.cpp', 'OptionsSubMultiplayer.cpp', 'OptionsSubPortal.cpp', 'OptionsSubVideo.cpp', diff --git a/launcher/android/main.cpp b/launcher/android/main.cpp index 10133e836c..2ed6c0f4b1 100644 --- a/launcher/android/main.cpp +++ b/launcher/android/main.cpp @@ -19,6 +19,8 @@ GNU General Public License for more details. #include #include #include +#include +#include #include #include "tier0/dbg.h" #include "tier0/threadtools.h" @@ -32,8 +34,13 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ); // from launcher.cpp DLL_EXPORT int Java_com_valvesoftware_ValveActivity2_setenv(JNIEnv *jenv, jclass *jclass, jstring env, jstring value, jint over) { - Msg( "Java_com_valvesoftware_ValveActivity2_setenv %s=%s\n", jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL) ); - return setenv( jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL), over ); + const char *envStr = jenv->GetStringUTFChars(env, NULL); + const char *valueStr = jenv->GetStringUTFChars(value, NULL); + Msg( "Java_com_valvesoftware_ValveActivity2_setenv %s=%s\n", envStr, valueStr ); + int result = setenv( envStr, valueStr, over ); + jenv->ReleaseStringUTFChars(env, envStr); + jenv->ReleaseStringUTFChars(value, valueStr); + return result; } DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_nativeOnActivityResult() @@ -43,7 +50,10 @@ DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_nativeOnActivityResult() DLL_EXPORT void Java_com_valvesoftware_ValveActivity2_setArgs(JNIEnv *env, jclass *clazz, jstring str) { - strncpy( java_args, env->GetStringUTFChars(str, NULL), sizeof java_args ); + const char *strValue = env->GetStringUTFChars(str, NULL); + strncpy( java_args, strValue, sizeof(java_args) - 1 ); + java_args[sizeof(java_args) - 1] = '\0'; + env->ReleaseStringUTFChars(str, strValue); } void SetLauncherArgs() @@ -77,43 +87,46 @@ void SetLauncherArgs() float GetTotalMemory() { - int64_t mem = 0; - - char meminfo[8196] = { 0 }; - FILE *f = fopen("/proc/meminfo", "r"); - if( !f ) - return 0.f; - - size_t size = fread(meminfo, 1, sizeof(meminfo), f); - if( !size ) + struct sysinfo info; + if( sysinfo(&info) != 0 ) return 0.f; - - char *s = strstr(meminfo, "MemTotal:"); - - if( !s ) return 0.f; - - sscanf(s+9, "%lld", &mem); - fclose(f); - - return mem/1024/1024.f; + return (float)info.totalram * info.mem_unit / 1024.f / 1024.f; } void android_property_print(const char *name) { - char prop[1024]; + char strValue[PROP_VALUE_MAX]; + memset(strValue, 0, sizeof(strValue)); + __system_property_get(name, strValue); + Msg("prop %s=%s\n", name, strValue); +} - char strValue[64]; - memset (strValue, 0, 64); - snprintf(prop, sizeof(prop), "getprop %s", name); - FILE *fp = NULL; - fp = popen(prop, "r"); - if (!fp) return; +// Detect the system locale and set the LANG environment variable +// so the engine can pick the correct language automatically. +void DetectSystemLanguage() +{ + char locale[PROP_VALUE_MAX]; + memset(locale, 0, sizeof(locale)); - fgets(strValue, sizeof(strValue), fp); - pclose(fp); - fp = NULL; + // Android 7.0+ (API 24) uses persist.sys.locale + if( __system_property_get("persist.sys.locale", locale) <= 0 ) + { + // Fallback for older devices + __system_property_get("ro.product.locale", locale); + } - Msg("prop %s=%s", name, strValue); + if( locale[0] ) + { + Msg( "Detected system locale: %s\n", locale ); + // The engine's PchLanguageICUCodeToELanguage expects codes like "zh_CN", "zh_TW", "en_US" + // Android uses "zh-CN", "zh-TW", "en-US" format, convert hyphen to underscore + for( char *p = locale; *p; ++p ) + { + if( *p == '-' ) + *p = '_'; + } + setenv("LANG", locale, 1); + } } @@ -129,6 +142,9 @@ DLL_EXPORT int LauncherMainAndroid( int argc, char **argv ) android_property_print("ro.product.model"); android_property_print("ro.product.name"); + // Detect system language so the engine uses the correct localization + DetectSystemLanguage(); + SetLauncherArgs(); SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); diff --git a/vgui2/vgui_surfacelib/linuxfont.cpp b/vgui2/vgui_surfacelib/linuxfont.cpp index 0470371864..14d635bba4 100644 --- a/vgui2/vgui_surfacelib/linuxfont.cpp +++ b/vgui2/vgui_surfacelib/linuxfont.cpp @@ -408,7 +408,7 @@ bool CLinuxFont::CreateFromMemory(const char *windowsFontName, void *data, int d } #include "tier1/convar.h" -ConVar cl_language( "cl_language", "english", FCVAR_USERINFO, "Language (from HKCU\\Software\\Valve\\Steam\\Language)" ); +ConVar cl_language( "cl_language", "english", FCVAR_USERINFO | FCVAR_ARCHIVE, "Language (from HKCU\\Software\\Valve\\Steam\\Language)" ); #if !HAVE_FC char *TryFindFont(const char *winFontName, bool bBold, int italic)