#nullable enable using System.Globalization; namespace UICatalog.Scenarios; [ScenarioMetadata ("Localization", "Test for localization resources.")] [ScenarioCategory ("Text and Formatting")] [ScenarioCategory ("Tests")] public class Localization : Scenario { private CheckBox? _allowAnyCheckBox; private string []? _cultureInfoNameSource; private CultureInfo []? _cultureInfoSource; private OpenMode _currentOpenMode = OpenMode.File; private ComboBox? _languageComboBox; public CultureInfo CurrentCulture { get; private set; } = Thread.CurrentThread.CurrentUICulture; public void Quit () { SetCulture (CultureInfo.InvariantCulture); Application.RequestStop (); } public void SetCulture (CultureInfo culture) { if (_languageComboBox is null || _cultureInfoSource is null) { return; } if (_cultureInfoSource [_languageComboBox.SelectedItem] != culture) { _languageComboBox.SelectedItem = Array.IndexOf (_cultureInfoSource, culture); } if (CurrentCulture == culture) { return; } CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; Application.LayoutAndDraw (); } public override void Main () { Application.Init (); Window win = new () { Title = GetQuitKeyAndName (), BorderStyle = LineStyle.None }; _cultureInfoSource = Application.SupportedCultures!.Append (CultureInfo.InvariantCulture).ToArray (); _cultureInfoNameSource = Application.SupportedCultures!.Select (c => $"{c.NativeName} ({c.Name})") .Append ("Invariant") .ToArray (); MenuItem [] languageMenus = Application.SupportedCultures! .Select (c => new MenuItem { Title = $"{c.NativeName} ({c.Name})", Action = () => SetCulture (c) } ) .Concat ( [ new () { Title = "Invariant", Action = () => SetCulture (CultureInfo.InvariantCulture) } ] ) .ToArray (); // MenuBar MenuBar menu = new (); menu.Add ( new MenuBarItem ( "_File", [ new MenuBarItem ( "_Language", languageMenus ), new MenuItem { Title = "_Quit", Action = Quit } ] ) ); Label selectLanguageLabel = new () { X = 2, Y = Pos.Bottom (menu) + 1, Width = Dim.Fill (2), Text = "Please select a language." }; win.Add (selectLanguageLabel); _languageComboBox = new () { X = 2, Y = Pos.Bottom (selectLanguageLabel) + 1, Width = _cultureInfoNameSource.Select (cn => cn.Length + 3).Max (), Height = _cultureInfoNameSource.Length + 1, HideDropdownListOnClick = true, Source = new ListWrapper (new (_cultureInfoNameSource)), SelectedItem = _cultureInfoNameSource.Length - 1 }; _languageComboBox.SetSource (new (_cultureInfoNameSource)); _languageComboBox.SelectedItemChanged += LanguageComboBox_SelectChanged; win.Add (_languageComboBox); Label textAndFileDialogLabel = new () { X = 2, Y = Pos.Top (_languageComboBox) + 3, Width = Dim.Fill (2), Height = 1, Text = "Right click on the text field to open a context menu, click the button to open a file dialog.\r\nOpen mode will loop through 'File', 'Directory' and 'Mixed' as 'Open' or 'Save' button clicked." }; win.Add (textAndFileDialogLabel); TextView textField = new () { X = 2, Y = Pos.Bottom (textAndFileDialogLabel) + 1, Width = Dim.Fill (32), Height = 1 }; win.Add (textField); _allowAnyCheckBox = new () { X = Pos.Right (textField) + 1, Y = Pos.Bottom (textAndFileDialogLabel) + 1, CheckedState = CheckState.UnChecked, Text = "Allow any" }; win.Add (_allowAnyCheckBox); Button openDialogButton = new () { X = Pos.Right (_allowAnyCheckBox) + 1, Y = Pos.Bottom (textAndFileDialogLabel) + 1, Text = "Open" }; openDialogButton.Accepting += (sender, e) => ShowFileDialog (false); win.Add (openDialogButton); Button saveDialogButton = new () { X = Pos.Right (openDialogButton) + 1, Y = Pos.Bottom (textAndFileDialogLabel) + 1, Text = "Save" }; saveDialogButton.Accepting += (sender, e) => ShowFileDialog (true); win.Add (saveDialogButton); Label wizardLabel = new () { X = 2, Y = Pos.Bottom (textField) + 1, Width = Dim.Fill (2), Text = "Click the button to open a wizard." }; win.Add (wizardLabel); Button wizardButton = new () { X = 2, Y = Pos.Bottom (wizardLabel) + 1, Text = "Open _wizard" }; wizardButton.Accepting += (sender, e) => ShowWizard (); win.Add (wizardButton); win.IsRunningChanged += (sender, e) => Quit (); win.Add (menu); Application.Run (win); win.Dispose (); Application.Shutdown (); } public void ShowFileDialog (bool isSaveFile) { if (_allowAnyCheckBox is null) { return; } FileDialog dialog = isSaveFile ? new SaveDialog () : new OpenDialog { OpenMode = _currentOpenMode }; dialog.AllowedTypes = [ _allowAnyCheckBox.CheckedState == CheckState.Checked ? new AllowedTypeAny () : new AllowedType ("Dynamic link library", ".dll"), new AllowedType ("Json", ".json"), new AllowedType ("Text", ".txt"), new AllowedType ("Yaml", ".yml", ".yaml") ]; dialog.MustExist = !isSaveFile; dialog.AllowsMultipleSelection = !isSaveFile; _currentOpenMode++; if (_currentOpenMode > OpenMode.Mixed) { _currentOpenMode = OpenMode.File; } Application.Run (dialog); dialog.Dispose (); } public void ShowWizard () { Wizard wizard = new () { Height = 8, Width = 36, Title = "The wizard" }; wizard.AddStep (new () { HelpText = "Wizard first step" }); wizard.AddStep (new () { HelpText = "Wizard step 2", NextButtonText = ">>> (_N)" }); wizard.AddStep (new () { HelpText = "Wizard last step" }); Application.Run (wizard); wizard.Dispose (); } private void LanguageComboBox_SelectChanged (object? sender, ListViewItemEventArgs e) { if (_cultureInfoNameSource is null || _cultureInfoSource is null) { return; } if (e.Value is string cultureName) { int index = Array.IndexOf (_cultureInfoNameSource, cultureName); if (index >= 0) { SetCulture (_cultureInfoSource [index]); } } } }