java学习笔记——javaweb之 Listener监听器 & 国际化

1、Listener监听器

什么是监听器?监听器就是实时监视一些事物状态的程序,我们称为监听器。

就好像朝阳群众?朝阳区只要有哪个明星有什么不好的事,他们都会知道,然后举报。

那么朝阳群众就是监听器,明星就是被监视的事物,举报就是响应的内容。

 

又或者说是,电动车的报警器。当报警器锁上的时候。我们去碰电动车,电动车就会报警。

报警器,就是监听器,电动车就是被监视的对象。报警就是响应的内容。

 

 

2、JavaWeb中的Listener监听器

javaEE中的监听器,按作用分类 ,有三大类:

一类是:生命周期监听器:

javax.servlet.ServletContextListener              ServletContext监听器

javax.servlet.ServletRequestListener              ServletRequest监听器

javax.servlet.http.HttpSessionListener           HttpSession监听器

 

一类是:属性监听器

javax.servlet.ServletContextAttributeListener       ServletContext属性监听器

javax.servlet.http.HttpSessionAttributeListener   HttpSession属性监听器

javax.servlet.ServletRequestAttributeListener       Request属性监听器

 

生命周期监听器和属性监听器,一定要在web.xml文件中配置之后才会生效

 

<listener>

    <listener-class>全类名</listener-class>

</listener>

 

一类是:对象监听器。

javax.servlet.http.HttpSessionActivationListener           保存到Session域中的对象,活化和钝化的监听器

javax.servlet.http.HttpSessionBindingListener                对象被绑定到Session域中的监听器

 

 

2.1、生命周期监听器

所有生命周期监听器的使用是一样的。

第一步:我们需要定义一个类。然后去继承生命周期的监听器接口。

第二步:然后在Web.xml文件中配置。

 

 

生命周期监听器两个方法:

public void requestInitialized(ServletRequestEvent sre) Request对象的创建回调

public void requestDestroyed(ServletRequestEvent sre) Request对象的销毁回调

 

 

我们以Request的监听器为例演示如下:

 

1)创建一个RequestListener类实现ServletRequestListener接口。

 

package com.atguigu.listener;

 

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

 

/**

 * Request生命周期监听器

 */

public class RequestListener implements ServletRequestListener {

 

    public RequestListener() {

    }

 

    /**

     * Request销毁回调

     */

    public void requestDestroyed(ServletRequestEvent sre) {

        System.out.println("request对象销毁了");

    }

 

    /**

     * Request对象创建回调

     */

    public void requestInitialized(ServletRequestEvent sre) {

        System.out.println("request对象创建了");

    }

 

}

 

 

2)在web.xml文件中的配置如下:

 

  <listener>

    <listener-class>com.atguigu.listener.RequestListener</listener-class>

  </listener>

 

 

3)这个时候,我们随便访问工程下的任何路径,后台都会如下打印:

 

因为前面我们说过。每次请求进来的时候,Tomcat服务器都会为这次请求创建一个Request对象

 

2.2、属性监听器

 

所有属性监听器的使用也是一样的。

第一步:都是先定义一个类来实现属性监听器的接口。

第二步:然后在web.xml中配置。

 

 

属性监听器有三个回调方法

public void attributeAdded          属性添加

public void attributeRemoved        属性移除

public void attributeReplaced       属性替换

 

 

我们以Request的属性监听器为例演示:

 

1)定义一个RequestAttributeListener类实现ServletRequestAttributeListener 接口

 

package com.atguigu.listener;

 

import javax.servlet.ServletRequestAttributeEvent;

import javax.servlet.ServletRequestAttributeListener;

 

/**

 * @author wzg

 */

public class RequestAttributeListener implements ServletRequestAttributeListener {

    /**

     * 添加属性

     */

    public void attributeAdded(ServletRequestAttributeEvent srae) {

        System.out.println("请求对象添加属性-" + srae.getName() + " : " + srae.getValue());

    }

    /**

     * 添加属性

     */

    public void attributeRemoved(ServletRequestAttributeEvent srae) {

        System.out.println("请求对象移除属性-" + srae.getName() + " : " + srae.getValue());

    }

    /**

     * 添加属性

     */

    public void attributeReplaced(ServletRequestAttributeEvent srae) {

        System.out.println("请求对象替换属性-" + srae.getName() + " : " + srae.getValue());

    }

}

 

2)编写requestAttrListenerTest.jsp测试代码如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

    <head>

        <meta http-equiv="pragma" content="no-cache" />

        <meta http-equiv="cache-control" content="no-cache" />

        <meta http-equiv="Expires" content="0" />

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Insert title here</title>

    </head>

    <body>

        <%

            //第一次设置不添加

            request.setAttribute("abc", "abc-Value");

            Thread.sleep(2000);

       

            //第二次设置不替换

            request.setAttribute("abc", "new-abc-Value");

            Thread.sleep(2000);

           

            // 请求移除属性

            request.removeAttribute("abc");

        %>

        请求属性测试页面

    </body>

</html>

3)打开浏览器访问上面的页面。控制台提示如下:

其他Session属性监听器,ServletContext属性监听器的使用一样。

 

2.3、对象随Session活化、钝化监听器

javax.servlet.http.HttpSessionActivationListener           HttpSession活化,钝化监听器

 

    public void sessionWillPassivate()     钝化的回调

    public void sessionDidActivate()       活化的回调

 

大家可能会想,它跟前面的监听器一样,监听的是Session对象的活化和钝活。其实不尽然。它监听的是在Session域对象中存放的对象的活化和钝化。

比如说。我们把一个Bean对象存放到Session域对象中。当Session对象被活化和钝活的时候。这个Bean就会调用活化钝活监听器的方法。那怎么使用呢。我们需要在监听的对象上实现HttpSessionActivationListener接口和Serializable接口。

 

1)定义一个Person类实现上面两个接口。

 

package com.atguigu.bean;

 

import java.io.Serializable;

 

import javax.servlet.http.HttpSessionActivationListener;

import javax.servlet.http.HttpSessionEvent;

 

/**

 * HttpSessionActivationListener是活化,钝活的监听器<br/>

 * Serializable 是序列化接口

 *

 * @author wzg

 *

 */

public class Person implements HttpSessionActivationListener, Serializable {

 

    private static final long serialVersionUID = 1L;

    private int age;

    private String name;

 

    public Person(int age, String name) {

        super();

        this.age = age;

        this.name = name;

    }

 

    public Person() {

        super();

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    @Override

    public String toString() {

        return "Person [age=" + age + ", name=" + name + "]";

    }

 

    /**

     * 钝化的回调

     */

    public void sessionWillPassivate(HttpSessionEvent se) {

        System.out.println(toString() + "--被钝化");

    }

 

    /**

     * 活化的回调

     */

    public void sessionDidActivate(HttpSessionEvent se) {

        System.out.println(toString() + "--被活化");

    }

 

}

 

 

2)创建一个sessionActivationListenerTest.jsp页面,内容如下:

 

<%@page import="com.atguigu.bean.Person"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

    <head>

        <meta http-equiv="pragma" content="no-cache" />

        <meta http-equiv="cache-control" content="no-cache" />

        <meta http-equiv="Expires" content="0" />

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Insert title here</title>

    </head>

    <body>

        <%

            Person person = new Person(12,"json");

            System.out.println("把Person保存到Session域对象中");

            session.setAttribute("person", person);

        %>

        Session的活化,钝化,监听器测试!

    </body>

</html>

 

 

3)访问上面的jsp页面。然后正常停止 Toncat 服务器,让Session钝化到硬盘。

 

 

4)启动Tomcat服务器,让Session活化到内存。

2.4、Session对象绑定监听器

javax.servlet.http.HttpSessionBindingListener                对象被绑定到Session域中的监听器

 

    public void valueBound(HttpSessionBindingEvent event)       对象设置在Session域对象中的回调函数

    public void valueUnbound(HttpSessionBindingEvent event)     对象不在Session域对象中的回调函数

 

这个监听器的作用是监听对象有没有在Session域对象中。使用的时候需要让对象实现这个接口。然后在对象被附加到域对象中或移除了会自动调用。

 

1)修改前面的Person对象,再实现HttpSessionBindingListener接口。

 

package com.atguigu.bean;

 

import java.io.Serializable;

 

import javax.servlet.http.HttpSessionActivationListener;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

import javax.servlet.http.HttpSessionEvent;

 

/**

 * HttpSessionActivationListener是活化,钝活的监听器<br/>

 * Serializable 是序列化接口

 *

 * @author wzg

 *

 */

public class Person implements HttpSessionActivationListener, HttpSessionBindingListener,

        Serializable {

 

    private static final long serialVersionUID = 1L;

    private int age;

    private String name;

 

    public Person(int age, String name) {

        super();

        this.age = age;

        this.name = name;

    }

 

    public Person() {

        super();

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    @Override

    public String toString() {

        return "Person [age=" + age + ", name=" + name + "]";

    }

 

    /**

     * 钝化的回调

     */

    public void sessionWillPassivate(HttpSessionEvent se) {

        System.out.println(toString() + "--被钝化");

    }

 

    /**

     * 活化的回调

     */

    public void sessionDidActivate(HttpSessionEvent se) {

        System.out.println(toString() + "--被活化");

    }

 

    @Override

    public void valueBound(HttpSessionBindingEvent event) {

        System.out.println(toString() + "-- 被设置到Session域对象中");

    }

 

    @Override

    public void valueUnbound(HttpSessionBindingEvent event) {

        System.out.println(toString() + "-- 从Session域对象中移除");

    }

 

}

 

2)添加sessionBindingListenerTest.jsp页面,测试sessionBindingListener监听器代码

 

 

<%@page import="com.atguigu.bean.Person"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

    <head>

        <meta http-equiv="pragma" content="no-cache" />

        <meta http-equiv="cache-control" content="no-cache" />

        <meta http-equiv="Expires" content="0" />

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Insert title here</title>

    </head>

    <body>

        <%

            Person person = new Person(12,"json");

            System.out.println("把Person保存到Session域对象中");

            session.setAttribute("person", person);

            Thread.sleep(3000);

            session.removeAttribute("person");

        %>

        Session的活化,钝化,监听器测试!

    </body>

</html>

 

 

3)打开浏览器访问sessionBindingListenerTest.jsp页面,控制台打印如下:

 

 

 

3、i18n国际化

什么是i18n国际化?

  • 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问。
  • 关于国际化我们想到的最简单的方案就是为不同的国家创建不同的网站,比如苹果公司,他的英文官网是:http://www.apple.com而中国官网是http://www.apple.com/cn
  • 苹果公司这种方案并不适合全部公司,而我们希望相同的一个网站,而不同人访问的时候可以根据用户所在的区域显示不同的语言文字,而网站的布局样式等不发生改变。
  • 于是就有了我们说的国际化,国际化总的来说就是同一个网站不同国家的人来访问可以显示出不同的语言。但实际上这种需求并不强烈,一般真的有国际化需求的公司,主流采用的依然是苹果公司的那种方案,为不同的国家创建不同的页面。所以国际化的内容我们了解一下即可。
  • 国际化的英文Internationalization,但是由于拼写过长,老外想了一个简单的写法叫做I18N,代表的是Internationalization这个单词,以I开头,以N结尾,而中间是18个字母,所以简写为I18N。以后我们说I18N和国际化是一个意思。

 

 

 

3.1、国际化资源测试:

国际化相关的类:

Locale表示时区,地区信息

ResourceBundle可以根据时区信息,获取相应资源包信息

 

多国语言的资源包命名规则:

basename.properties                                默认的语言

basename_语言_国家.properties          具体国家的语言信息

 

如下:

i18n.properties                         表示默认的国际化的资源文件

i18n_zh_CN.properties            表示中文的国际化的资源文件

i18n_en_US.properties            表示英文的国际化的资源文件

 

 

 

 

 

 

 

package com.atguigu.bean;

 

import java.util.Locale;

import java.util.ResourceBundle;

 

import org.junit.Test;

 

public class I18nTest {

 

    /**

     * 测试Locale的时区

     */

    @Test

    public void test1() {

        // 获取默认的时区信息

        // zh_CN 表示中文,和中国

        Locale zh_locale = Locale.getDefault();

        System.out.println(zh_locale);// zh_CN

        // en_US 是表示 英语 和美国

        Locale en_locale = Locale.US;

        System.out.println(en_locale); // en_US

        System.out.println("-----------------------------------------");

        // 打印所有可用的时区

        Locale[] ls = Locale.getAvailableLocales();

        for (Locale locale : ls) {

            System.out.println(locale);

        }

    }

   

    @Test

    public void test2() {

        // 获取不同的时区

        Locale zhLocale = Locale.CHINA;

        Locale enLocale = Locale.US;

//      System.out.println(zhLocale);

        // 通过baseName 和 地区信息 加载相应的资源文件

        // i18n是资源文件的基础名。locale是基础名后的语言和国家

        ResourceBundle resourceBundle = ResourceBundle.getBundle("i18n", zhLocale);

        // 获取 email的值

        String email = resourceBundle.getString("email");

        System.out.println(email);

        // 获取 email的值

        String password = resourceBundle.getString("password");

        System.out.println(password);

    }

   

}

3.2、通过请求国际化页面

我们通过request.getLocale() 方法可以获取到请求头中携带过来的语言信息。

然后再把这个Locale做为参数传到ResourceBundle.getBundle中获取对应语言的资源

 

 

<%@page import="java.util.ResourceBundle"%>

<%@page import="java.util.Locale"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="Expires" content="0" />

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

    <%

        // 从请求头中获取,语言信息。

        Locale locale = request.getLocale();

        System.out.println(locale);

        // 读取对应地区的资源

        ResourceBundle resourceBundle = ResourceBundle.getBundle("i18n", locale);

    %>

</head>

<body>

    <a href="">中文</a>|

    <a href="">english</a>

    <center>

        <h1><%= resourceBundle.getString("regist") %></h1>

        <table>

        <form>

            <tr>

                <td><%= resourceBundle.getString("username") %></td>

                <td><input name="username" type="text" /></td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("password") %></td>

                <td><input type="password" /></td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("sex") %></td>

                <td>

                    <input type="radio" /><%= resourceBundle.getString("boy") %>

                    <input type="radio" /><%= resourceBundle.getString("girl") %>

                </td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("email") %></td>

                <td><input type="text" /></td>

            </tr>

            <tr>

                <td colspan="2" align="center">

                <input type="reset" value="<%= resourceBundle.getString("reset") %>" />&nbsp;&nbsp;

                <input type="submit" value="<%= resourceBundle.getString("submit") %>" /></td>

            </tr>

            </form>

        </table>

        <br /> <br /> <br /> <br />

    </center>

    国际化测试:

    <br /> 1、访问页面,通过浏览器设置,请求头信息确定国际化语言。

    <br /> 2、通过左上角,手动切换语言

</body>

</html>

 

 

请求头中携带的客户端语言信息。查看如下

 

那么请求头中携带的客户端语言信息,是由什么决定的呢。这里我们以谷歌浏览器为例。

 

1) 打开浏览器----->>>>设置菜单

 

 

2)显示高级设置----->>>>>语言和输入设置

 

 

3)把你希望显示的语言托在最前面即可改变默认请求头中携带的语言

 

 

3.3、通过点击 中文|english切换中英文

通过点击 中文|english 切换中英文的显示,只需要在点击的连接上,传递需要显示的Locale的参数即可。

 

 

<%@page import="java.util.ResourceBundle"%>

<%@page import="java.util.Locale"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="Expires" content="0" />

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

    <%

        // 从请求头中获取,语言信息。

        String lanStr = (String) request.getParameter("lan");

        String contryStr = (String) request.getParameter("country");

        Locale locale = null;

        // 如果是默认访问,则使用浏览器默认设置的语言

        if (lanStr == null) {

            // 获取浏览器请求头中带过来的语言

            locale = request.getLocale();

        } else {

            // 如果有请求参数。则通过参数创建Locale对象

            locale = new Locale( lanStr , contryStr );

        }

        System.out.println(locale);

        // 读取对应地区的资源

        ResourceBundle resourceBundle = ResourceBundle.getBundle("i18n", locale);

    %>

</head>

<body>

    <a href="i18n.jsp?lan=zh&country=CN">中文</a>|

    <a href="i18n.jsp?lan=en&country=US">english</a>

    <center>

        <h1><%= resourceBundle.getString("regist") %></h1>

        <table>

        <form>

            <tr>

                <td><%= resourceBundle.getString("username") %></td>

                <td><input name="username" type="text" /></td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("password") %></td>

                <td><input type="password" /></td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("sex") %></td>

                <td>

                    <input type="radio" /><%= resourceBundle.getString("boy") %>

                    <input type="radio" /><%= resourceBundle.getString("girl") %>

                </td>

            </tr>

            <tr>

                <td><%= resourceBundle.getString("email") %></td>

                <td><input type="text" /></td>

            </tr>

            <tr>

                <td colspan="2" align="center">

                <input type="reset" value="<%= resourceBundle.getString("reset") %>" />&nbsp;&nbsp;

                <input type="submit" value="<%= resourceBundle.getString("submit") %>" /></td>

            </tr>

            </form>

        </table>

        <br /> <br /> <br /> <br />

    </center>

    国际化测试:

    <br /> 1、访问页面,通过浏览器设置,请求头信息确定国际化语言。

    <br /> 2、通过左上角,手动切换语言

</body>

</html>

 

 

 

 

3.4、fmt标签国际化

记得要先添加JSTL类库taglibs-standard-impl-1.2.1.jar和taglibs-standard-spec-1.2.1.jar

<fmt:setLocale value=""/>           设置Locale的值 en_US   zh_CN
<fmt:setBundle basename="" />               设置加载资源的basename
<fmt:message key="" />                       设置要输出的key
 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="Expires" content="0" />

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

    <!-- 设置连接和参数 -->

    <a href="i18n_fmt.jsp?locale=zh_CN">中文</a>|

    <a href="i18n_fmt.jsp?locale=en_US">english</a>

 

    <!-- 设置locale的值为中文环境 -->

    <fmt:setLocale value="${ param.locale }" />

    <!-- 设置 加载资源的basename名 -->

    <fmt:setBundle basename="i18n" />

   

    <center>

        <!-- 输出注册 -->

        <h1><fmt:message key="regist" /></h1>

        <table>

        <form>

            <tr>

                <!-- 输出用户名 -->

                <td><fmt:message key="username" /></td>

                <td><input name="username" type="text" /></td>

            </tr>

            <tr>

                <!-- 输出密码 -->

                <td><fmt:message key="password" /></td>

                <td><input type="password" /></td>

            </tr>

            <tr><!-- 输出sex -->

                <td><fmt:message key="sex" /></td>

                <td>

                            <!-- 输出--男 -->

                    <input type="radio" /><fmt:message key="boy" />

                            <!-- 输出--女 -->

                    <input type="radio" /><fmt:message key="girl" />

                </td>

            </tr>

            <tr>

                <!-- 输出--邮箱 -->

                <td><fmt:message key="email" /></td>

                <td><input type="text" /></td>

            </tr>

            <tr>

                <td colspan="2" align="center">

                <!-- 输出--重置 -->

                <input type="reset" value="<fmt:message key="reset" />" />&nbsp;&nbsp;

                <!-- 输出--提交 -->

                <input type="submit" value="<fmt:message key="submit" />" /></td>

            </tr>

            </form>

        </table>

        <br /><br /><br /><br />

    </center>

</body>

</html>

 

 

 

3.5、国际化参数

在国际化配置文件中的配置:

hello=hello{0},{1},{0}                   en_US的配置

hello=\u4F60\u597D{0},{1},{0}           zh_CN 的配置

 

 

带参数的输出:

 

    <fmt:message key="hello">

        <fmt:param value="这是第一个值"/>

        <fmt:param value="这是第二个值"/>

    </fmt:message>

 

 

输出的结果:

 

 --------------------------------------------------------------------------------------------------------------------------

zh_CN      中文--中国

en_US      英语--美国

en_US 英文 (美国)

zh 中文
zh_CN 中文 (中国)
zh_HK 中文 (香港)
zh_TW 中文 (台湾)

ar 阿拉伯文
ar_AE 阿拉伯文 (阿拉伯联合酋长国)
ar_BH 
阿拉伯文 (巴林)
ar_DZ 
阿拉伯文 (阿尔及利亚)
ar_EG 
阿拉伯文 (埃及)
ar_IQ 
阿拉伯文 (伊拉克)
ar_JO 
阿拉伯文 (约旦)
ar_KW 
阿拉伯文 (科威特)
ar_LB 
阿拉伯文 (黎巴嫩)
ar_LY 
阿拉伯文 (利比亚)
ar_MA 
阿拉伯文 (摩洛哥)
ar_OM 
阿拉伯文 (阿曼)
ar_QA 
阿拉伯文 (卡塔尔)
ar_SA 
阿拉伯文 (沙特阿拉伯)
ar_SD 
阿拉伯文 (苏丹)
ar_SY 
阿拉伯文 (叙利亚)
ar_TN 
阿拉伯文 (突尼斯)
ar_YE 
阿拉伯文 (也门)
be 
白俄罗斯
be_BY 
白俄罗斯文 (白俄罗斯)
bg 
保加利亚
bg_BG 
保加利亚文 (保加利亚)
ca 加泰罗尼亚文
ca_ES 加泰罗尼亚文 (
西班牙)
ca_ES_EURO
加泰罗尼亚文 (西班牙,Euro)
cs 
捷克
cs_CZ 
捷克文 (捷克共和国)
da 
丹麦
da_DK 
丹麦文 (丹麦)
de 德文
de_AT 德文 (
奥地利)
de_AT_EURO
德文 (奥地利,Euro)
de_CH
德文 (瑞士)
de_DE
德文 (德国)
de_DE_EURO 德文 (德国,Euro)
de_LU 德文 (
卢森堡)
de_LU_EURO
德文 (卢森堡,Euro)
el 
希腊文
el_GR 希腊文 (希腊)
en_AU 英文 (
澳大利亚)
en_CA
英文 (加拿大)
en_GB 英文 (英国)
en_IE 英文 (
爱尔兰)
en_IE_EURO
英文 (爱尔兰,Euro)
en_NZ
英文 (新西兰)
en_ZA
英文 (南非)
es 
西班牙
es_BO 
西班牙文 (玻利维亚)
es_AR 
西班牙文 (阿根廷)
es_CL 
西班牙文 (智利)
es_CO 
西班牙文 (哥伦比亚)
es_CR 
西班牙文 (哥斯达黎加)
es_DO 
西班牙文 (多米尼加共和国)
es_EC 
西班牙文 (厄瓜多尔)
es_ES 
西班牙文 (西班牙)
es_ES_EURO 
西班牙文 (西班牙,Euro)
es_GT 
西班牙文 (危地马拉)
es_HN 
西班牙文 (洪都拉斯)
es_MX 
西班牙文 (墨西哥)
es_NI 
西班牙文 (尼加拉瓜)
et 
爱沙尼亚
es_PA 
西班牙文 (巴拿马)
es_PE 
西班牙文 (秘鲁)
es_PR 
西班牙文 (波多黎哥)
es_PY 
西班牙文 (巴拉圭)
es_SV 
西班牙文 (萨尔瓦多)
es_UY 
西班牙文 (乌拉圭)
es_VE 
西班牙文 (委内瑞拉)
et_EE 
爱沙尼亚文 (爱沙尼亚)
fi 
芬兰
fi_FI 
芬兰文 (芬兰)
fi_FI_EURO 
芬兰文 (芬兰,Euro)
fr 法文
fr_BE 法文 (
比利时)
fr_BE_EURO
法文 (比利时,Euro)
fr_CA
法文 (加拿大)
fr_CH 法文 (
瑞士)
fr_FR
法文 (法国)
fr_FR_EURO 法文 (法国,Euro)
fr_LU 法文 (
卢森堡)
fr_LU_EURO
法文 (卢森堡,Euro)
hr 
克罗地亚
hr_HR 
克罗地亚文 (克罗地亚)
hu 
匈牙利
hu_HU 
匈牙利文 (匈牙利)
is 冰岛文
is_IS 冰岛文 (冰岛)
it 意大利文
it_CH 意大利文 (
瑞士)
it_IT
意大利文 (意大利)
it_IT_EURO 意大利文 (意大利,Euro)
iw 希伯来文
iw_IL 希伯来文 (以色列)
ja 日文
ja_JP 日文 (日本)
ko 朝鲜文
ko_KR 朝鲜文 (南朝鲜)
lt 立陶宛文
lt_LT 立陶宛文 (立陶宛)
lv 拉托维亚文(列托)
lv_LV 拉托维亚文(列托) (拉脱维亚)
mk 马其顿文
mk_MK 马其顿文 (马其顿王国)
nl 荷兰文
nl_BE 荷兰文 (
比利时)
nl_BE_EURO
荷兰文 (比利时,Euro)
nl_NL
荷兰文 (荷兰)
nl_NL_EURO 荷兰文 (荷兰,Euro)
no 挪威文
no_NO 挪威文 (挪威)
no_NO_NY 挪威文 (挪威,Nynorsk)
pl 波兰文
pl_PL 波兰文 (波兰)
pt 葡萄牙文
pt_BR 葡萄牙文 (巴西)
pt_PT 葡萄牙文 (葡萄牙)
pt_PT_EURO 葡萄牙文 (葡萄牙,Euro)
ro 罗马尼亚文
ro_RO 罗马尼亚文 (罗马尼亚)
ru 俄文
ru_RU 俄文 (俄罗斯)
sh 塞波尼斯-
克罗地亚
sh_YU 塞波尼斯-
克罗地亚文 (南斯拉夫)
sk 斯洛伐克文
sk_SK 斯洛伐克文 (斯洛伐克)
sl 斯洛文尼亚文
sl_SI 斯洛文尼亚文 (斯洛文尼亚)
sq 阿尔巴尼亚文
sq_AL 阿尔巴尼亚文 (阿尔巴尼亚)
sr 塞尔维亚文
sr_YU 塞尔维亚文 (南斯拉夫)
sv 瑞典文
sv_SE 瑞典文 (瑞典)
th 泰文
th_TH 泰文 (泰国)
tr 土耳其文
tr_TR 土耳其文 (土耳其)
uk 乌克兰文
uk_UA 乌克兰文 (乌克兰)

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值