Code/LocalizationProvider.razor.cs
using System;
using BetterUI.Extensions;
using Sandbox.Localization;

namespace BetterUI;

/// <summary>
/// A panel that manages the global language.
/// </summary>
/// <remarks>
/// Use this panel to set the language of your UI.
/// </remarks>
public sealed partial class LocalizationProvider : Panel
{
	/// <summary>
	/// The default language to use if no language is set.
	/// </summary>
	/// <remarks>
	/// Defaults to "en-us".
	/// </remarks>
	public const string DefaultLanguageCode = "en";

	/// <summary>
	/// The current language.
	/// </summary>
	public LanguageInformation? Language { get; set; }

	protected override void OnAfterTreeRender( bool firstTime )
	{
		if ( firstTime && Language is null )
		{
			// Language = Sandbox.Language.Current;
			SetLanguage( Sandbox.Language.Current.Abbreviation );
		}
	}

	/// <summary>
	/// Sets the language.
	/// </summary>
	/// <param name="languageCode">The language to set.</param>
	public void SetLanguage( string languageCode )
	{
		// Facepunch made it readonly now
		// Sandbox.Language.SelectedCode = languageCode;
		
		Language = Languages.Find( languageCode );
		Scene.RunSceneEvent<ILocalizationEvent>( x => x.OnLanguageChanged( Language! ) );
	}

	/// <summary>
	/// Gets the localized string for the given key.
	/// </summary>
	/// <param name="key">The key of the string to get.</param>
	/// <returns>The localized string.</returns>
	public static string GetValue( string key ) => Sandbox.Language.GetPhrase( key );

	protected override int BuildHash() => HashCode.Combine( Language );
}