Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save moto2002/100e20b53a50955d41dba0dad4a014b4 to your computer and use it in GitHub Desktop.

Select an option

Save moto2002/100e20b53a50955d41dba0dad4a014b4 to your computer and use it in GitHub Desktop.
Text localization script for UIDocument (UI Toolkit @ Unity)
using UnityEngine;
using UnityEngine.UIElements;
using UnityEngine.Localization;
using UnityEngine.Localization.Tables;
using UnityEngine.ResourceManagement.AsyncOperations;
// NOTE: this class assumes that you designate StringTable keys in label fields (as seen in Label, Button, etc)
// and start them all with '#' char (so other labels will be left be)
// example: https://i.imgur.com/h495sju.jpg
[DisallowMultipleComponent]
[RequireComponent( typeof(UIDocument) )]
public class UIDocumentLocalization : MonoBehaviour
{
[SerializeField] LocalizedStringTable _table = null;
UIDocument _document;
void OnEnable ()
{
if( _document==null )
_document = gameObject.GetComponentInParent<UIDocument>( includeInactive:true );
_table.TableChanged += OnTableChanged;
}
void OnDisable ()
{
_table.TableChanged -= OnTableChanged;
}
void OnTableLoaded ( AsyncOperationHandle<StringTable> op )
{
StringTable table = op.Result;
var root = _document.rootVisualElement;
LocalizeChildrenRecursively( root , table );
root.MarkDirtyRepaint();
}
void OnTableChanged ( StringTable value )
{
var root = _document.rootVisualElement;
root.Clear();
_document.visualTreeAsset.CloneTree( root );
var op = _table.GetTable();
op.Completed -= OnTableLoaded;
op.Completed += OnTableLoaded;
}
void Localize ( VisualElement next , StringTable table )
{
if( typeof(TextElement).IsInstanceOfType(next) )
{
TextElement textElement = (TextElement) next;
string key = textElement.text;
if( !string.IsNullOrEmpty(key) && key[0]=='#' )
{
StringTableEntry entry = table[ key ];
if( entry!=null )
textElement.text = entry.LocalizedValue;
else
Debug.LogWarning($"No {table.LocaleIdentifier.Code} translation for key: '{key}'");
}
}
}
void LocalizeChildrenRecursively ( VisualElement element , StringTable table )
{
VisualElement.Hierarchy elementHierarchy = element.hierarchy;
int numChildren = elementHierarchy.childCount;
for( int i=0 ; i<numChildren ; i++ )
{
VisualElement child = elementHierarchy.ElementAt( i );
Localize( child , table );
}
for( int i=0 ; i<numChildren ; i++ )
{
VisualElement child = elementHierarchy.ElementAt( i );
VisualElement.Hierarchy childHierarchy = child.hierarchy;
int numGrandChildren = childHierarchy.childCount;
if( numGrandChildren!=0 )
LocalizeChildrenRecursively( child , table );
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment