Files
Terminal.Gui/Examples/UICatalog/Scenarios/Localization.cs

252 lines
8.5 KiB
C#

#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<string> (new (_cultureInfoNameSource)),
SelectedItem = _cultureInfoNameSource.Length - 1
};
_languageComboBox.SetSource<string> (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.Unloaded += (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]);
}
}
}
}