多语言设置界面逻辑

This commit is contained in:
bob
2025-06-12 16:18:55 +08:00
parent 15eaa0e666
commit 07e7715be8
20 changed files with 212 additions and 111 deletions

View File

@@ -53,12 +53,11 @@ namespace NBF.Setting
public ISettings Root { get; private set; }
public void Initialize(ISettings root)
{
Root = root;
OnInitialize();
Load();
OnInitialize();
Apply();
}

View File

@@ -3,21 +3,10 @@ using UnityEngine;
namespace NBF.Setting
{
public enum SettingLanguage
{
English = 10,
French = 14,
Japanese = 22,
Korean = 23,
Russian = 30,
ChineseSimplified = 40,
ChineseTraditional = 41,
}
[Sort(100)]
public class LanguageSetting : MultiOption<SettingLanguage>
public class LanguageSetting : MultiOption<int>
{
private SettingLanguage _defaultLanguage;
private int _defaultLanguage;
public override string Name => "Language";
public override string Group => SettingsDef.Group.Language;
@@ -27,11 +16,38 @@ namespace NBF.Setting
protected override void OnInitialize()
{
_defaultLanguage = (SettingLanguage)Application.systemLanguage;
var list = LanguageConst.LanguageList;
var systemLanguage = Application.systemLanguage;
var systemIndex = list.FindIndex(t => t.Language == systemLanguage);
if (systemIndex < 0)
{
systemIndex = 0;
}
_defaultLanguage = (int)Lan.Inst.GetCurrentLanguage();
for (int i = 0; i < list.Count; i++)
{
var lang = list[i];
AddOption(lang.Name, i);
}
_defaultLanguage = systemIndex;
var current = GetValue();
if (current < 0 || current >= LanguageConst.LanguageList.Count)
{
SetValue(_defaultLanguage);
}
}
protected override void OnApply()
{
var lang = LanguageConst.LanguageList[GetValue()];
Lan.Inst.UseLanguage(lang.Language);
}
// public override string GetDisplayString()
// {
// return ((SystemLanguage)GetValue()).ToString();
// }
}
}

View File

@@ -16,83 +16,42 @@ namespace NBC
//简体中文、繁体中文、英语、日语、韩语、泰语、越南语、法语、德语、葡萄牙与、西班牙语、俄语、波兰语、荷兰语、
//土耳其语、意大利语、印度尼西亚语
public static readonly List<LanguageInfo> LanguageList = new List<LanguageInfo>()
{
new LanguageInfo() { Language = SystemLanguage.English, Name = "English", Code = "en" },
new LanguageInfo() { Language = SystemLanguage.ChineseSimplified, Name = "简体中文", Code = "zh-CN" },
// new LanguageInfo() { Language = SystemLanguage.ChineseTraditional, Name = "繁體中文", Code = "zh-TW" },
// new LanguageInfo() { Language = SystemLanguage.Japanese, Name = "日本語", Code = "ja" },
// new LanguageInfo() { Language = SystemLanguage.Korean, Name = "한국어", Code = "ko" },
// new LanguageInfo() { Language = SystemLanguage.Thai, Name = "ไทย", Code = "th" },
// new LanguageInfo() { Language = SystemLanguage.Vietnamese, Name = "Tiếng Việt", Code = "vi" },
// new LanguageInfo() { Language = SystemLanguage.German, Name = "Deutsch", Code = "de" },
// new LanguageInfo() { Language = SystemLanguage.French, Name = "Français", Code = "fr" },
// new LanguageInfo() { Language = SystemLanguage.Russian, Name = "Русский", Code = "ru" },
// new LanguageInfo() { Language = SystemLanguage.Spanish, Name = "Español", Code = "es" },
// new LanguageInfo() { Language = SystemLanguage.Portuguese, Name = "Português", Code = "pt" },
// new LanguageInfo() { Language = SystemLanguage.Polish, Name = "Polski", Code = "pl" },
// new LanguageInfo() { Language = SystemLanguage.Dutch, Name = "Nederlands", Code = "nl" },
// new LanguageInfo() { Language = SystemLanguage.Turkish, Name = "Türkçe", Code = "tr" },
// new LanguageInfo() { Language = SystemLanguage.Indonesian, Name = "Bahasa Indonesia", Code = "id" },
// new LanguageInfo() { Language = SystemLanguage.Italian, Name = "Italiano", Code = "it" }
};
/// <summary>
/// 自定义语言和名字映射关系
/// </summary>
public static readonly Dictionary<SystemLanguage, LanguageInfo> languageMap =
new Dictionary<SystemLanguage, LanguageInfo>()
new Dictionary<SystemLanguage, LanguageInfo>();
static LanguageConst()
{
languageMap.Clear();
foreach (var languageInfo in LanguageList)
{
{
SystemLanguage.English,
new LanguageInfo() { Language = SystemLanguage.English, Name = "English", Code = "en" }
},
{
SystemLanguage.ChineseSimplified,
new LanguageInfo() { Language = SystemLanguage.ChineseSimplified, Name = "简体中文", Code = "zh-CN" }
},
// {
// SystemLanguage.ChineseTraditional,
// new LanguageInfo() { Language = SystemLanguage.ChineseTraditional, Name = "繁體中文", Code = "zh-TW" }
// },
// {
// SystemLanguage.Japanese,
// new LanguageInfo() { Language = SystemLanguage.Japanese, Name = "日本語", Code = "ja" }
// },
// {
// SystemLanguage.Korean,
// new LanguageInfo() { Language = SystemLanguage.Korean, Name = "한국어", Code = "ko" }
// },
// {
// SystemLanguage.Thai,
// new LanguageInfo() { Language = SystemLanguage.Thai, Name = "ไทย", Code = "th" }
// },
// {
// SystemLanguage.Vietnamese,
// new LanguageInfo() { Language = SystemLanguage.Vietnamese, Name = "Tiếng Việt", Code = "vi" }
// },
// {
// SystemLanguage.German,
// new LanguageInfo() { Language = SystemLanguage.German, Name = "Deutsch", Code = "de" }
// },
// {
// SystemLanguage.French,
// new LanguageInfo() { Language = SystemLanguage.French, Name = "Français", Code = "fr" }
// },
// {
// SystemLanguage.Russian,
// new LanguageInfo() { Language = SystemLanguage.Russian, Name = "Русский", Code = "ru" }
// },
// {
// SystemLanguage.Spanish,
// new LanguageInfo() { Language = SystemLanguage.Spanish, Name = "Español", Code = "es" }
// },
// {
// SystemLanguage.Portuguese,
// new LanguageInfo() { Language = SystemLanguage.Portuguese, Name = "Português", Code = "pt" }
// },
// {
// SystemLanguage.Polish,
// new LanguageInfo() { Language = SystemLanguage.Polish, Name = "Polski", Code = "pl" }
// },
// {
// SystemLanguage.Dutch,
// new LanguageInfo() { Language = SystemLanguage.Dutch, Name = "Nederlands", Code = "nl" }
// },
// {
// SystemLanguage.Turkish,
// new LanguageInfo() { Language = SystemLanguage.Turkish, Name = "Türkçe", Code = "tr" }
// },
// {
// SystemLanguage.Indonesian,
// new LanguageInfo() { Language = SystemLanguage.Indonesian, Name = "Bahasa Indonesia", Code = "id" }
// },
// {
// SystemLanguage.Italian,
// new LanguageInfo() { Language = SystemLanguage.Italian, Name = "Italiano", Code = "it" }
// },
};
languageMap.Add(languageInfo.Language, languageInfo);
}
}
}
}

View File

@@ -61,8 +61,8 @@ namespace NBF
private void Init()
{
InitService();
InitLanguage();
InitService();
InitUI();
}
@@ -70,6 +70,7 @@ namespace NBF
private void InitLanguage()
{
// var map = LanguageConst.languageMap;
Lan.Inst.AddLanguageModule((int)LanguageModuleType.Text, new LanguageText());
Lan.Inst.AddLanguageModule((int)LanguageModuleType.Image, new LanguageImage());
Lan.Inst.AddLanguageModule((int)LanguageModuleType.Font, new LanguageFont());
@@ -80,7 +81,7 @@ namespace NBF
}
UI.Inst.SetUILanguage<UILangeageConfig>();
Lan.Inst.AutoUseLanguage();
// Lan.Inst.AutoUseLanguage();
}
#endregion

View File

@@ -8,6 +8,7 @@ namespace NBF
{
public static void BindAll()
{
UIObjectFactory.SetPackageItemExtension(SelectPages.URL, typeof(SelectPages));
UIObjectFactory.SetPackageItemExtension(BottomMenu.URL, typeof(BottomMenu));
UIObjectFactory.SetPackageItemExtension(ClassifyList.URL, typeof(ClassifyList));
UIObjectFactory.SetPackageItemExtension(CommonMenu.URL, typeof(CommonMenu));

View File

@@ -0,0 +1,25 @@
/**本脚本为自动生成每次生成会覆盖请勿手动修改生成插件文档及项目地址https://git.whoot.com/whoot-games/whoot.fguieditorplugin**/
using FairyGUI;
using FairyGUI.Utils;
using NBC;
namespace NBF
{
public partial class SelectPages
{
public const string URL = "ui://6hgkvlau5dtx1a";
public GList List;
public override void ConstructFromXML(XML xml)
{
base.ConstructFromXML(xml);
List = (GList)GetChild("List");
OnInited();
UILanguage.TrySetComponentLanguage(this);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8e05d47a4fe9d174db57d8e523b1d53b

View File

@@ -0,0 +1,36 @@
// 本脚本只在不存在时会生成一次。组件逻辑写在当前脚本内。已存在不会再次生成覆盖
using UnityEngine;
using FairyGUI;
using NBC;
namespace NBF
{
public partial class SelectPages : GComponent
{
public int TotalPages { get; private set; }
public int CurrentPage { get; private set; }
private void OnInited()
{
}
public void SetTotal(int totalPage)
{
TotalPages = totalPage;
List.RemoveChildrenToPool();
for (var i = 0; i < totalPage; i++)
{
List.AddItemFromPool();
}
}
public void SetCurrent(int currentPage)
{
if (currentPage < 0 || currentPage >= TotalPages) return;
CurrentPage = currentPage;
List.selectedIndex = CurrentPage;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 405973384bfed8e409a629849e3cef2e

View File

@@ -19,6 +19,7 @@ namespace NBF
public BtnInputControl BtnPrev;
public BtnInputControl BtnNext;
public GTextField TextSliderValue;
public SelectPages Pages;
public override void ConstructFromXML(XML xml)
{
@@ -32,6 +33,7 @@ namespace NBF
BtnPrev = (BtnInputControl)GetChild("BtnPrev");
BtnNext = (BtnInputControl)GetChild("BtnNext");
TextSliderValue = (GTextField)GetChild("TextSliderValue");
Pages = (SelectPages)GetChild("Pages");
OnInited();
UILanguage.TrySetComponentLanguage(this);
}

View File

@@ -135,6 +135,7 @@ namespace NBF
private void UpdateValueText()
{
Pages.visible = false;
if (Option is RangeOption range)
{
Slider.value = range.GetValue();
@@ -143,6 +144,14 @@ namespace NBF
else if (Option is IMultiOption multiOption)
{
TextInfo.text = multiOption.GetDisplayString();
Pages.visible = true;
var count = multiOption.GetOptionNames().Count;
if (Pages.TotalPages != count)
{
Pages.SetTotal(count);
}
Pages.SetCurrent(multiOption.GetValue());
}
}
}

View File

@@ -17,6 +17,8 @@ namespace NBF
private readonly List<TabListData> tabList = new List<TabListData>();
private string _currentTab = "";
private List<int> _canSelectIndex = new List<int>();
private int _nowSelectIndex = -1;
protected override void OnInit()
{
@@ -60,7 +62,7 @@ namespace NBF
private void ResetSettingList()
{
// TextTitle.text = Lan.Get(_currentGroup);
_nowSelectIndex = -1;
List.RemoveChildrenToPool();
if (string.IsNullOrEmpty(_currentTab)) return;
var options = Settings.Instance.GetOptionsByTab(_currentTab);
@@ -76,6 +78,7 @@ namespace NBF
list.Add(option);
}
_canSelectIndex.Clear();
var url = UIPackage.GetItemURL(UIPackName, "SettingSubTitleItem");
foreach (var key in groupOptions.Keys)
{
@@ -90,6 +93,8 @@ namespace NBF
if (List.AddItemFromPool() is SettingItem item)
{
item.SetData(option);
var index = List.GetChildIndex(item);
_canSelectIndex.Add(index);
}
}
}
@@ -138,18 +143,11 @@ namespace NBF
}
else if (action == InputDef.UI.Up)
{
SetListSelected(List.selectedIndex - 1);
ChangeListSelected();
}
else if (action == InputDef.UI.Down)
{
if (List.selectedIndex < 0)
{
SetListSelected(0);
}
else
{
SetListSelected(List.selectedIndex + 1);
}
ChangeListSelected(false);
}
else if (action == InputDef.UI.Back)
{
@@ -161,6 +159,24 @@ namespace NBF
}
}
private void ChangeListSelected(bool up = true)
{
if (!up)
{
_nowSelectIndex++;
}
else
{
_nowSelectIndex--;
}
if (_nowSelectIndex < 0) _nowSelectIndex = 0;
else if (_nowSelectIndex >= _canSelectIndex.Count) _nowSelectIndex = _canSelectIndex.Count - 1;
var targetIndex = _canSelectIndex[_nowSelectIndex];
SetListSelected(targetIndex);
}
private void SetListSelected(int selectedIndex)
{
if (selectedIndex >= 0 && selectedIndex < List.numItems)

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="4,4" extention="Button">
<controller name="button" pages="2,up,3,down" selected="1"/>
<displayList>
<image id="n14_5dtx" name="n14" src="kryob" fileName="Images/Square.png" xy="0,0" color="#8bf3ff">
<gearColor controller="button" pages="3" values="#8bf3ff" default="#d8fbff"/>
</image>
</displayList>
<Button mode="Radio"/>
</component>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="60,4">
<displayList>
<list id="n15_5dtx" name="List" xy="0,0" size="60,4" layout="row" colGap="4" defaultItem="ui://6hgkvlau5dtx19" align="center" autoClearItems="true">
<relation target="" sidePair="width-width,height-height"/>
<item/>
<item/>
<item/>
<item/>
<item/>
<item/>
<item/>
<item/>
</list>
</displayList>
</component>

View File

@@ -218,6 +218,8 @@
<image id="8hy8m5" name="ControllerArrows.png" path="/Icon/控制图标/" exported="true"/>
<image id="8hy8m6" name="ControllerX.png" path="/Icon/控制图标/" exported="true"/>
<image id="8hy8m7" name="ControllerY.png" path="/Icon/控制图标/" exported="true"/>
<component id="5dtx19" name="SelectPageItem.xml" path="/Com/"/>
<component id="5dtx1a" name="SelectPages.xml" path="/Com/" exported="true"/>
</resources>
<publish name="" path="../Assets/Resources/Fgui/Common" packageCount="2" genCode="true"/>
</packageDescription>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<component size="874,70" extention="Button">
<controller name="style" pages="0,文本,1,进度条,6,键鼠输入,7,手柄输入" selected="2"/>
<controller name="button" pages="2,up,3,down,4,over,5,selectedOver" selected="1"/>
<controller name="style" pages="0,文本,1,进度条,6,键鼠输入,7,手柄输入" selected="0"/>
<controller name="button" pages="2,up,3,down,4,over,5,selectedOver" selected="0"/>
<displayList>
<image id="n5_e9z8" name="back" src="kryob" fileName="Images/Square.png" pkg="6hgkvlau" xy="0,0" size="868,70" alpha="0.5" color="#5c748b">
<image id="n5_e9z8" name="back" src="kryob" fileName="Images/Square.png" pkg="6hgkvlau" xy="0,0" size="868,70" alpha="0.2" color="#5c748b">
<gearLook controller="button" pages="3,5" values="0.5,0,0,0|0.5,0,0,0" default="0.2,0,0,0"/>
<gearColor controller="button" pages="2,4" values="#5c748b|#8bf3ff" default="#5c748b"/>
<relation target="" sidePair="width-width,height-height"/>
@@ -32,6 +32,10 @@
<gearDisplay controller="style" pages="1"/>
<relation target="n9_e9z8" sidePair="middle-middle,left-right"/>
</text>
<component id="n15_5dtx" name="Pages" src="5dtx1a" fileName="Com/SelectPages.xml" pkg="6hgkvlau" xy="620,58" size="130,4" visible="false">
<gearDisplay controller="style" pages=""/>
<relation target="n7_e9z8" sidePair="center-center,bottom-bottom"/>
</component>
</displayList>
<Button mode="Radio"/>
</component>

View File

@@ -0,0 +1 @@
{"url":"ui://6hgkvlau5dtx1a","name":"SelectPages","scriptType":"component","isCustomName":false,"customName":"","annotation":"","member":{}}

View File

@@ -9,31 +9,31 @@ EditorUserSettings:
value: 18134705175a055722080a3115371d4a0d55006876786860616b0471b8b07a68ffab74f9ee2a3a30300cea1a11320d0beb1a0c25f7060f494b4cc80018eb09361fc211cb1f862d19c51d19dcc413d6ade0d8ddfcddf9f4d9d29195fcfde6ebeae6f0a9c9afa6f8c5b89ff7a1aacececac4eba4d7c9d28bda
flags: 0
RecentlyUsedSceneGuid-0:
value: 5303020755510a0f5e085c2744775a40454e1a2f282b72632f284d61e1e5673d
value: 025005075d000f0c095c0f7145730b4447161e2c787923327a7c4965e0b66669
flags: 0
RecentlyUsedSceneGuid-1:
value: 52530c5601535f020f565a2043770d1612154d2f747975692c7b4e66b5e3303b
value: 55545602010350590b0d5d20162708444f4e1e7e2a7d74602c2c4e6ab3b1306f
flags: 0
RecentlyUsedSceneGuid-2:
value: 0154065050055b0a5f585a7740705d444f4f4879747f7e3174704d66e3b5636f
value: 5b000052510d5b0a5b565a2344770b444e4e1d7c79797f622b7b1c35b3e2606a
flags: 0
RecentlyUsedSceneGuid-3:
value: 065006565505590b0b0f5e7240730f4046154a7a7c7876607f2b4f63b2b06468
value: 5309000306505b0d0b565f20427a5e44104e1d2c2a7f7467287c4d64b0b66469
flags: 0
RecentlyUsedSceneGuid-4:
value: 025002565403500e5b5b55724321064445161a7b7b7c22367a7e4467b4b76160
value: 065006565505590b0b0f5e7240730f4046154a7a7c7876607f2b4f63b2b06468
flags: 0
RecentlyUsedSceneGuid-5:
value: 5002040357510f020f0a54261227084414161e7a7f7b76332c7b4532e3b66769
value: 5303020755510a0f5e085c2744775a40454e1a2f282b72632f284d61e1e5673d
flags: 0
RecentlyUsedSceneGuid-6:
value: 57085255030d5d0e540c0e7340750f44174f4a2c2a7d70357b2c4b62bbb9353d
value: 52530c5601535f020f565a2043770d1612154d2f747975692c7b4e66b5e3303b
flags: 0
RecentlyUsedSceneGuid-7:
value: 5107035303565c0d5b5b592416760d4417164a7c2e2b2067747b4830b2b8653d
value: 025002565403500e5b5b55724321064445161a7b7b7c22367a7e4467b4b76160
flags: 0
RecentlyUsedSceneGuid-8:
value: 5a04505e56055903545e5b2347700844124f1b2b797c73327d2a4f63b4e5306c
value: 05070d5f50535d5e0c0c5472427008444e4e1b2f7a7170622e784e37bab3636a
flags: 0
RecentlyUsedSceneGuid-9:
value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e