I am trying to implement a localization so when the language is changed by the user, everything changes in runtime.
I have the next class LocalizedResources
:
public class LocalizedResources : INotifyPropertyChanged
{
const string DEFAULT_LANGUAGE = "";
readonly ResourceManager ResourceManager;
CultureInfo CurrentCultureInfo;
public string this[string key]
{
get => ResourceManager.GetString(key, CurrentCultureInfo);
}
public LocalizedResources(Type resource, string language = null)
: this(resource, new CultureInfo(language ?? DEFAULT_LANGUAGE))
{ }
public LocalizedResources(Type resource, CultureInfo cultureInfo)
{
CurrentCultureInfo = cultureInfo;
ResourceManager = new ResourceManager(resource);
MessagingCenter.Subscribe<object, CultureChangedMessage>(this,
String.Empty, OnCultureChanged);
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnCultureChanged(object s, CultureChangedMessage ccm)
{
CurrentCultureInfo = ccm.NewCultureInfo;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
}
public string CurrentCulture() => CurrentCultureInfo.Name;
public CultureInfo CurrentCultureI() => CurrentCultureInfo;
}
When I use it directly in a view binding (like {Binding Resources[key]}
, an example of it is below), it works wonders, but I have few cases when I have to create another property in another model using this class. An example:
public class MediaViewModel : BaseViewModel
{
public CultureInfo localization;
public int localizationFirstDay;
public MediaViewModel()
{
localization = Resources.CurrentCultureI();
localizationFirstDay = (int)Resources.CurrentCultureI().DateTimeFormat.FirstDayOfWeek;
}
}
Here I save Resources.CurrentCultureI();
in localization
to use it in its view:
<StackLayout Padding="5, 10, 5, 10">
<calendar:SfCalendar x:Name="calendar"
ViewMode="MonthView"
YearViewMode="Month"
Margin="10, 5, 10, 5"
NavigationDirection="Vertical"
ShowInlineEvents="True"
InlineViewMode="Agenda"
VerticalOptions="FillAndExpand"
Locale="{Binding localization}"
FirstDayofWeek="{Binding Resources[LocalizationFirstDay]}">
<calendar:SfCalendar.MonthViewSettings>
<calendar:MonthViewSettings>
<calendar:MonthViewSettings.InlineItemTemplate>
<DataTemplate>
<Button AutomationId="{Binding AutomationId}"
Text="Texto" TextColor="#bbd5ed"/>
</DataTemplate>
</calendar:MonthViewSettings.InlineItemTemplate>
</calendar:MonthViewSettings>
</calendar:SfCalendar.MonthViewSettings>
</calendar:SfCalendar>
</StackLayout>
FirstDayofWeek="{Binding Resources[LocalizationFirstDay]}"
works fine, but Locale="{Binding localization}"
does not.
How can I solve it?