Xamarin Localization Library for Xamarin/Xamarin.Forms
Xamarin has provided very detail documentation about how to do localize your application here. However, Xamarin doesn’t provide a read-to-use NUGET package.
This project is to provide to Xamrin Developers a ready-to-use NUGET packaget to localize their Xamarin.Forms application.
Install-Package Naxam.I18n
The original code of this package is to use along with Prism, or the like framework, so code is devided into very small pieces which we could inject easily via IoC support.
ILocalizedResourceProvider
so the built-in converters/markup extension to workILocalizedResourceProvider
ILocalizedResourceProvider
You could look at the demo code for more details.
Provide a ResourceManager instance for our localized texts. If you use IoC support, you should register there instead.
public static ResourceManager ResManager {
get
{
return new ResourceManager(typeof(LocalTexts));
}
}
Create and register an instance of IDepenencyGetter so our converter and extension could work. If you use IoC, you could resolve these things by using IoC container.
public class DepenencyGetter : IDependencyGetter
{
readonly Dictionary<Type, object> cache;
public DepenencyGetter()
{
ILocalizer localizer = new Localizer();
cache = new Dictionary<Type, object> {
{
typeof(ILocalizer),
localizer
},
{
typeof(ILocalizedResourceProvider),
new LocalizedResourceProvider(localizer, App.ResManager)
}
};
}
public T Get<T>()
{
return (T)cache[typeof(T)];
}
}
Xamarin.Forms.DependencyService.Register<IDependencyGetter, DepenencyGetter>();
Get ILocalizer
and ILocalizedResourceProvider
. If you use IoC, you could use its way of getting dependencies.
var getter = DependencyService.Get<IDependencyGetter>();
var localizer = getter.Get<ILocalizer>();
var localizeResProvider = getter.Get<ILocalizedResourceProvider>();
Change the culture with ILocalizer
localizer.SetLocale(culture);
Get localized text
localizeResProvider.GetText("MainPage_Title");
Use extension and converter
xmlns:i18n="clr-namespace:Naxam.I18n.Forms;assembly=Naxam.I18n.Forms"
xmlns:converters="clr-namespace:Naxam.I18n.Forms.Converters;assembly=Naxam.I18n.Forms"
<ResourceDictionary>
<converters:TimeAgoConverter x:Key="TimeAgoConverter" ></converters:TimeAgoConverter>
</ResourceDictionary>
<Label
Text="{i18n:Translate Page.Title}"
HorizontalTextAlignment="Center"
Margin="8"
></Label>
TimeAgoConverter
To use TimeAgoConverter
, you need to provide appropriate localized texts for keys as listed below.
<data name="TimeAgo_NA" xml:space="preserve">
<value>N/A</value>
<comment>N/A</comment>
</data>
<data name="TimeAgo_LessThan1Minute" xml:space="preserve">
<value>Just now</value>
<comment>Less than 1 minute</comment>
</data>
<data name="TimeAgo_LessThan5Minutes" xml:space="preserve">
<value>Few minutes</value>
<comment>Less than 5 minutes</comment>
</data>
<data name="TimeAgo_LessThan1Hour" xml:space="preserve">
<value>{0} minutes</value>
<comment>Less than 1 hour</comment>
</data>
<data name="TimeAgo_LessThan1Day" xml:space="preserve">
<value>{0} hrs</value>
<comment>Less than 1 day</comment>
</data>
<data name="TimeAgo_Yesterday" xml:space="preserve">
<value>Yesterday</value>
<comment>Yesterday</comment>
</data>
<data name="TimeAgo_LessThan1Week" xml:space="preserve">
<value>{0} days</value>
<comment>Less than 1 week</comment>
</data>
<data name="TimeAgo_Past" xml:space="preserve">
<value>{0:dd/MM/yyyy}</value>
<comment>Past</comment>
</data>