Skip to content

Commit 844f251

Browse files
committed
come back to this later
1 parent 2e49980 commit 844f251

35 files changed

Lines changed: 57131 additions & 13529 deletions

Basis/Assets/AddressableAssetsData/link.xml

Lines changed: 393 additions & 0 deletions
Large diffs are not rendered by default.

Basis/Assets/AddressableAssetsData/link.xml.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Basis/Assets/StreamingAssets/Basis/Languages/en.json

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,29 @@
735735
{ "key": "menu.individualPlayer.perfFilter.bypassedDescription", "value": "Bypassed for this player — performance limits ignored until you toggle off or reconnect." },
736736
{ "key": "menu.individualPlayer.perfFilter.blockedPrefix", "value": "Avatar blocked: " },
737737
{ "key": "menu.individualPlayer.perfFilter.trimmedPrefix", "value": "Trimmed by performance filter: " },
738-
{ "key": "menu.individualPlayer.perfFilter.bypassToggle", "value": "Bypass Limits For This Player" }
738+
{ "key": "menu.individualPlayer.perfFilter.bypassToggle", "value": "Bypass Limits For This Player" },
739+
740+
{ "key": "settings.tab.translation", "value": "Translation" },
741+
{ "key": "settings.translation.title", "value": "Real-Time Translation" },
742+
{ "key": "settings.translation.master.title", "value": "Translation" },
743+
{ "key": "settings.translation.master.description", "value": "Translate incoming chat and voice to your language. Fully on-machine — no internet, no cloud, no API keys." },
744+
{ "key": "settings.translation.enabled", "value": "Enable Translation" },
745+
746+
{ "key": "settings.translation.whisper.title", "value": "Speech-to-Text (whisper.cpp)" },
747+
{ "key": "settings.translation.whisper.description", "value": "Local speech recognition via whisper.cpp. Place whisper.dll in Plugins folder. Download a GGML model from huggingface.co/ggerganov/whisper.cpp (ggml-base.bin recommended)." },
748+
{ "key": "settings.translation.whisper.modelPath", "value": "Whisper Model Path (e.g. C:/Models/ggml-base.bin)" },
749+
750+
{ "key": "settings.translation.llama.title", "value": "Translation (llama.cpp)" },
751+
{ "key": "settings.translation.llama.description", "value": "Local text translation via llama.cpp. Download llama-cli and a GGUF model from github.com/ggerganov/llama.cpp/releases. Recommended: Llama 3.2 1B Q4 for fast translation." },
752+
{ "key": "settings.translation.llama.exePath", "value": "llama-cli Path (e.g. C:/llama.cpp/llama-cli.exe)" },
753+
{ "key": "settings.translation.llama.modelPath", "value": "GGUF Model Path (e.g. C:/Models/llama-3.2-1b.Q4_K_M.gguf)" },
754+
755+
{ "key": "settings.translation.features.title", "value": "Features" },
756+
{ "key": "settings.translation.chat.enabled", "value": "Translate Chat Messages" },
757+
{ "key": "settings.translation.voice.enabled", "value": "Translate Voice (Speech-to-Text)" },
758+
{ "key": "settings.translation.voice.title", "value": "Voice Settings" },
759+
{ "key": "settings.translation.voice.description", "value": "Fine-tune how voice audio is segmented into utterances for transcription." },
760+
{ "key": "settings.translation.voice.gap", "value": "Utterance Gap (seconds)" },
761+
{ "key": "settings.translation.voice.maxPlayers", "value": "Max Players to Translate" }
739762
]
740763
}

Basis/Packages/com.basis.framework/BasisUI/Localization/BasisLocalization.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,31 @@ private static string GetLanguagesDirectory()
313313
return Path.Combine(Application.streamingAssetsPath, LanguagesFolder);
314314
}
315315

316+
/// <summary>
317+
/// Sort priority by total global speakers (native + L2). Lower value
318+
/// means higher in the dropdown. Languages not in this table fall to
319+
/// the end, ordered alphabetically by code.
320+
/// </summary>
321+
private static readonly Dictionary<string, int> LanguageSortOrder = new(StringComparer.OrdinalIgnoreCase)
322+
{
323+
{ "en", 0 },
324+
{ "ja", 1 },
325+
{ "ru", 2 },
326+
{ "zh-CN", 3 },
327+
{ "zh", 4 },
328+
{ "hi", 5 },
329+
{ "es", 6 },
330+
{ "es-MX", 7 },
331+
{ "fr", 8 },
332+
{ "ar", 9 },
333+
{ "bn", 10 },
334+
{ "pt", 11 },
335+
{ "ur", 12 },
336+
{ "de", 13 },
337+
{ "it", 14 },
338+
{ "nl", 15 },
339+
};
340+
316341
private static void DiscoverAvailableLanguages()
317342
{
318343
_available.Clear();
@@ -346,6 +371,20 @@ private static void DiscoverAvailableLanguages()
346371
string nativeName = ReadNativeName(files[i], code);
347372
_available.Add(new LanguageOption(code, nativeName));
348373
}
374+
375+
// Sort non-English entries by global speaker count.
376+
// Index 0 is always English (the default); keep it pinned.
377+
if (_available.Count > 2)
378+
{
379+
const int unlisted = 999;
380+
_available.Sort(1, _available.Count - 1, Comparer<LanguageOption>.Create((a, b) =>
381+
{
382+
LanguageSortOrder.TryGetValue(a.Code, out int pa); if (pa == 0 && !LanguageSortOrder.ContainsKey(a.Code)) pa = unlisted;
383+
LanguageSortOrder.TryGetValue(b.Code, out int pb); if (pb == 0 && !LanguageSortOrder.ContainsKey(b.Code)) pb = unlisted;
384+
int cmp = pa.CompareTo(pb);
385+
return cmp != 0 ? cmp : string.Compare(a.Code, b.Code, StringComparison.OrdinalIgnoreCase);
386+
}));
387+
}
349388
}
350389

351390
private static string ReadNativeName(string filePath, string code)

Basis/Packages/com.basis.framework/BasisUI/Menus/Library/LibraryProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1798,7 +1798,7 @@ private static void CreateListEntry(BasisRuntimeSpawnRegistry.SpawnInstance item
17981798
BasisNetworkPlayer player = TryFindPlayer(itemKey.UUIDOfCreator);
17991799
if(TryFindPlayer(itemKey.UUIDOfCreator) != null)
18001800
{
1801-
createdDisplayName = LibraryProviderStrUtil.TitleToCase(player.displayName);
1801+
createdDisplayName = LibraryProviderStrUtil.TitleToCase(player.censoredDisplayName);
18021802
}
18031803
}
18041804

Basis/Packages/com.basis.framework/BasisUI/Menus/Main Menu Providers/IndividualPlayerProvider.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public async override void RunAction()
315315
descriptor.SetTitle(BasisLocalization.Get("settings.general.title"));
316316

317317
TextMeshProUGUI titleLabel = panel.Descriptor.TitleLabel;
318-
if (titleLabel != null) titleLabel.text = target.DisplayName;
318+
if (titleLabel != null) titleLabel.text = target.CensoredDisplayName;
319319

320320
var root = tab.Descriptor.ContentParent;
321321
var infoGroup = PanelElementDescriptor.CreateNew(PanelElementDescriptor.ElementStyles.Group, root);
@@ -324,7 +324,7 @@ public async override void RunAction()
324324

325325
var Descriptor = PanelElementDescriptor.CreateNew(PanelElementDescriptor.ElementStyles.Group,infoGroup.ContentParent);
326326
Descriptor.SetTitle(BasisLocalization.Get("menu.individualPlayer.name"));
327-
Descriptor.SetDescription(remotePlayer.DisplayName);
327+
Descriptor.SetDescription(remotePlayer.CensoredDisplayName);
328328

329329
var PlatformDescriptor = PanelElementDescriptor.CreateNew(PanelElementDescriptor.ElementStyles.Group, infoGroup.ContentParent);
330330
PlatformDescriptor.SetTitle(BasisLocalization.Get("menu.individualPlayer.platform"));
@@ -689,7 +689,7 @@ public async override void RunAction()
689689
{
690690
BasisMainMenu.Instance.OpenDialogue(
691691
BasisLocalization.Get("menu.individualPlayer.kick.dialog.title"),
692-
BasisLocalization.Get("menu.individualPlayer.kick.dialog.body", remotePlayer.DisplayName),
692+
BasisLocalization.Get("menu.individualPlayer.kick.dialog.body", remotePlayer.CensoredDisplayName),
693693
BasisLocalization.Get("menu.individualPlayer.kick"),
694694
BasisLocalization.Get("ui.cancel"),
695695
confirmed => { if (confirmed) BasisNetworkModeration.SendKick(targetUUID, ""); });
@@ -702,7 +702,7 @@ public async override void RunAction()
702702
{
703703
BasisMainMenu.Instance.OpenDialogue(
704704
BasisLocalization.Get("menu.individualPlayer.ban.dialog.title"),
705-
BasisLocalization.Get("menu.individualPlayer.ban.dialog.body", remotePlayer.DisplayName),
705+
BasisLocalization.Get("menu.individualPlayer.ban.dialog.body", remotePlayer.CensoredDisplayName),
706706
BasisLocalization.Get("menu.individualPlayer.ban"),
707707
BasisLocalization.Get("ui.cancel"),
708708
confirmed => { if (confirmed) BasisNetworkModeration.SendBan(targetUUID, ""); });
@@ -715,7 +715,7 @@ public async override void RunAction()
715715
{
716716
BasisMainMenu.Instance.OpenDialogue(
717717
BasisLocalization.Get("menu.individualPlayer.ipBan.dialog.title"),
718-
BasisLocalization.Get("menu.individualPlayer.ipBan.dialog.body", remotePlayer.DisplayName),
718+
BasisLocalization.Get("menu.individualPlayer.ipBan.dialog.body", remotePlayer.CensoredDisplayName),
719719
BasisLocalization.Get("menu.individualPlayer.ipBan"),
720720
BasisLocalization.Get("ui.cancel"),
721721
confirmed => { if (confirmed) BasisNetworkModeration.SendIPBan(targetUUID, ""); });

Basis/Packages/com.basis.framework/Drivers/Remote/BasisRemoteNamePlateDriver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ private void CombinePlateMesh(BasisRemoteNamePlate namePlate, Mesh roundedMesh,
234234
public void GenerateTextFactory(BasisRemotePlayer remotePlayer, BasisRemoteNamePlate namePlate)
235235
{
236236
Text.gameObject.SetActive(true);
237-
Text.text = remotePlayer.DisplayName;
237+
Text.text = remotePlayer.CensoredDisplayName;
238238
Text.ForceMeshUpdate();
239239

240240
// Measure the baked text so the background fits its actual content.

Basis/Packages/com.basis.framework/Networking/BasisNetworkConnection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public static void Connect(ushort port, string ipString, string primitivePasswor
8484
playerUUID = basisLocalPlayer.UUID,
8585
playerDisplayName = basisLocalPlayer.DisplayName,
8686
playerPlatform = basisLocalPlayer.PlayerPlatform,
87+
playerCensoredDisplayName = string.Empty,
8788
}
8889
};
8990

Basis/Packages/com.basis.framework/Networking/BasisNetworkEvents.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ public static async void NetworkReceiveEvent(NetPeer peer, NetPacketReader Reade
311311

312312
BasisLocalPlayer.Instance.UUID = SMDM.ClientMetaDataMessage.playerUUID;
313313
BasisLocalPlayer.Instance.DisplayName = SMDM.ClientMetaDataMessage.playerDisplayName;
314+
BasisLocalPlayer.Instance.CensoredDisplayName = SMDM.ClientMetaDataMessage.playerCensoredDisplayName;
314315
BasisNetworkManagement.ServerMetaDataMessage = SMDM;
315316
BasisNetworkManagement.LocalPermissions = SMDM.GetPermissions();
316317
BasisNetworkManagement.OnlocalPermissionsChanged?.Invoke();

Basis/Packages/com.basis.framework/Networking/BasisNetworkPlayer.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,22 @@ public string displayName
493493
}
494494
}
495495
}
496-
496+
497+
public string censoredDisplayName
498+
{
499+
get
500+
{
501+
if (Player != null)
502+
{
503+
return Player.CensoredDisplayName;
504+
}
505+
else
506+
{
507+
return string.Empty;
508+
}
509+
}
510+
}
511+
497512
public string SafeDisplayName
498513
{
499514
get

0 commit comments

Comments
 (0)