亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

解析Asp.net中資源本地化的實現

2019-11-18 16:51:26
字體:
來源:轉載
供稿:網友

   本文將從asp.net實現資源全球化和本地化的基本概念入手,闡述在Asp.net1.1和Asp.net2.0中實現全球化和本地化的步驟、方法。

一.基本概念

1.為什么要實現資源的本地化?

        我們的站點可能為全球各個國家和地區的人所瀏覽,每個國家和地區的人都有自身的語言文化特點。就拿咱們偉大的祖國為例,中國大陸用簡體中文,港澳臺則使用繁體中文。另外各個國家對于貨幣、數字、日歷等信息的表達格式各有不同,我們國家多使用年月日的格式,而美國則是月日年。諸如此類的區別林林總總,我也就不多舉例了。為了給我們的網站瀏覽者更好的用戶體驗,我們應該提供一個全球化的解決方案,只要用戶選擇了他的語言和區域,站點就按照他的語言文化習慣來展現頁面信息,這個過程可以叫做本地化。

2.區域性、固定區域性、非特定區域性、特定區域性

        區域性名稱遵循 RFC 1766 標準,格式為“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是從 ISO 639-1 派生的由兩個小寫字母構成的代碼,<country/regioncode2> 是從 ISO 3166 派生的由兩個大寫字母構成的代碼。例如,美國英語為“en-US”。在雙字母語言代碼不可用的情況中,將使用從 ISO 639-2 派生的三字母代碼;例如,三字母代碼“div”用于使用 Dhivehi 語言的區域。某些區域性名稱帶有指定書寫符號的后綴;例如“-Cyrl”指定西里爾語書寫符號,“-Latn”指定拉丁語書寫符號。舉例:

區域性名稱

區域性標識符

語言-國家/地區

zh-CN

0x0804

中文-中國

zh-TW

0x0404

中文-臺灣

zh-CHS

0x0004

簡體中文

zh-CHT

0x7C04

繁體中文

en

0x0009

英語

en-US

0x0409

英語-美國

en-GB

0x0809

英語-英國

uz-UZ-Cyrl

0x0843

烏茲別克語(西里爾語)- 烏茲別克斯坦

uz-UZ-Latn

0x0443

烏茲別克語(拉?。?/SPAN>- 烏茲別克斯坦

         固定區域性不區分區域性??梢允褂每兆址?("") 按名稱或者按區域性標識符 0x007F 來指定固定區域性。固定區域性由CultureInfo類的InvariantCulture屬性來代表固定區域性的實例。固定區域性僅與英語語言關聯,不與任何國家/地區關聯。它幾乎可用在要求區域性的“全局化”命名空間中的所有方法中。如果你的程序進行字符串比較或大小寫更改操作,則應該使用 InvariantCulture 確保無論系統如何設置的區域性,行為都將按照InvariantCulture所代表的英語語言的固定區域性來完成。但是,固定區域性必須僅由需要不依賴區域性的結果的進程(如系統服務)使用;否則,它得到的結果可能在語言上不正確,或者在文化上不合適。舉例:CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture;這兩行代碼的作用相同,目的是獲得固定區域性實例。

        比如你現在要對一個DateTime的實例dateTime執行dateTime.ToString()方法。這個方法實際是使用你當前線程的CurrentCulture作為默認的區域性,根據這個區域性將日期實例轉化為相應的字符串形式。那么如果我們此時不需要它按照線程或系統的區域性進行ToString操作,那么我們應該用這個方法dateTime.ToString(“G”, CultureInfo.InvariantCulture)或者dateTime.ToString(“G”, DateTimeFormatInfo.InvariantInfo)。

        非特定區域性是與某種語言關聯但不與國家/地區關聯的區域性。特定區域性是與某種語言和某個國家/地區關聯的區域性。例如,“en”是非特定區域性,而“en-US”是特定區域性。注意,“zh-CHS”(簡體中文)和“zh-CHT”(繁體中文)均為非特定區域性。

        區域性有層次結構,即特定區域性的父級是非特定區域性,而非特定區域性的父級是 InvariantCulture。CultureInfo類的Parent屬性將返回與特定區域性關聯的非特定區域性。如果特定區域性的資源在系統中不存在,或因其它原因不可用,則使用非特定區域性的資源;如果非特定區域性的資源也不可用,那么使用主程序集中嵌入的資源。

3.實現本地化常用的類型、屬性和方法

        CultureInfo類表示有關特定區域性的信息,包括區域性的名稱、書寫體系和使用的日歷,以及有關對常用操作(如格式化日期和排序字符串)提供信息的區域性特定對象的訪問。CultureInfo類的實例化一般有兩個途徑,如下所示:
CultureInfo culture = CultureInfo. CreateSpecificCulture (name);
CultureInfo culture = new CultureInfo(name);

        二者的區別是,使用第一種方法,只能創建固定區域性或特定區域性的CultureInfo實例。如果name為空字符串,則建立固定區域性的實例,如果name為非特定區域性,那么建立name 關聯的默認特定區域性的 CultureInfo實例。第二種方法,則是建立一個name所指定的區域性的CultureInfo實例,它可以是固定的,非特定的或特定區域性的。

        Thread類的CurrentCulture屬性用來獲取或設置當前線程的區域性。它必須被設置為特定區域性。Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");如果Thread.CurrentThread.CurrentCulture = new CultureInfo("en ");就會報錯!

        Thread類的CurrentUICulture屬性用來獲取或設置資源管理器使用的當前區域性以便在運行時查找區域性特定的資源。這里的資源管理器可以關聯為ResourceManger類。
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

        ResourceManger類可以查找區域性特定的資源,當本地化資源不存在時提供代用資源,并支持資源序列化。常用的ResourceManager的構造函數是public ResourceManager(string,Assembly)。其含義是初始化 ResourceManager類的新實例,它使用指定的根名稱從給定的Assembly中查找資源文件。所謂根名稱是例如名為“MyResource.en-US.resources”的資源文件的根名稱為“MyResource”。在根名稱的表達中可以加上命名空間,如“MyWebSite.Resource.UserFolder. MyResource”。而Assembly可以是需要調用資源文件的頁面所在的Assembly,如typeof(MyPage).Assembly。ResourceManager類的GetString方法用來獲得資源文件中的指定鍵的值。舉例:當已設置了線程的CurrentUICulture屬性之后按如下方法。
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");

如果想按照指定的區域性來獲得資源則按照如下寫法:
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("welcome",ci);


二.在Asp.net1.1中實現資源本地化

        首先應在網站項目WebTest中建立一個Resource文件夾,在這個文件夾中存放整個項目公用的資源文件。比如我們建立了以下三個資源文件:MyResource.en.resx,MyResource.en-US.resx,MyResource.zh-CN.res。每個資源文件中都有兩個鍵值對,鍵值為State和Address。在需要使用資源文件的頁面MyPage.aspx中調用資源文件,如下所示:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("State");
Label2.Text = rm.GetString("Address");

好了,這個時候Label1和Label2就按照MyResource.zh-CN.resx文件中的規定顯示“州”和“地址”。以上是一個最基本最簡單的本地化方法,這里隱含著一些問題,我們來逐一解決并優化該方法。

1. 如何獲得用戶的默認區域性

        通過用戶瀏覽器“屬性”->“語言”選項里的設置,取最上面那條作為用戶的默認語言。
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;

        一般情況下,設定CurrentCulture和CurrentUICulture具有相同的區域性,當然也可以不相同,比如你規定CurrentCulture為en-US,而CurrentUICulture為zh-CN。那么這樣造成的效果是,頁面中貨幣、日期等信息都按照美國英語的格式顯示,而需要從資源文件中取值的內容,資源管理器會從MyResource.zh-CN.resx文件里獲得。

        如果你的站點頁面上并沒有提供讓用戶選擇語言的功能,那么也就是默認按照用戶瀏覽器設置的區域性進行顯示,因此你就可以把上述代碼放在Global.asax.cs文件的application_BeginRequest方法中。這樣每次用戶對頁面發出請求時,我們的程序都會首先進行區域性設置。

2. 記住用戶的區域性設置

        通過會話可以記住瀏覽者的區域性設置或選擇。但是這個操作不能在Global.asax.cs文件中Application_BeginRequest方法中進行,因為那時會話還處于不可用狀態。如果你的站點并沒有提供讓用戶選擇語言的功能,那么你也沒什么必要記住用戶的區域性設置,只要按照上面介紹的在Global.asax.cs文件中Application_BeginRequest方法里設置一下就可以了,不影響性能。這主要可以避免用戶在中途突然改變了瀏覽器中語言的設置,而網站仍按照會話中存儲的區域性為用戶顯示頁面內容的沖突。

        如果你提過了讓用戶選擇語言的功能,那顯然要在頁面程序中使用會話來記錄用戶的區域性選擇。因為從客戶端到服務器段的每次請求,服務器段都會開啟一個新的線程進行處理和響應。如果你的程序沒有記住客戶的選擇,那么只能按照默認的區域性進行響應。

3. 資源管理器如何查找指定區域性的相應資源文件?

        在執行取值操作時,也就是執行ResourceManager類的GetString方法時,資源管理器會按照當前線程的CurrentUICulture屬性去尋找相對應的資源文件。有如下幾種情況:
(1). 比如當前CurrentUICulture對應的區域性是en-US,那么首先找MyResource.en-US.resx是否存在,如存在則從中取值;如不存在,則看MyResource.en.resx是否存在。
(2). 比如當前CurrentUICulture對應的區域性是en,因為en是非特定區域性的,那么首先找其默認關聯的特定區域性en-US的資源文件MyResource.en-US.resx是否存在,如存在則從中取值;如不存在,則看MyResource.en.resx是否存在。
(3). 比如當前CurrentUICulture對應的區域性是en-GB,那么首先找資源文件MyResource.en-GB.resx,如不存在,則看MyResource.en.resx是否存在,如存在則從中取值;如也不存在,則看en關聯的默認特定區域性en-US的資源文件MyResource.en-US.resx是否存在,如果此時MyResource.en-US.resx不存在,但是MyResource.en-CA.resx存在,則程序依然會拋出找不到合適資源文件的異常。

        因此我們可以總結一下,當前線程CurrentUICulture對應的是特定區域性時,資源管理器優先查找此特定區域性對應的資源文件,如果沒找到,則去找其非特定區域性的資源文件,如果還沒找到,再去找其非特定區域性關聯的默認區域性的資源文件。當前線程CurrentUICulture對應的是非特定區域性時,資源管理器優先查找此非特定區域性對應的默認特定區域性的資源文件是否存在,如果不存在,則去看此非特定區域性對應的資源文件是否存在,如果也不存在則拋出異常。

4.如何處理未提供本地化支持的區域性?

        如果站點沒有提供相應的資源文件支持用戶默認的區域性,那么必須將其當前線程的CurrentUICulture轉化為你站點默認的區域性,比如en-US或zh-CN。轉化的時機有兩個:
一是當你在獲得Request.UserLanguages[0]時,用其與配置文件中預先設定的被支持的區域性進行比較,如果確認其為不被支持的,那么立刻設置CurrentUICulture為默認區域性。
二是在使用ResourceManager的GetString方法進行取值的時候,使用try catch結構,捕獲MissingManifestResourceException異常,在異常處理中,首先將CurrentUICulture設為默認區域性,之后再重新使用GetString取值。

5. 通過Web.config設定站點默認的culture和uiCulture

        <globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="zh-CN" culture="en-US"/>
如上所示:規定站點的默認culture為en-US(此處必須為特定區域性),uiCulture為zh-CN。

        當然你也可以在每個頁面的Page標簽中進行逐頁設定:<@Page Culture=“zh-CN” UICulture=“en”>。這里就不管web.config是如何設置的,頁面會按照Page標簽的設定進行顯示。

三.在Asp.net2.0 中實現資源本地化

        Asp.net2.0中為資源本地化提供了更加多樣的實現方法。我這里著重談其與Asp.net1.1中的不同之處。

1.通過Web.config設定站點默認的culture和uiCulture

        在Asp.net1.1中使用web.config文件進行站點區域性設定的方法已經講過了,而在Asp.net2.0中其更加靈活。通常,您會想要站點中的所有頁面都符合相同的區域性設置。只需按如下所示在web.config中,為globalization元素的UICulture 和 Culture(區域性)屬性分配一個站點范圍的“auto”值, 注意這個“auto”值在Asp.net1.1中是不被接受的。<globalization uiCulture="auto" culture="auto" /> auto的意義在于ASP.NET 通過檢查瀏覽器發送的 HTTP 標題獲取到的用戶首選區域性設置,并使用這個區域性設置站點的默認區域性,即當前線程的CurrentUICulture和CurrentCulture屬性。

        除了自動設置以外,您還可以為 Asp.net 指定一個站點的默認區域性: <globalization uiCulture="auto:zh-CN" culture="auto:zh-CN" /> 注意:只有當ASP.NET無法找到 HTTP 標題來確定用戶的首選區域性,比如瀏覽器的“屬性”->“語言”中沒有任何區域性設置完全是空的時候,auto后面設定的默認區域性才會生效。

        在web.config中進行了globalization配置之后,你的應用程序不需要寫任何代碼,線程的CurrentUICulture和CurrentCulture就會按照在globalization元素中設置的uiCulture和culture屬性值獲得區域性設置。如果沒有進行globalization配置,則線程的CurrentUICulture和CurrentCulture就會默認為en-US。

2.使用Web.config文件跟蹤用戶的區域性選擇

        在Asp.net1.1中,那些提供了區域性選擇的站點,一般使用會話來記錄用戶的選擇,以便在用戶每次對站點發出請求時,都按照用戶選擇的區域性對顯示內容進行本地化。在Asp.net2.0中提供了另一個方法,那就是使用web.config文件來跟蹤用戶的區域性選擇。

        您可以在web.config文件中添加一個名為 LanguagePReference 的基于字符串的配置文件屬性來支持匿名識別用戶區域性的功能。請注意anonymousIdentification元素的enabled屬性必須為“true”,否則匿名識別功能就不可用。
<anonymousIdentification enabled="true"/>
<profile>
    <properties>
        <add name="LanguagePreference" type="string"  defaultValue="auto" allowAnonymous="true" />
    </properties>
</profile>

下面我將闡述在Asp.net2.0中如何針對LanguagePreference屬性編程。首先,可以寫一個PageBase類,它繼承自System.Web.UI.Page,并作為站點中所有頁面類的基類。這么做的目的其實很簡單,就是為了將各個頁面中一些共同的處理過程提煉出來放到基類中,以減少代碼重復,提高可維護性。然后在PageBase類中寫如下代碼:protected override void InitializeCulture()
{
        base.InitializeCulture();
        string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
        //該用戶首次訪問本站,Profile.LanguagePreference為空時,識別用戶瀏覽器的語言設置
        if(string.IsNullOrEmpty(LanguagePreference))
        {
             if (this.Context.Request.UserLanguages != null)
             {
                  LanguagePreference = this.Context.Request.UserLanguages[0];
                  ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
              }
          }
          else
          {
               Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);                               
               Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
           }
}

        System.Web.UI.Page類的InitializeCulture方法是在Asp.net2.0中新加的,它為當前線程設置Culture和UICulture。頁面生命周期已被設計為InitializeCulture方法先于頁面的Init和Load運行。在上述代碼中,首先使用((ProfileCommon)this.Context.Profile).LanguagePreference;獲得當前LanguagePreference配置文件屬性的值,判斷其是否為空,也就是是否已經為用戶保存了區域性設置。如果為空,則從Http頭中獲取用戶的首選區域性設置,并通過((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;保存用戶的首選區域性設置。如果不為空,說明已經保存了用戶的區域性設置,那么使用這個區域性設置當前線程的CurrentUICulture和CurrentCulture屬性。
         如果Web.config中定義了<globalization uiCulture="auto" culture="auto" />,那么可以將上述代碼簡化為:protected override void InitializeCulture()
{
        base.InitializeCulture();
        string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;    

        if(!string.IsNullOrEmpty(LanguagePreference))
        {
              Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
              Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
        }
        else
        {
               ((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
         }
}

        如果在站點中提供了讓用戶選擇區域性的功能,比如在站點的母版頁中放了一個選擇語言的列表,那么可以通過以下語句來記住用戶對區域性的選擇:
 protected void lstLanguage_SelectedIndexChanged(object sender,EventArgs e)
{
        if (lstLanguage.SelectedValue != "Auto") //默認選項是Auto
    {
 Profile.LanguagePreference = lstLanguage.SelectedValue;
     }
    else
    {
       Profile.LanguagePreference = null;
     }
    Response.Redirect(Request.Url.AbsolutePath);
 }
        注意Response.Redirect(Request.Url.AbsolutePath);這行代碼,因為事件處理代碼是在Page_Load之后執行的,要是想讓頁面迅速發生變化必須執行重定向操作。

3.     在Asp.net2.0中使用資源文件

        在站點中建立全局資源文件的時候,VS.Net2005會自動建立一個App_GlobalResources文件夾專門來存放全局資源文件。所謂全局資源文件,也就是給站點中多個頁面文件或母版頁使用的資源文件。假設我們創建名為MyResource.resx和MyResource.zh-cn.resx的文件。在程序中我們可以使用以下代碼來獲得資源文件中的值:this.lblCountry.Text = Resources.MyResource.Country;
其中Country是資源文件中的鍵。顯然,這比Asp.net1.1中從資源文件獲取值要容易很多。

        這里有兩個問題需要注意:第一,在創建一組具有相同根名稱的資源文件時,沒有區域性標示的文件必須建立,比如MyResource.resx是必須有的,其它如MyResource.en-gb.resx和MyResource.zh-cn.resx的建立是根據需要的。如果不建立MyResource.resx只建立了MyResource.zh-cn.resx等,則上述代碼中的Resources命名空間下就不會出現MyResource,因此上述代碼編譯無法通過。MyResource.resx中應該存放站點默認語言的內容,以備在找不到與當前線程CurrentUICulture匹配的本地化資源文件或在本地化資源文件中找不到相應鍵值時使用。Asp.net是以MyResource.resx文件中的鍵為準,假如在MyResource.resx中不存在Country鍵,而在MyResource.zh-cn.resx中存在Country鍵,那么上述代碼在編譯時也會報錯。第二,Asp.net在找不到相應區域的本地化資源時,不會報告任何異常,會自動從MyResource.resx文件中獲取值,但并不改變當前線程的CurrentUICulture。
       
        在站點中建立局部資源文件的時候,VS.Net2005會自動建立一個App_LocalResources文件夾專門來存放局部資源文件。所謂局部資源文件,也就是給站點中單一頁面文件使用的資源文件。它的命名方式一般是Default.aspx.resx和Default.aspx.zh-cn.resx?,F在我在Default資源文件中添加三個鍵Language、lblNavigation.Text和lblNavigation.ForeColor。其中我為Default.aspx.resx的lblNavigation.ForeColor設置blue,為Default.aspx.zh-cn.resx的lblNavigation.ForeColor設置red。在頁面文件中Default.aspx中從局部資源文件里獲得內容的方法如下有兩種:
(1). <asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>
(2). <asp:Label ID="lblNavigaion" runat="server" meta:resourcekey="lblNavigation"></asp:Label>
 使用第一種方法時要注意使用符號$。使用第二種方法更加靈活,它可以一次性地為控件的很多屬性設定值。

        在這里仍然有問題需要注意:頁面默認的局部資源文件必須被建立,比如Default.aspx.resx是必須的,而Default.aspx.zh-cn.resx則根據需要。如果你不建立默認的局部資源文件,而在頁面中卻要使用局部資源文件時,當使用第一種方法進行綁定時,出編譯錯誤;當使用第二種方法進行綁定時,不會出編譯錯誤,但是這些屬性的設置全都沒起作用,如同沒寫一樣。

4.顯示本地化圖像

        顯示本地化圖像也是Asp.net2.0的新功能。在Asp.net2.0中資源文件已經不僅限于string類型的鍵值對組合,它可以保存多種類型的文件。利用這一功能可以實現圖像的本地化。其實所謂本地化圖像,無非就是將給不同區域性準備的圖像放到不同的本地化資源文件中去。比如將LitwareSlogan.jpg放到MyResource.resx中,把LitwareSlogan.cn.jpg放到MyResource.zh-cn.resx中。


        當不同本地化版本的全局資源文件中含有本地化版本的圖像文件時,您可以自定義一個名為 MyLocalImage.ashx 的處理程序文件,基于用戶的語言首選項來有條件地進行加載,代碼如下所示。
 

頁面中的調用方法:

<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />

MyLocalImage.ashx 的處理程序的寫法:

public class MyLocalImage : IHttpHandler
{
       public void ProcessRequest (HttpContext context)
       {
            context.Response.ContentType = "image/png";
            string LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
            if (!string.IsNullOrEmpty(LanaguageReference))
            {
                    Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanaguageReference);
            }
            Bitmap bm = Resources.Litware.LitwareSlogan;
            MemoryStream image = new MemoryStream();
            bm.Save(image,ImageFormat.Png);
            context.Response.BinaryWrite(image.GetBuffer());
         }
}

        MyLocalImage.ashx 中定義的自定義處理程序類可使用您以前在自定義 InitializeCulture 方法中看到的類似邏輯,在從全局資源文件中檢索圖像文件以前,初始化當前線程的 CurrentUICulture 設置。您可能疑問為何在頁面的基類中已經設置了當前線程的CurrentUICulture,而在這里還要重新設置,那是因為這里的線程與基類中處理的線程不是同一線程。在該自定義處理程序正確初始化了 CurrentUICulture 設置之后,它即可通過 MyResource.resx 的強類型化資源類來訪問圖像文件。然后,便只需將圖像文件的數位編寫到 HTTP 響應流。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
川上优av一区二区线观看| 成人在线视频福利| 亚洲tv在线观看| 欧美激情二区三区| 日韩亚洲精品电影| 青青久久aⅴ北条麻妃| 国产97在线观看| 久久九九全国免费精品观看| 中文字幕亚洲综合久久筱田步美| 国产精品高潮在线| 亚洲mm色国产网站| 欧美激情网友自拍| 国产精品va在线播放| 亚洲社区在线观看| 日韩成人av在线播放| 一级做a爰片久久毛片美女图片| …久久精品99久久香蕉国产| 精品视频在线播放色网色视频| 久久91亚洲人成电影网站| 日韩成人激情在线| 欧美日韩一区免费| 国产偷国产偷亚洲清高网站| 亚洲区在线播放| 欧美日韩国产一区二区三区| 久久国产精品久久国产精品| 欧美一级高清免费| 成人午夜黄色影院| 在线视频欧美日韩精品| 久久久久久久久综合| 国产精品www色诱视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲自拍偷拍视频| 久久久国产91| 日韩欧美在线字幕| 亚洲福利视频网站| 日韩精品免费视频| 欧美电影在线播放| 久久精品2019中文字幕| 91久久国产精品91久久性色| 欧美巨大黑人极品精男| 亚洲欧洲一区二区三区在线观看| 国产精品一香蕉国产线看观看| 国产99久久精品一区二区永久免费| 麻豆一区二区在线观看| 日韩大片免费观看视频播放| 中文字幕日韩av电影| 亚洲国产精品久久久久久| 永久免费精品影视网站| 国产精品免费一区豆花| 成人午夜在线影院| 高潮白浆女日韩av免费看| 欧美激情第三页| 日韩电影在线观看免费| 亚洲人在线视频| 亲爱的老师9免费观看全集电视剧| 欧美激情xxxxx| 日韩欧美高清视频| 中文字幕亚洲国产| 久久精品国产一区二区三区| 中文字幕av一区中文字幕天堂| 最近2019年好看中文字幕视频| 中国日韩欧美久久久久久久久| 成人精品久久av网站| 欧美性jizz18性欧美| 亚洲精品网站在线播放gif| 国产97在线观看| 国产精品中文字幕在线| 国产精品老女人精品视频| 亚洲区bt下载| 亚洲综合小说区| 亚洲精选在线观看| 国产成人亚洲精品| 亚洲自拍高清视频网站| 欧美午夜丰满在线18影院| 欧美精品在线网站| 精品亚洲va在线va天堂资源站| 欧美电影在线播放| 国产视频久久久久久久| 热久久视久久精品18亚洲精品| 2021国产精品视频| 2024亚洲男人天堂| 91成品人片a无限观看| 久久韩国免费视频| 日韩色av导航| 中文字幕亚洲一区二区三区| 日韩成人性视频| 国产亚洲欧美日韩一区二区| 国产精品三级网站| 亚洲精品国偷自产在线99热| 欧美国产精品人人做人人爱| 九九热这里只有精品免费看| 日韩中文字幕免费| 成人av在线亚洲| 国产精品一区二区三区成人| 亚洲sss综合天堂久久| 亚洲天堂免费观看| 国产精品美女视频网站| 亚洲欧洲中文天堂| 懂色av一区二区三区| 欧美亚洲视频在线看网址| 91久久国产精品91久久性色| 午夜精品久久久久久久99黑人| 另类图片亚洲另类| 影音先锋日韩有码| 亚洲精品自拍第一页| 亚洲第五色综合网| 日韩大陆毛片av| 在线亚洲欧美视频| 亚洲国产日韩精品在线| 国产美女精品视频| 欧美激情成人在线视频| 日韩成人小视频| 91青草视频久久| 精品久久久久久久久久久久久久| 不卡av电影院| 欧美国产日韩免费| 亚洲男人天堂九九视频| 国产精品成久久久久三级| 亚洲国内高清视频| 欧美日韩视频免费播放| 欧美性猛交xxxx乱大交蜜桃| 中文字幕精品一区二区精品| 亚洲美女激情视频| 欧美一区二区三区……| 日韩影视在线观看| 亚洲精品美女久久久| 91成品人片a无限观看| 精品露脸国产偷人在视频| 中文字幕欧美在线| 久久天天躁狠狠躁夜夜躁| www国产91| 奇米四色中文综合久久| 日韩高清欧美高清| 91豆花精品一区| 免费99精品国产自在在线| 欧美激情va永久在线播放| 亚洲成人国产精品| 日韩美女视频中文字幕| 国产精品入口免费视频一| 97国产suv精品一区二区62| 日产精品99久久久久久| 亚洲最新av网址| 91成品人片a无限观看| 日韩在线观看免费全集电视剧网站| 日韩综合视频在线观看| 蜜臀久久99精品久久久无需会员| 国产精品久久久久久久久久三级| 91a在线视频| 国产成人综合久久| 久久久久成人精品| 国产欧美精品一区二区三区介绍| 欧美激情成人在线视频| 亚洲japanese制服美女| 97久久精品国产| 国产综合香蕉五月婷在线| 欧美性极品xxxx做受| 国产丝袜一区二区| 欧美日韩美女在线| 日韩av在线播放资源| 欧美亚洲激情在线| 成人h猎奇视频网站| 成人在线视频网站| 欧美激情视频网站| 中文字幕精品一区久久久久|