zoukankan      html  css  js  c++  java
  • CurrentCulture和CurrentUICulture的区别

    CurrentCulture

    这个属性用来表示和改变使用者要使用的“地区属性”,地区属性改变后,数字、日期时间等表示格式也随之改变。

    注意:一定是“地区属性”,如"zh-cn"、"en-US"等等。

    CurrentUICulture

    顾名思义,该属性表示使用者所使用的界面语言,可以是“语言属性”,如"zh"、"en"等等。

    比如说,用户登录windows后,界面可以是英文的(CurrentUICulture),但数字以及日期的显示方式可以是中国大陆的(CurrentCulture)。

    使用Windows控制面板中的“区域和语言”选项,用户就可以改变CurrentCulture的默认设置。使用这个配置,还可以改变文化的默认数字、时间和日期格式。CurrentUICulture不依赖于这个配置,而依赖于操作系统的语言。

    在做多语言项目时,往往需要编程动态改变当前应用程序的文化,这是最主要的是必须改变CurrentUICulture,在改变CurrentCulture时需要慎重,因为这种改变将会导致各种转换格式的改变,从而造成配置文件读写转换失败。

      VS2005彻底改变了开发软件多语言版本费时费力的现状,现在用VS2005可以方便地实现一个针对世界上所有语言的地方版本。

    1. 文化和区域
      世界分为若干个文化和区域,应用程序必须知道这些文化和区域的区别。文化是基于用户的语言和文化习惯的一组特性。RFC 1766定义了文化的名称,这些名称根据语言和国家或区域的不同在世界各地使用。例如en-AU、en-CA、en-GB和en-US分别用于表示澳大利亚、加拿大、英国和美国的英语。

    2. CurrentCulture和CurrentUICulture
      应用程序中的文化分为两种类型:用户界面的文化和数字及日期格式的文化。文化与线程相关,有了这两种文化类型,就可以把两个文化设置应用于线程。用线程设置文化时,Thread类提供了属性CurrentCulture和CurrentUICulture。属性CurrentCulture用于设置与格式化和排序选项一起使用的文化,而属性CurrentUICulture用于设置用户界面的语言。

      使用Windows控制面板中的“区域和语言”选项,用户就可以改变CurrentCulture的默认设置。使用这个配置,还可以改变文化的默认数字、时间和日期格式。CurrentUICulture不依赖于这个配置,而依赖于操作系统的语言。

    3. 应用程序加载的过程
      对于一个本地化的软件,.Net应用程序都有CurrentCulture和CurrentUICulture两个属性,当它加载时,这两个属性默认为操作系统中预定义的值。.Net应用程序会去程序目录下寻找有文化名称为名字的目录,以及寻找相对应的语言包(附属资源程序集),文件名为assemblyname.resources.dll,如果找到就会加载,如果找不到就会去用默认的(不变的)文化语言包,如果这个语言包也找不到——程序当然会报错。

    4. 多语言版CurrentUICulture
      每个窗体都有一个可以设置为 true 或 false 的 Localizable 属性。将该属性设置为 true,就创建了该窗体的多语言版本,Visual Studio 2005 将在幕后为您创建和维护一组已本地化的资源文件。接着,将窗体的Language 属性更改为特定语言(如"中文 (简体)"),则 Visual Studio 会新建一个本地化资源文件,编译后将自动生成该语言的语言包。因此您需要作的就是,更改Language 属性后,直接用该种语言编辑窗体.您可以修改该窗体上的字符串、控件的大小以及位置、甚至替换图片。这样的特性,可以允许您的软件的中文版和英文风格炯异。
    图:

    5. 不在窗体上的本地化资源
      无需将所有的需本地化资源放置到窗体上,程序中使用的字符串、图片、xml文件等等需要本地化的资源还可以装入到资源文件中。VS2005在项目属性设置中预置了一个资源文件。
    图:

      您可以将程序中需要本地化的东西都放在这个资源文件中,在C#程序中您可以以assemblyName.Properties.Resource.resourcename的方式直接引用它。
    那项目资源文件中的资源怎样本地化呢?你只需要复制该文件,用新的名称命名,如Resources.zh-CHS.resx,注意到新的名称新增加的部分必须是文化名。接着你在IDE中本地化这个新的资源文件就可以了,剩下的事情,VS2005都帮我们去作了。

    6. 多语言版CurrentCulture
      多语言版CurrentCulture主要体现在对一些函数,尤其是Format、ToString函数的使用上,很多函数同string、date类一样,提供在格式化为本地格式的重载函数,这些函数一般带有IFormatProvider参数,允许用编程的方式提供不同文化的格式化的结果。例如:下面的代码生成了法语法国地区的数字与日期的格式化字符串。

    int val =12345678;
    val.ToString("N", new CultureInfo("fr-FR")

    DateTime d =new DateTime(2003, 08, 09);
    d.ToString("D", new CultureInfo("fr-FR"));

    7. 编程改变当前CurrentUICulture和CurrentCulture
      对于许多大型的项目,会产生编程动态改变当前应用程序的文化的需求,在.Net中,这似乎也简单:

          // set culture for formatting
           Thread.CurrentThread.CurrentCulture = ci;

          // set culture for resources
           Thread.CurrentThread.CurrentUICulture = ci;

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Security.Permissions;
    using System.Text;
    using System.Threading;
    [assembly: SecurityPermission(SecurityAction.RequestMinimum, ControlThread = true)]
    namespace SamplesCultureInfo
    {

    class SamplesCultureInfo
    {
    public static void Main()
    {

    // Displays the name of the CurrentCulture of the current thread.
    Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);

    // Changes the CurrentCulture of the current thread to th-TH.
    Thread.CurrentThread.CurrentCulture = new CultureInfo("th-TH", false);
    Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name);

    // Displays the name of the CurrentUICulture of the current thread.
    Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);

    // Changes the CurrentUICulture of the current thread to ja-JP.
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP",false);
    Console.WriteLine("CurrentUICulture is now {0}.", CultureInfo.CurrentUICulture.Name);

    Console.ReadKey();

    }
    }
    }


  • 相关阅读:
    Springboot整合Thymeleaf,Thymeleaf页面引入静态资源
    SpringBoot 使用thymeleaf 跳转页面时,总是提示404找不到页面
    项目报错:jdbcUrl is required with driverClassName.
    Springboot配置拦截器无法跳转登录页面
    查看 SELinux状态及关闭SELinux
    Solaris平台,如何通过端口号快速查看PID(进程)
    getApplicationContext()、getBasecontext()、getApplication() 、getParent()
    android工程下不能运行java main程序的解决办法
    SDCardUtils
    BaseAdapter
  • 原文地址:https://www.cnblogs.com/netmvc8/p/3513855.html
Copyright © 2011-2022 走看看