feat: 支持替换绑定内容

This commit is contained in:
2025-01-24 01:13:52 +08:00
parent d8454bcd65
commit f6118e29f8
3 changed files with 31 additions and 3 deletions

View File

@@ -3,7 +3,7 @@ using Avalonia.Data.Converters;
namespace JackCraft.I18N.Converters; namespace JackCraft.I18N.Converters;
internal class I18NConverter(I18NBinding binding, object[] bindingValues) : IMultiValueConverter internal class I18NConverter(I18NBinding binding, dynamic[] bindingValues) : IMultiValueConverter
{ {
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture) public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{ {
@@ -12,8 +12,11 @@ internal class I18NConverter(I18NBinding binding, object[] bindingValues) : IMul
if (binding.KeyConverter.Convert(values[1], null!, null, culture) is not string key) if (binding.KeyConverter.Convert(values[1], null!, null, culture) is not string key)
return values[1]; return values[1];
var value = I18NConfig.Manager.Get<object>(key, values[0] as CultureInfo); var value = I18NConfig.Manager.Get<object>(key, values[0] as CultureInfo);
if (value is string str && bindingValues.Length > 0) if (value is not string str) return binding.ValueConverter.Convert(value, null!, null, culture);
if (bindingValues is string[] && bindingValues.Length > 0)
value = string.Format(str, bindingValues); value = string.Format(str, bindingValues);
else if (bindingValues.Length > 0)
value = string.Format(str, values.Skip(2).ToArray());
return binding.ValueConverter.Convert(value, null!, null, culture); return binding.ValueConverter.Convert(value, null!, null, culture);
} }
} }

View File

@@ -19,5 +19,7 @@ internal class I18NBinding : MultiBinding
ValueConverter = new I18NValueConverter(); ValueConverter = new I18NValueConverter();
Bindings.Add(new Binding { Source = I18NConfig.Manager, Path = nameof(I18NConfig.Manager.Culture) }); Bindings.Add(new Binding { Source = I18NConfig.Manager, Path = nameof(I18NConfig.Manager.Culture) });
Bindings.Add(new Binding { Source = key }); Bindings.Add(new Binding { Source = key });
foreach (var value in values)
Bindings.Add(value);
} }
} }

View File

@@ -2,12 +2,35 @@ using Avalonia.Markup.Xaml;
namespace JackCraft.I18N; namespace JackCraft.I18N;
public class I18NExtension(string key, params object[] values) : MarkupExtension public class I18NExtension(string key, params dynamic[] values) : MarkupExtension
{ {
public I18NExtension(string key) : this(key, []) public I18NExtension(string key) : this(key, [])
{ {
} }
public I18NExtension(string key, dynamic value1) : this(key, [value1])
{
}
public I18NExtension(string key, dynamic value1, dynamic value2) : this(key, [value1, value2])
{
}
public I18NExtension(string key, dynamic value1, dynamic value2, dynamic value3) : this(key,
[value1, value2, value3])
{
}
public I18NExtension(string key, dynamic value1, dynamic value2, dynamic value3, dynamic value4) : this(key,
[value1, value2, value3, value4])
{
}
public I18NExtension(string key, dynamic value1, dynamic value2, dynamic value3, dynamic value4, dynamic value5) :
this(key, [value1, value2, value3, value4, value5])
{
}
public override object ProvideValue(IServiceProvider serviceProvider) public override object ProvideValue(IServiceProvider serviceProvider)
{ {
return new I18NBinding(key, values); return new I18NBinding(key, values);