zoukankan      html  css  js  c++  java
  • Xamarin.Forms本地化多语言

    1. Forms

    右键新建文件夹 Localization

    新建文件TranslateExtension.cs

    namespace Localization

    {

    /// <summary>

    /// xaml 文件本地化

    /// </summary>

    [ContentProperty("Text")]

    public class TranslateExtension : IMarkupExtension

    {

    /// <summary>

    /// 本地资源对象

    /// </summary>

    readonly CultureInfo ci;

    /// <summary>

    /// 反射用命名空间常量

    /// </summary>

    const string ResourceId = "BarCode.Localization.TextResources";

     

    /// <summary>

    /// 构造函数 本地化对象根据抽象实现对象获取

    /// </summary>

    public TranslateExtension()

    {

    ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();

    }

     

    /// <summary>

    /// 文本对象属性

    /// </summary>

    public string Text { get; set; }

     

    /// <summary>

    /// 获取数据值显示用于xaml

    /// </summary>

    /// <param name="serviceProvider"></param>

    /// <returns></returns>

    public object ProvideValue(IServiceProvider serviceProvider)

    {

    if (Text == null)

    return "";

     

    ResourceManager resmgr = new ResourceManager(ResourceId

    , typeof(TranslateExtension).GetTypeInfo().Assembly);

     

    var translation = resmgr.GetString(Text, ci);

     

    if (translation == null)

    {

    #if DEBUG

    throw new ArgumentException(

    String.Format("Key '{0}' was not found in resources '{1}' for culture '{2}'.", Text, ResourceId, ci.Name),

    "Text");

    #else

    translation = Text; // HACK: returns the key, which GETS DISPLAYED TO THE USER

    #endif

    }

    return translation;

    }

    }

    }

    新建抽象接口ILocalize.cs

    /// <summary>

    /// 定义一个接口暴露用户的首选UICulture 本地资源化对象

    /// </summary>

    public interface ILocalize

    {

    CultureInfo GetCurrentCultureInfo();

    }

    新建资源文件TextResources.resx

    新建TextResources.en-US.resx

    名称相同(key)一致,值区分语言。

    新建xaml文件Multilingualism.xaml

    <?xml version="1.0" encoding="utf-8" ?>

    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

    x:Class="XMD1.Page.Multilingualism"

    xmlns:i18n="clr-namespace:Localization">

     

    <StackLayout >

    <!--<BoxView AbsoluteLayout.LayoutBounds="0.25, 0.25, 0.5, 0.5"

    Color="Blue"

    AbsoluteLayout.LayoutFlags="All" />-->

    <Label Text="{i18n:Translate About_Context}" VerticalOptions="Center" HorizontalOptions="Center" x:Name="lab"/>

    <Button Text="中文" Clicked="zhclicked" HorizontalOptions="Start" />

    <Button Text="英文" x:Name="enbtn" HorizontalOptions="End"/>

    </StackLayout>

    1. </ContentPage>Android

    同目录、实现接口

    using Localization;

    using Xamarin.Forms;

     

    [assembly: Dependency(typeof(Localize))]

    namespace Localization

    {

    /// <summary>

    /// Android 本地资源化实现对象

    /// </summary>

    public class Localize : ILocalize

    {

    public System.Globalization.CultureInfo GetCurrentCultureInfo()

    {

    var androidLocale = Java.Util.Locale.Default;

    var netLanguage = androidLocale.ToString().Replace("_", "-"); // turns pt_BR into pt-BR

    return new System.Globalization.CultureInfo(netLanguage);

    }

    }

    }

    1. IOS

    同目录、实现接口

     

    using Foundation;

    using Localization;

    using System;

    using Xamarin.Forms;

     

    [assembly: Dependency(typeof(Localize))]

    namespace Localization

    {

    /// <summary>

    /// ios 本地资源化实现对象

    /// </summary>

    public class Localize: ILocalize

    {

    public System.Globalization.CultureInfo GetCurrentCultureInfo()

    {

    var netLanguage = "en";

    var prefLanguageOnly = "en";

    if (NSLocale.PreferredLanguages.Length > 0)

    {

    var pref = NSLocale.PreferredLanguages[0];

    prefLanguageOnly = pref.Substring(0, 2);

    if (prefLanguageOnly == "pt")

    {

    if (pref == "pt")

    pref = "pt-BR"; // get the correct Brazilian language strings from the PCL RESX (note the local iOS folder is still "pt")

    else

    pref = "pt-PT"; // Portugal

    }

    netLanguage = pref.Replace("_", "-");

    Console.WriteLine("preferred language:" + netLanguage);

    }

    System.Globalization.CultureInfo ci = null;

    try

    {

    ci = new System.Globalization.CultureInfo(netLanguage);

    }

    catch

    {

    // iOS locale not valid .NET culture (eg. "en-ES" : English in Spain)

    // fallback to first characters, in this case "en"

    ci = new System.Globalization.CultureInfo(prefLanguageOnly);

    }

    return ci;

    }

    }

    }

     

    参考一下布局

    https://developer.xamarin.com/guides/xamarin-forms/controls/layouts/

  • 相关阅读:
    hosts.deny hosts.allow防止ssh暴力破解密码
    linux查看当前ssh登陆的ip
    ubuntu下如何查看用户登录及系统授权相关信息
    ubuntu查看日志中访问次数前十的ip
    magento清空日志表
    mysql general error 2006
    mysql 1205 lock wait timeout exceeded
    mysql 504 timeout问题
    PHP : 数据库中int类型保存时间并通过年月份时分秒进行显示
    PHP : 封装Mysqli的连接、关闭和增改查(面向过程)
  • 原文地址:https://www.cnblogs.com/sephiroth-wzc/p/5375783.html
Copyright © 2011-2022 走看看