Skip to content

Commit

Permalink
Implement TranslateBinding
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenquan committed Sep 25, 2023
1 parent 9216643 commit 66249a2
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 11 deletions.
2 changes: 1 addition & 1 deletion LocalizationResourceManager.Maui.Sample/MainPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
Clicked="OnCounterClicked"
HorizontalOptions="Center"
SemanticProperties.Hint="{localization:Translate CounterBtnHint}"
Text="{Binding CounterBtnText.Localized}" />
Text="{localization:TranslateBinding Count, TranslateFormat=ClickedManyTimes, TranslateOne=ClickedOneTime, TranslateZero=ClickMe}" />

<Label
FontSize="Small"
Expand Down
13 changes: 3 additions & 10 deletions LocalizationResourceManager.Maui.Sample/MainPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ public partial class MainPage : ContentPage
private int count = 0;
private readonly ILocalizationResourceManager resourceManager;

public int Count => count;

public LocalizedString HelloWorld { get; }
public LocalizedString CounterBtnText { get; }
public LocalizedString CurrentCulture { get; }

public MainPage(ILocalizationResourceManager resourceManager)
Expand All @@ -18,23 +19,15 @@ public MainPage(ILocalizationResourceManager resourceManager)
this.resourceManager = resourceManager;

HelloWorld = new(() => $"{resourceManager["Hello"]}, {resourceManager["World"]}!");
CounterBtnText = new(() => GetCounterBtnText());
CurrentCulture = new(() => resourceManager.CurrentCulture.NativeName);

BindingContext = this;
}

private string GetCounterBtnText()
{
if (count == 0) return resourceManager["ClickMe"];
if (count == 1) return resourceManager["ClickedOneTime", count];
return resourceManager["ClickedManyTimes", count];
}

private void OnCounterClicked(object sender, EventArgs e)
{
count++;
OnPropertyChanged(nameof(CounterBtnText));
OnPropertyChanged(nameof(Count));
}

private void OnToggleLanguage(object sender, EventArgs e)
Expand Down
120 changes: 120 additions & 0 deletions LocalizationResourceManager.Maui/TranslateBindingExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
using System.Collections.ObjectModel;
using System.Globalization;

namespace LocalizationResourceManager.Maui;

[ContentProperty(nameof(Path))]
public class TranslateBindingExtension : IMarkupExtension<BindingBase>, IMultiValueConverter
{
/// <inheritdoc/>
public string Path { get; set; } = ".";

/// <inheritdoc/>
public BindingMode Mode { get; set; } = BindingMode.OneWay;

/// <inheritdoc/>
public string StringFormat { get; set; } = "{0}";

/// <inheritdoc/>
public IValueConverter Converter { get; set; } = null;

/// <inheritdoc/>
public object ConverterParameter { get; set; } = null;

/// <inheritdoc/>
public object Source { get; set; } = null;

/// <inheritdoc/>
public bool TranslateValue { get; set; } = false;

/// <inheritdoc/>
public string TranslateFormat { get; set; }

/// <inheritdoc/>
public string TranslateOne { get; set; }

/// <inheritdoc/>
public string TranslateZero { get; set; }

/// <inheritdoc/>
public object ProvideValue(IServiceProvider serviceProvider)
{
return (this as IMarkupExtension<BindingBase>).ProvideValue(serviceProvider);
}

BindingBase IMarkupExtension<BindingBase>.ProvideValue(IServiceProvider serviceProvider)
{
return new MultiBinding()
{
StringFormat = StringFormat,
Converter = this,
Mode = Mode,
Bindings = new Collection<BindingBase>
{
new Binding(Path, Mode, Converter, ConverterParameter, null, Source),
new Binding(nameof(LocalizationResourceManager.CurrentCulture), BindingMode.OneWay, null, null, null, LocalizationResourceManager.Current)
}
};
}

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 0 || values[0] == null)
{
return "";
}

if (!string.IsNullOrEmpty(TranslateZero) && IsZero(values[0]))
{
return LocalizationResourceManager.Current[TranslateZero, values];
}

if (!string.IsNullOrEmpty(TranslateOne) && IsOne(values[0]))
{
return LocalizationResourceManager.Current[TranslateOne, values];
}

if (!string.IsNullOrEmpty(TranslateFormat))
{
return LocalizationResourceManager.Current[TranslateFormat, values];
}

if (TranslateValue)
{
return LocalizationResourceManager.Current[values[0].ToString()];
}

return values[0];
}

static bool IsZero(object value)
{
if (value == null)
{
return false;
}
if (value.GetType() == typeof(int) && (int)value == 0)
{
return true;
}
return false;
}

static bool IsOne(object value)
{
if (value == null)
{
return false;
}
if (value.GetType() == typeof(int) && (int)value == 1)
{
return true;
}
return false;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

0 comments on commit 66249a2

Please sign in to comment.