亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Flutter鴻蒙化遷移實(shí)戰(zhàn):gettext PO/MO資產(chǎn)適配與轉(zhuǎn)換

Flutter鴻蒙化遷移實(shí)戰(zhàn):gettext PO/MO資產(chǎn)適配與轉(zhuǎn)換 前陣子把團(tuán)隊(duì)維護(hù)了多年的 Flutter 應(yīng)用遷到 HarmonyOS 平臺(tái)功能代碼倒沒折騰太久真正卡住我的反而是本地化這套東西。項(xiàng)目長(zhǎng)期用 gettext 體系管理翻譯PO 文件累積了上萬(wàn)條文案后端、運(yùn)營(yíng)和外包翻譯全都圍著這套資產(chǎn)轉(zhuǎn)。我的目標(biāo)很明確讓鴻蒙版直接消費(fèi)現(xiàn)有 PO/MO 文件而不是另起爐灶維護(hù)一套新資源。于是我把 Flutter 三方庫(kù) gettext_parser 引到鴻蒙工程里做驗(yàn)證結(jié)果一個(gè)問題接一個(gè)問題冒出來(lái)文件讀取層要適配、編碼差異要處理、大 PO 文件解析性能不夠、復(fù)數(shù)規(guī)則跟兩側(cè)平臺(tái)對(duì)不齊。這篇文章就完整記錄這次的適配過程從 PO/MO 格式原理講起到鴻蒙化改造的具體步驟再到高性能多語(yǔ)言資源轉(zhuǎn)換管線的設(shè)計(jì)最后附上問題排查速查表。如果你也在做 Flutter 鴻蒙化遷移或者打算在 Flutter 工程里接入 gettext 翻譯生態(tài)這些經(jīng)驗(yàn)應(yīng)該能幫你省下不少試錯(cuò)時(shí)間。1. 項(xiàng)目背景為什么鴻蒙應(yīng)用還要接 gettext 生態(tài)1.1 存量翻譯資產(chǎn)的價(jià)值先說(shuō)個(gè)容易被忽略的事實(shí)很多中大型應(yīng)用的多語(yǔ)言資產(chǎn)并不是 Flutter 默認(rèn)的 ARB 文件而是 gettext 體系的 PO/MO 文件。POPortable Object是給人讀、給版本控制工具 diff 的純文本格式每條翻譯由msgid原文和msgstr譯文組成MOMachine Object則是 PO 編譯后的二進(jìn)制形態(tài)體積小、讀取快適合丟進(jìn)生產(chǎn)環(huán)境。這類資產(chǎn)值錢在于幾個(gè)特性一是可讀性好翻譯人員用普通文本編輯器就能改git 里哪行文案變了清清楚楚二是工具鏈成熟各類翻譯管理平臺(tái)都能直接導(dǎo)入導(dǎo)出 PO三是帶上下文和標(biāo)記能力msgctxt、fuzzy、obsolete這些標(biāo)記讓翻譯質(zhì)量管控有據(jù)可查。我接手這個(gè)項(xiàng)目時(shí)PO 文件已經(jīng)沉淀了四五年里面還有大量經(jīng)過市場(chǎng)驗(yàn)證的術(shù)語(yǔ)和句式這筆資產(chǎn)遷移到鴻蒙上要是不能用等于從零再來(lái)一遍。所以鴻蒙化的第一個(gè)結(jié)論就是解析器必須在 Dart 側(cè)實(shí)現(xiàn)運(yùn)行在 Flutter 應(yīng)用的進(jìn)程內(nèi)而不是依賴系統(tǒng)級(jí) gettext 庫(kù)——HarmonyOS 上沒有現(xiàn)成的 gettext 運(yùn)行時(shí)。gettext_parser 這個(gè)純 Dart 包正好是干這個(gè)的。1.2 gettext_parser 的能力邊界與適配難點(diǎn)在動(dòng)手前我把 gettext_parser 的能力邊界摸了一遍。它的核心是解析 PO 文本逐條吐出翻譯條目支持多行字符串拼接、轉(zhuǎn)義序列處理、上下文和復(fù)數(shù)原文。這對(duì)文本格式覆蓋得不錯(cuò)但有三件事它不管文件從哪讀、MO 二進(jìn)制怎么解、解析出來(lái)的數(shù)據(jù)怎么變成 Flutter 或鴻蒙的資源格式。這三點(diǎn)恰好是鴻蒙化適配的難點(diǎn)。文件讀取這層最麻煩。gettext_parser 本身不碰dart:io但常規(guī)用法都在外面套一層File(path).readAsString()。PC 上沒問題進(jìn)了鴻蒙沙箱就有講究應(yīng)用只能訪問自己的filesDir、cacheDir等目錄資產(chǎn)文件要走rootBundle下載的翻譯包要先進(jìn)沙箱再讀。路徑語(yǔ)義全變了。MO 二進(jìn)制解析是我后補(bǔ)的。gettext 的 PO 適合人維護(hù)但 App 啟動(dòng)時(shí)逐行解析有明顯開銷MO 作為編譯產(chǎn)物在二進(jìn)制層面更省資源。不過 MO 有端序問題、字符串表偏移問題直接按字節(jié)硬讀很容易踩坑。至于資源轉(zhuǎn)換那更是八仙過海Flutter 用 ARBHarmonyOS 用string.json兩邊對(duì)復(fù)數(shù)分類的口徑還不一樣。gettext 的復(fù)數(shù)規(guī)則是數(shù)學(xué)表達(dá)式CLDR 的復(fù)數(shù)類別是語(yǔ)義分類兩邊需要專門做一層映射。這塊我后面會(huì)細(xì)講。1.3 整體改造思路純 Dart 核心 可插拔 IO我最終采用的架構(gòu)是三層分離解析核心層、數(shù)據(jù)源抽象層、資源轉(zhuǎn)換層。解析核心層保持純 Dart不 import 任何dart:io這樣它在構(gòu)建腳本、桌面工具、鴻蒙運(yùn)行環(huán)境里都能跑。數(shù)據(jù)源抽象層定義一個(gè)GetTextSource接口按場(chǎng)景提供不同實(shí)現(xiàn)構(gòu)建期用文件系統(tǒng)實(shí)現(xiàn)讀磁盤 PO運(yùn)行期用資產(chǎn)實(shí)現(xiàn)走rootBundle單元測(cè)試用內(nèi)存實(shí)現(xiàn)喂字符串。資源轉(zhuǎn)換層把解析出的條目統(tǒng)一成中間模型再分別輸出 ARB 和 HarmonyOS 的string.json。這樣設(shè)計(jì)的好處很明顯構(gòu)建工具和 App 運(yùn)行時(shí)共享同一套解析邏輯不用維護(hù)兩份單元測(cè)試可以脫離文件系統(tǒng)跑回歸成本低將來(lái)如果還要支持 Android 的strings.xml或者 iOS 的strings只需要在轉(zhuǎn)換層加一個(gè)輸出器核心代碼一行都不用動(dòng)。2. 解析器核心邏輯拆解PO/MO 文件到底怎么讀2.1 PO 文本格式與狀態(tài)機(jī)解析PO 文件看起來(lái)就是一組以msgid開頭的塊中間用空行分隔。實(shí)際結(jié)構(gòu)比表面復(fù)雜一段典型的 PO 條目長(zhǎng)這樣# 翻譯者注釋 #. 提取的注釋 #: src/page.dart:120 #, fuzzy msgctxt menu_title msgid Open msgid_plural Open items msgstr[0] 打開 msgstr[1] 打開項(xiàng)目#開頭的行是注釋其中#, fuzzy表示這條翻譯還沒確認(rèn)#~前綴表示條目已廢棄。msgctxt是上下文msgid是單數(shù)原文msgid_plural是復(fù)數(shù)原文msgstr[N]是對(duì)應(yīng)的第 N 個(gè)譯文。文件頭還有一個(gè)msgid 的特殊條目里面存放的是元數(shù)據(jù)包括字符集聲明和Plural-Forms表達(dá)式。解析時(shí)我用的狀態(tài)機(jī)思路逐行掃描維護(hù)一個(gè)“當(dāng)前條目”和“當(dāng)前字段”的狀態(tài)??吹絤sgid、msgctxt、msgstr[N]就切換字段看到以引號(hào)開頭的行說(shuō)明是上一個(gè)字段的多行續(xù)接拼到當(dāng)前字段末尾遇到空行就把當(dāng)前條目封口并加入結(jié)果列表。字符串還要做反轉(zhuǎn)義\n、\t、\、\\這些都要還原成真實(shí)字符。這里有個(gè)容易忽略的細(xì)節(jié)續(xù)接行不能簡(jiǎn)單trim()掉內(nèi)部空格。PO 規(guī)范里字符串內(nèi)部的空格是有意義的只有行首行尾的空白是格式噪音。處理時(shí)我會(huì)先去掉整行的trim()再用引號(hào)配對(duì)截出字符串體最后統(tǒng)一反轉(zhuǎn)義。實(shí)測(cè)不少第三方 PO 文件就是因?yàn)槟骋恍卸嗔藗€(gè)尾部空格導(dǎo)致譯文拼接錯(cuò)位。2.2 MO 二進(jìn)制格式與端序識(shí)別MO 是二進(jìn)制格式結(jié)構(gòu)比 PO 緊湊得多。文件頭的固定 28 個(gè)字節(jié)里最關(guān)鍵的是前 4 個(gè)字節(jié)的魔數(shù)小端序是0x950412de大端序是0xde120495。讀到魔數(shù)后要先判斷端序再用對(duì)應(yīng)端序去讀后面的字段否則條目數(shù)量會(huì)變成天文數(shù)字偏移量也全錯(cuò)。MO 文件頭字段如下偏移長(zhǎng)度字段說(shuō)明04magic魔數(shù)用于識(shí)別文件和端序44revision版本號(hào)常見為 084N條目總數(shù)124O原文字符串表的偏移164T譯文字符串表的偏移204S哈希表?xiàng)l目數(shù)0 表示沒有哈希表244H哈希表偏移字符串表是一連串(長(zhǎng)度, 偏移)對(duì)每對(duì)占 8 字節(jié)。注意這里的偏移是相對(duì)于整個(gè)文件頭的不是相對(duì)于字符串表的我第一次實(shí)現(xiàn)時(shí)就在這栽了跟頭。解析完所有條目后再把偏移和長(zhǎng)度指向的字節(jié)用 UTF-8 解碼成字符串。我在 Dart 側(cè)的實(shí)現(xiàn)大致長(zhǎng)這樣ListMoEntry parseMoBytes(Uint8List data) { final bd ByteData.sublistView(data); final magic bd.getUint32(0, Endian.little); final isBigEndian magic 0x950412de; final isLittleEndian magic 0xde120495; if (!isBigEndian !isLittleEndian) { throw FormatException(無(wú)效的 MO 文件魔數(shù)不匹配); } final endian isBigEndian ? Endian.big : Endian.little; final count bd.getUint32(8, endian); final origTable bd.getUint32(12, endian); final transTable bd.getUint32(16, endian); final entries MoEntry[]; for (var i 0; i count; i) { final oLen bd.getUint32(origTable i * 8, endian); final oPtr bd.getUint32(origTable i * 8 4, endian); final tLen bd.getUint32(transTable i * 8, endian); final tPtr bd.getUint32(transTable i * 8 4, endian); if (oPtr oLen data.length || tPtr tLen data.length) { throw FormatException(MO 字符串表越界); } entries.add(MoEntry( utf8.decode(data.sublist(oPtr, oPtr oLen)), utf8.decode(data.sublist(tPtr, tPtr tLen)), )); } return entries; }這里我加了兩個(gè)防御一是魔數(shù)不匹配直接拋異常二是讀取字符串前校驗(yàn)偏移和長(zhǎng)度是否越界。MO 文件被截?cái)嗷蛘弑诲e(cuò)誤編譯時(shí)沒有這兩個(gè)檢查會(huì)直接拋一個(gè)很難看的RangeError有了解讀性更好的異常排查問題能少花一半時(shí)間。2.3 復(fù)數(shù)規(guī)則類別的語(yǔ)義映射PO 文件頭的Plural-Forms是一個(gè)數(shù)學(xué)表達(dá)式例如英文是nplurals2; plural(n ! 1);俄文是nplurals3; plural(n%101 n%100!11 ? 0 : n%102 n%104 (n%10010 || n%10020) ? 1 : 2);。而 Flutter 的 ARB 和 HarmonyOS 的資源文件用的是 CLDR 復(fù)數(shù)類別zero、one、two、few、many、other。這兩者不是一回事gettext 返回的是一個(gè)整數(shù)索引第幾個(gè)譯文CLDR 返回的是一個(gè)語(yǔ)義類別。直接硬映射容易出錯(cuò)比如俄文的 gettext 索引 0 對(duì)應(yīng)one索引 1 對(duì)應(yīng)few索引 2 對(duì)應(yīng)many但不同語(yǔ)言、不同公式這種對(duì)應(yīng)關(guān)系完全不同。我的做法是采樣映射對(duì)每個(gè)語(yǔ)言取一組有代表性的 n 值0、1、2、3、5、10、21、100 等代入 gettext 的plural表達(dá)式得到索引再用intl包判斷同樣的 n 在 CLDR 下屬于哪個(gè)類別最后統(tǒng)計(jì)出“索引到類別”的映射關(guān)系并緩存。這樣不需要為每種語(yǔ)言硬編碼規(guī)則公式變了也能自動(dòng)適配。語(yǔ)言族PO 中 nplurals 數(shù)量對(duì)應(yīng) CLDR 復(fù)數(shù)類別中文、日文、韓文1other英文、德文、西班牙文2one / other俄文、烏克蘭文3one / few / many / other阿拉伯文6zero / one / two / few / many / other這張表是概念示意實(shí)際轉(zhuǎn)換時(shí)請(qǐng)務(wù)必用采樣法動(dòng)態(tài)生成映射別偷懶寫死。3. 鴻蒙化改造實(shí)操?gòu)囊蕾囈氲綐?gòu)建通過3.1 環(huán)境準(zhǔn)備與依賴引入策略鴻蒙化第一步不是寫代碼而是確認(rèn)你的 Flutter 工程確實(shí)能構(gòu)建出ohos平臺(tái)目錄。我在現(xiàn)有工程里補(bǔ)建了ohos/平臺(tái)工程flutter 側(cè)環(huán)境變量指向?qū)?yīng)的鴻蒙 SDK然后跑一次構(gòu)建讓腳手架生成平臺(tái)目錄。接下來(lái)是關(guān)鍵判斷gettext_parser 是純 Dart 包沒有 Android 的 Kotlin 代碼、沒有 iOS 的 Swift 代碼、沒有 method channel所以它不需要像插件那樣做原生適配。理論上在pubspec.yaml里加一行依賴就能編譯過dependencies: gettext_parser: ^2.0.0但實(shí)際我遇到了 SDK 約束問題。這個(gè)包的environment聲明要求某個(gè) Dart SDK 版本范圍而鴻蒙側(cè)的 Flutter 版本自帶的 Dart SDK 可能落在范圍之外。遇到這種情況不要急著硬改pubspec.lock更穩(wěn)妥的辦法是把它 fork 一份放到工程的packages/gettext_parser_ohos目錄通過dependency_overrides指向本地路徑順便改掉那些依賴特定 Dart 版本特性的代碼。這樣以后鴻蒙 SDK 升級(jí)了你也能控制包的版本行為。3.2 文件讀取適配層設(shè)計(jì)純 Dart 包能編譯過只是第一步真正常踩坑的是數(shù)據(jù)從哪來(lái)。我在GetTextSource接口上做了三個(gè)實(shí)現(xiàn)讓解析層完全感知不到平臺(tái)差異abstract class GetTextSource { FutureString readPo(String locale); FutureUint8List readMo(String locale); } // 構(gòu)建期/桌面工具用直接讀磁盤 class FileSource implements GetTextSource { final String baseDir; FileSource(this.baseDir); override FutureString readPo(String locale) async { final file File($baseDir/$locale.po); return file.readAsString(); } override FutureUint8List readMo(String locale) async { final file File($baseDir/$locale.mo); return file.readAsBytes(); } } // App 運(yùn)行期用走 Flutter 資產(chǎn) class AssetSource implements GetTextSource { override FutureString readPo(String locale) async { return rootBundle.loadString(assets/l10n/$locale.po); } override FutureUint8List readMo(String locale) async { final data await rootBundle.load(assets/l10n/$locale.mo); return data.buffer.asUint8List(); } }這個(gè)改動(dòng)打掉了 90% 的鴻蒙適配問題。因?yàn)?gettext_parser 本身不讀文件只要外面喂字節(jié)給它它在哪個(gè)平臺(tái)跑都是一樣的。我的經(jīng)驗(yàn)是凡是能定義抽象接口的 IO 操作一定要定義接口別讓解析庫(kù)直接碰dart:io。這條原則對(duì)鴻蒙化尤其重要因?yàn)槠脚_(tái)差異幾乎全部集中在 IO 邊界上。3.3 沙箱路徑與資源預(yù)加載的處理如果把 PO/MO 文件打進(jìn)安裝包那運(yùn)行期直接用AssetSource就好assets/l10n/目錄下的文件在鴻蒙上會(huì)隨 FLutter 資產(chǎn)一起打包。但有些場(chǎng)景需要?jiǎng)討B(tài)更新翻譯例如從服務(wù)端拉取最新的 PO 文件。這時(shí)候問題來(lái)了下載文件寫到哪里鴻蒙應(yīng)用沙箱里可以寫入的目錄是有限的。我們一般用路徑提供器拿到filesDir或cacheDir然后把下載的 PO 文件寫到那里。注意cacheDir里的文件隨時(shí)可能被系統(tǒng)清理適合放臨時(shí)緩存要長(zhǎng)期保留的翻譯文件放filesDir更穩(wěn)。千萬(wàn)別嘗試往安裝目錄或者外部公共目錄寫權(quán)限和路徑都存在不確定性。文件寫好后還要考慮加載時(shí)機(jī)。幾千條文案的 PO 文件解析耗時(shí)在百毫秒級(jí)如果 APP 啟動(dòng)第一幀就同步解析用戶會(huì)明顯感覺到卡頓。我做了兩級(jí)緩解啟動(dòng)時(shí)用Isolate.run丟到后臺(tái) isolate 解析解析結(jié)果緩存到內(nèi)存如果文件太大、啟動(dòng)階段實(shí)在來(lái)不及就先只解析當(dāng)前語(yǔ)言其余語(yǔ)言等用戶切換時(shí)再懶加載。3.4 構(gòu)建配置與平臺(tái)工程注冊(cè)關(guān)于ohos/平臺(tái)的構(gòu)建配置有三個(gè)點(diǎn)值得單獨(dú)說(shuō)。第一確保pubspec.yaml的 assets 聲明里包含了 PO/MO 文件路徑。只在目錄里放了文件但沒有聲明構(gòu)建時(shí)會(huì)被靜默丟棄。第二純 Dart 包不需要在 ohos 平臺(tái)目錄里注冊(cè)任何東西但如果你的工程里還有其他依賴是帶原生代碼的 flutter 插件它們必須有對(duì)應(yīng)的 ohos 適配版本否則整條構(gòu)建鏈會(huì)掛在依賴解析上。第三HarmonyOS 側(cè)的網(wǎng)絡(luò)權(quán)限默認(rèn)不開如果運(yùn)行期要拉取翻譯文件記得在ohos工程相應(yīng)的配置文件里聲明網(wǎng)絡(luò)權(quán)限只在本地解析則無(wú)需任何額外權(quán)限。構(gòu)建跑通以后我的運(yùn)行期代碼路徑是這樣的優(yōu)先嘗試讀取 MO二進(jìn)制的加載和解析都更快文件不存在再退回讀 PO——完全沿用 gettext 生態(tài)的慣例把 MO 當(dāng)生產(chǎn)格式PO 當(dāng)維護(hù)格式。4. 高性能多語(yǔ)言資源轉(zhuǎn)換管線4.1 轉(zhuǎn)換鏈路PO/MO → 中間模型 → ARB / string.json轉(zhuǎn)換管線是我這套方案里最實(shí)用的部分。它的目標(biāo)是一份 PO/MO 資產(chǎn)自動(dòng)產(chǎn)出 Flutter 工程用的 ARB 和鴻蒙工程用的string.json。鏈路分三段。第一段是輸入規(guī)范化PO 文本或 MO 字節(jié)統(tǒng)一解析成PoEntry列表。第二段是中間模型把條目去重、過濾掉fuzzy和obsolete并解析出復(fù)數(shù)類別映射得到干凈的“key 到譯文”數(shù)據(jù)。第三段是輸出按目標(biāo)平臺(tái)的格式序列化。過濾邏輯很關(guān)鍵我單獨(dú)摘出來(lái)MapString, String toSimpleMap(ListPoEntry entries) { final map String, String{}; for (final entry in entries) { if (entry.obsolete) continue; // 廢棄條目不要 if (entry.fuzzy) continue; // 未確認(rèn)翻譯不要 if (entry.msgid.isEmpty) continue; // 跳過頭部元數(shù)據(jù) final value entry.msgstr.isNotEmpty ? entry.msgstr.first : entry.msgid; map[entry.msgid] value.isEmpty ? entry.msgid : value; } return map; }譯文為空時(shí)回退到原文保證 UI 上不會(huì)出現(xiàn)空白標(biāo)簽。輸出 ARB 時(shí)把開頭的元數(shù)據(jù)鍵補(bǔ)上輸出鴻蒙資源時(shí)轉(zhuǎn)成下面這種結(jié)構(gòu){ string: [ { name: hello, value: 你好 } ], plural: [ { name: messageCount, value: [ { quantity: one, value: %d 條消息 }, { quantity: other, value: %d 條消息 } ] } ] }這里要特別留意不同 HarmonyOS API 版本對(duì)資源文件的組織方式可能有差異有的版本把string和plural放在同一個(gè) JSON 的不同數(shù)組里有的版本拆成獨(dú)立文件。我建議在轉(zhuǎn)換器里把“是否輸出 plural 數(shù)組”做成開關(guān)按目標(biāo) API 版本配置。4.2 性能調(diào)優(yōu)分檔緩存、流式解析與并發(fā)轉(zhuǎn)換“高性能”不是堆出來(lái)的形容詞落到具體指標(biāo)上我關(guān)注的是解析耗時(shí)和內(nèi)存峰值。剛開始直接File.readAsString再逐行解析一個(gè) 24 MB 的大 PO 文件能把內(nèi)存頂?shù)?200 MB 以上App 必崩。后來(lái)做了三件事把它壓下來(lái)。第一解析結(jié)果分檔緩存。解析過的條目存在內(nèi)存 Map 里再次請(qǐng)求同一個(gè)語(yǔ)言直接命中不重復(fù)解析。第二盡量用流式接口。gettext_parser 本身支持按塊吐出條目用await for消費(fèi)而不是攢成一個(gè) List內(nèi)存占用能降一半。第三大文件丟給 isolate。Isolate.run(() parseAndConvert(...))可以在后臺(tái)線程完成解析和序列化避免 jank。我這邊在中端測(cè)試機(jī)上測(cè)的一組數(shù)據(jù)僅供參考文件大小 / 條目數(shù)解析方式耗時(shí)內(nèi)存峰值2 MB / 4800 條全量讀入 狀態(tài)機(jī)約 130 ms約 24 MB2 MB / 4800 條流式分塊解析約 95 ms約 12 MB24 MB / 53000 條全量讀入約 2.8 s約 210 MB24 MB / 53000 條isolate 分檔緩存約 1.1 s約 60 MB還有一個(gè)構(gòu)建期的小技巧轉(zhuǎn)換工具本身用dart run執(zhí)行多個(gè)語(yǔ)言文件可以并行轉(zhuǎn)換每個(gè)語(yǔ)言一個(gè) isolate總耗時(shí)能進(jìn)一步壓縮。因?yàn)檎Z(yǔ)言之間沒有依賴并行是天然安全的。4.3 輸出資源的一致性校驗(yàn)自動(dòng)化轉(zhuǎn)換最怕的是“轉(zhuǎn)出來(lái)了但轉(zhuǎn)錯(cuò)了”。我加了三個(gè)校驗(yàn)步驟每次轉(zhuǎn)換后自動(dòng)執(zhí)行。第一個(gè)是鍵一致性檢查把基準(zhǔn)語(yǔ)言一般是英文的 key 集合和各語(yǔ)言比對(duì)報(bào)告缺失和多余。多余的 key 通常意味著 PO 文件里殘留了廢棄條目沒清干凈。第二個(gè)是占位符檢查用正則提取%s、%d、{name}這類占位符比對(duì)原文和譯文的集合是否一致不一致的條目直接標(biāo)紅。這個(gè)檢查救過我多次——譯者把%s打成了%S真機(jī)上就跑出奇怪文案。第三個(gè)是復(fù)數(shù)形式數(shù)量檢查對(duì)比Plural-Forms聲明和實(shí)際msgstr[n]條目數(shù)數(shù)量對(duì)不上說(shuō)明文件本身?yè)p壞。5. 常見問題與排查技巧實(shí)錄5.1 編碼與 BOM 相關(guān)的三個(gè)坑第一坑UTF-8 BOM。有的 Windows 端翻譯工具會(huì)往 PO 文件頭塞 BOMEF BB BFDart 的utf8.decode遇到 BOM 會(huì)把\uFEFF當(dāng)作第一個(gè)字符帶進(jìn)解析結(jié)果。處理辦法是讀取后先檢測(cè)并剝離 BOM 再喂給解析器。第二坑字符集聲明和實(shí)際編碼不符。PO 文件頭的Content-Type可能寫著charsetUTF-8但實(shí)際文件是 Latin-1 或 GBK 編碼。這種情況在從老系統(tǒng)遷移的 PO 里不少見。我在數(shù)據(jù)源層做了個(gè)預(yù)檢讀前 64 字節(jié)嘗試檢測(cè)編碼如果檢測(cè)結(jié)果不是 UTF-8就先用對(duì)應(yīng)字符集轉(zhuǎn)成 UTF-8 再解析。Dart 側(cè)沒有內(nèi)置全套字符集轉(zhuǎn)換需要引入轉(zhuǎn)換類庫(kù)或者更穩(wěn)妥的辦法是讓翻譯工具重新導(dǎo)出一次 UTF-8 版本——我通常選后者因?yàn)闅v史編碼文件里往往混著損壞的字節(jié)硬轉(zhuǎn)不如重導(dǎo)。第三坑字符串里的裸換行。PO 規(guī)范要求長(zhǎng)字符串用引號(hào)續(xù)接但也有不守規(guī)矩的文件直接在msgstr里塞了裸換行導(dǎo)致狀態(tài)機(jī)誤判條目結(jié)束。我的兜底策略是解析出錯(cuò)時(shí)記錄行號(hào)而不是直接拋異常終止整個(gè)文件把單條錯(cuò)誤隔離掉保證其余條目還能用。5.2 復(fù)數(shù)規(guī)則與占位符不匹配復(fù)數(shù)這塊最常見的問題是只取了msgstr[0]就當(dāng)成單數(shù)用。后果是俄文、阿拉伯文這類多復(fù)數(shù)形態(tài)的語(yǔ)言界面上一部分場(chǎng)景永遠(yuǎn)顯示默認(rèn)格式。我的采樣映射方案解決了索引到 CLDR 類別的換算但還有一個(gè)前提PO 文件里必須真的有完整復(fù)數(shù)條目。如果原文里只有msgstr[0]那再怎么映射也只有一種形態(tài)這種情況要回到翻譯流程去補(bǔ)齊。占位符問題則是另一類重災(zāi)區(qū)。gettext 傳統(tǒng)上是%s、%d風(fēng)格而 ARB 喜歡{name}命名風(fēng)格HarmonyOS 資源又常同時(shí)支持%s和{name}。我見過最慘烈的案例是%1$s這種帶位置參數(shù)的占位符被無(wú)腦替換成{1}結(jié)果真機(jī)上直接顯示花括號(hào)。我的處理策略是轉(zhuǎn)換時(shí)先按序把%s、%d映射到{arg0}、{arg1}再在目標(biāo)平臺(tái)格式化處按序替換回去。新加的文案則一律要求譯者使用命名占位符從源頭消滅歧義。5.3 大文件解析卡頓與內(nèi)存飆升小 PO 文件隨便解析都沒問題一旦翻譯條目超過兩三萬(wàn)問題就暴露了??D的根源通常不是 CPU而是字符串頻繁拼接和中間 List 積壓。分析下來(lái)占內(nèi)存大頭的往往是readAsString那把整個(gè)文件一次性讀進(jìn)來(lái)的字符串對(duì)象加上逐條解析時(shí)臨時(shí)生成的中間字符串兩頭一夾內(nèi)存就上去了。我的解法有兩層。運(yùn)行時(shí)解析走流式不要把整個(gè) PO 內(nèi)容變成一個(gè)超長(zhǎng) String而是分塊讀、分塊解析塊與塊之間共享狀態(tài)機(jī)狀態(tài)。構(gòu)建期工具則更簡(jiǎn)單粗暴把大的 PO 按語(yǔ)言拆成多個(gè)獨(dú)立文件并行解析。真到了單文件幾十 MB 的規(guī)模配合Isolate.run和結(jié)果緩存內(nèi)存峰值能壓到原來(lái)的四分之一左右。5.4 我在實(shí)操中總結(jié)的三個(gè)小原則適配做下來(lái)沉淀出三條經(jīng)驗(yàn)比任何具體代碼都值錢。第一解析庫(kù)必須保持純 Dart所有 IO 都要通過抽象接口注入。這不是潔癖而是鴻蒙、Web、桌面、測(cè)試環(huán)境對(duì)文件訪問的語(yǔ)義差異太大靠if (Platform.isXxx)打補(bǔ)丁遲早翻車。第二轉(zhuǎn)換工具的校驗(yàn)邏輯要比功能代碼寫得早。多語(yǔ)言資源一旦出問題用戶看到的是亂碼和錯(cuò)位反饋鏈路很長(zhǎng)靠人工排查成本極高校驗(yàn)必須在構(gòu)建階段自動(dòng)完成。第三歸檔時(shí)把 PO 文件和轉(zhuǎn)換腳本放同一個(gè)倉(cāng)庫(kù)做到“改完 PO跑一下腳本資源就齊了”。我后來(lái)把這條鏈路接進(jìn)了 CI每次合并前自動(dòng)跑一遍轉(zhuǎn)換和校驗(yàn)已經(jīng)有兩次在發(fā)版前攔下了占位符不一致的問題。這些經(jīng)驗(yàn)對(duì)任何涉及多語(yǔ)言資源遷移的項(xiàng)目都適用不只是鴻蒙這一個(gè)場(chǎng)景。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩超碰精品综合| 欧美成人黄网色网站| SUV一区二区在线看| 操屄不卡视频| 日韩簧片免费看| 少妇熟女一区二区三区| 国产又黄又爽| 欧美亚洲中文字幕| 夜夜免费视频| 亚洲日韩少妇一道本视频| 日韩一999精品| 日本人妻A片成人免费看片| 国产精品成久久久久午夜午夜| 67914在线兔费成人视频| 欧美美女在线高潮999| 日产狠狠干| 日韩AV一起草| 日本99视频| 国产成人手机视频激情| 影音先锋日本一区二区| 欧美经典一区二区三区| 亚洲欧美自拍偷拍| AV不卡在线| 岛国片在线播放| 加勒比伊人| 97国产精品一区| 东京热AV男人的天堂| 学生妹天天看| 曰本特级特黄特色黄色A级网站高清在线免费看| 搞中出视频在线观看| 欧美最婬乱婬爆婬性视频 | 欧美精品成人亚洲| 亚洲情色婷婷五月天| 天天操夜夜操| 国产av青草| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 911av网站免费观看| 精品人妻一二三| 东京热男人天堂| 78超碰| 校园春色综合网| 日韩免费中文字幕视频| 又粗又长又爽在线观看| 操逼操逼逼操操逼91 | 欧美日韩亚洲五月天婷婷| 超碰在线人妻不卡| 亚州高清av| 久久后入制服| 97伊人网| 美女视频尤物网在线看| 成人午夜小视频手机在线看| 国产超碰在线| 国产大片精久久久久久| 农村妇女精品一区二区| 久久久不卡| 一区二区三区免费视频入口| 国产精品久久成人免费| 九九这里只有精品| 国产精品午夜成人福利| 亚洲中文字幕av | 夜色AV无码手机在线影院| 久草视频分类在线| 97视频在线免费看| 中日992视频| 91人人操| 十八禁的黄污污免费网站| 蜜乳性色无码专日粉嫩骚逼AV| 干婷婷综合网| 久草资源在线视频官方总站日韩丝袜美腿 | www鬼畜国产男人的天堂| 图色综合网| 日欧毛片久久| 欧美天天弄| 黑人操一区二区| 天天做天天爱| 久久妇| 综合欧美亚洲| 99精品视频在线观看免费| 色色色999| 亚州综合图片| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 久操网址| 九九热精品免费视频| 性爱欧美五月| 欧美天天弄| 精品区国产区一区二区三区| 91精品人妻一区二区三区蜜桃臀 | 亞洲久久直播| 99热导航| 亚洲综合精品国产一区| 欧美A√综合网| 中国和日本人色哪个不下载能放| 操逼操网| 久日综合网| 欧洲久久一二线| 婷婷导航| 人妻一区二区三区熟女| 免费精品99| 九9热伊人| 人妻色偷色噜| 330dv亚洲成年视频网| A级片一区| 婷婷综合五月| 国产美女高潮视频| 99日韩| 美国三级日本三级久久99| 无码人妻一区二区三区色欲aⅴ| 激情六月婷婷| 日韩欧美性爱电影在线观看| 少妇69中文| 欧美日韩国产高清在线一二三区 | 60秒免费视频| 五月丁香黄色网| 婷婷五月天成人| 99re综合伊人| 色色色欧美| 91天射| 日韩肏逼视频| 美女91在线观看| 搡老女人911熟妇老熟女| 婷婷五月天影院| 欧美碰碰综合色| 日韩性爱网址| 欧美性暴力| 色色五月天婷婷| 精品少妇一区二区| 大香蕉九九| 殴美色网| 蜜臀久久99精品久久久久久久久| 另类小说综合网| 少妇与黑人高潮在线| 性夜影院爽黄A爽免费动漫| 小草精彩毛片| 亚洲av影音先锋| 九九九九97| 综合欧美激情网| 超碰欧美97资源| 欧美日韩操逼嗦吊| 99re超碰| 蜜桃色院一区久久| 囯产操逼片| 人妻色情天天操| 激情五月天丁香社区| 四虎884| 精品视频久久久久九九九九9999 | 国产AV久久野战精品| 丝袜av一区二区三区| 色网在线视频观看免费| 啊啊啊男女| 九九毛片这里只有精品| 久久99亚洲精品久久99果| 性色A∨91| 日欧美色| 亚洲无线码一区国产欧美国| 淫荡网址| 青青草一本道福利视频| 成人精品视频一区二区| 色婷婷亚洲婷婷| 亚洲男人综合| 91热| 99草精| 色好看av| 丁香六月婷婷| 在线观看中文av字幕| 日韩大香蕉AV影片| 爱妻综合网| 九九九九九九九九九九九免费国产| 岛国片在线播放| 影音先锋日本一区二区| 91老熟女91老女人| 九九九久千久久激情蜜桃在线看| 婷婷丁香久久| 久久成人国产| 日韩有码 一区二区三区| 97网址97| 大香蕉色欲AV| 中文字幕久久精品一区| 亚洲丝袜B诱惑| 亚洲欧美国产其他二区| 岛国大片在线观看网站入口| 精品一区二区三区丰满熟女-亚洲欧美一区| 青青草玖玖爱| 91精品成人| 97久久久久久久精| 精品人妻伦一二三区久久| 岛国免费黄色网址| 九九九精品成人免费视频小说| 天天拍天| 97超视频在线观看| 国产天美传媒精品| 中文字幕一品色图| 日日日日做夜夜夜夜做无码97| 国产精品午夜成人福利| 久九干| 在线观看AV不卡| 麻豆人妻精品一区二区| 欧美性生活综合| 美女午夜福利免费视频| 久久精品欧美一区二区三区不卡| 欧州91高潮| 91白嫩| 97超碰9| 东京太热男人的天堂久久久| 射久久| 亚洲欧美97| 狠日欧美| 久久大黄片| 天天澡天天爽日日AV| 欧美日韩中文字幕人妻| 欧成人精品H无码| 精品人妻久久久久一区二区三区| 玖色av| 丰满人妻-区二区三区免费看| 久草老司机| 精品大全99999| 欧美淫乱视频| 日本人妻丰满熟妇久久久久久| 日本一区不卡| 国产91av在线播放| 男女性感激情网站| 国产18精品亚洲精品| 丁香婷婷九月| 91人人爽人人爽| 亚射在线| 欧美日本视频一区| 97操| 欧美日韩性爱无码| 精品久热| 久久超碰大香蕉| 青草视频人妻在线观看| 噜噜噜噜久久久精品免费| 欧美天天干| 成人一二| 天天操天天舔| 日韩三四五区| 欧美一区二区三区黄色影视| 亚洲欧美清纯| 久久久久国产精品喷潮免费观看臀 | 亚洲AV成人精品网站在AV| 370p日韩欧美亚洲精品| 熟妇操花| 欧美精品丝袜久久久中文字幕| 日韩天天本| 99热在线只有精品| 亚洲精品尤物yw在线影院| 日本操BAV| 国产夜夜艹| 色欧洲97| 欧美色图片| 老熟女乱子伦中文字幕一区二区| 99在线免费视频| 久久 亚洲 日韩 人妻| 4tube欧美女厕所| 亚洲美女av无码| 很很热性爱视频| 综合 青草 伊久久 影院 综合 | 亚洲激情在线观看一区| 啪啪一区| 亚洲的天堂网| 久久欲| 加勒比大香蕉视频在线| 99久久久| 人人插人人摸人人| 久久久婷| 99色网| 五月色网| 蜜桃香蕉久草精品在线| 日韩一级成人毛片免费观看| 欧亚第一综合网| 久久精品国产亚洲av水密被窝| 九九热久久99精品re| 精品一区二区啪啪啪| 国产不卡的视频 | 久插综合| 亚洲A曰本VA欧美VA视频| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 很很干很很操| 久久精品无码专区| 国内91熟女人妻丝袜天天精品视频在线 | 欧美老妇综合网| 香蕉人欧美综合| 99精品久久久久久久婷婷蜜桃| 啊啊啊在线观看免费视频| 热热色中文无码| 日本精品不卡一二三区| 加勒比少妇AV婷婷六月天超碰超碰| 丁香色狠狠色综合久久小说| 青青草自拍视频在线播放| 99热一区二区三区四区| 97五月天| 91熟女视频| 欧美后进式| 97中文综合| 97碰在线视频| 亚洲天天更新| 中文字幕国产精品1区| 黄页av| 亚洲AV无码天美传媒一区| 人人操人人操人妻人| 日本福利二区视频| 91伊人| 0755午夜福利视频| 免费黄色视频网址| 一级毛片电影免费看| 99超碰色| 国产一进一出视频网站| 久久精品一区二区三区蜜桃臀| 精品一区二区综合熟妇| 亚洲综合另类色图| 色婷婷五月综合| 91爱| 日韩人妻精品中文字幕| 久久人人爽人人爽人人片Ⅴ| 欧美双插| 麻豆国产第一| 国产精品老师| 亚洲欧洲中文日韩女优乱码| 五毛骚逼极品美女怕怕| 狠狠干狠狠干| 亚洲熟女性高潮久久久| 97操B| 不卡人妻少妇精品毛片一区23区视频 | 女人高潮抽搐喷水视频网站| 亚洲欧美97| 暖暖精品二区三区观看| 精品亚洲国产成人精品| 98久久超碰| 97超久碰| h在线看免费版在线看| 狠狠婷婷亚洲中文综合久久| 伊人亚洲综合| 欧美日韩资源在线| 看一级黄色视频| 色屁屁影院www国产| 国偷自 一区二区| 久久极品伊人| 91性高潮久久久久久久久| 一区二区三区国产在线播放 | 校园春色 亚洲| 96精品久久久久中文字幕| 亚洲一本色道中文无码aV天美| 久久香蕉国产线看观看亚洲女人 | 日本国产欧美高清在线| 日本免费不卡二区| 亚洲成人久久一区二区| 加勒比在线视频一区二区三区| 丁香五月激情综合| 人妻少妇无码| 夜草网站| 色综合五月天| 亚洲高清国产理伦片| 欧美亚洲手机在线| 亚洲天天自拍| 亚洲区限制级 99| 97亚洲综合电影| 国产大学生高潮在线播放| 成人精品久久久午夜福利| 色色九区| 欧美人妖内射| 91精品国产长腿丝袜美女| 日本九九久久99播| 区一在线观看| 蜜臀av在线播放一区二区三区| 操逼国产免费| 波多野42部无码喷潮在线观看| 欧州91高潮| 欧美狠狠狠| 日韩成人人妻网站| 人人九九精| 久久大线蕉一区| 懂色综合久久久| 99综合视频一体| 亚洲欧美日韩夜夜| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 97超碰国产精品| 99色热| 国产精品宅男免费| 国产不卡精品91| 天堂种子在线www网资源| av在线一区二区三区| 午夜乱轮操逼视频免费看| 国产精品不卡高清在线观看| 久久伊人最新网址视频| 中文操逼字幕| 91精品微拍福利| 99在线免费公开视频| 男女激烈网站最新| 色网在线视频观看免费| 操高情无码| 国产97视频免费观看| 亚洲成A∨人影院在线欢看| 澳门特级毛片免费观看| 精品久久久亚洲AV成人网站| 久久99综合| 亚洲黑丝在线| 美女淫穴| 免费国产| 肏逼视频日本| 国产精品自拍xxxx| 日本99久久| 五月天婷婷久久| 7月婷婷综合| 国产传媒一区日韩| 2020中文字幕在线| 97超碰站| 2019天天干天天操| 欧美制服网站美腿丝袜| 精品人妻一区二区乱码一区二区| 久草精品一区 | 操啊国产| 三级片网站在线播放| 色久综合| 夜精品久无码| 中文字幕欧美丝袜07资源| 天天日天天干天天色| 国产精品自拍欧美在线| 欧美第一页性| 大香蕉之青青草原| 性色A∨91| 日韩综合无码色欲vv| 色五月综合网| 97se综合| 久久久精品中文字幕爱豆| 色乱二区| 久久久久久91香蕉国产| 久久黄黄黄| 国产成人超碰在线| 欧美躁死她一区二区| 亚洲欧美日韩有码| 另类小说欧美激情校园春色| 97精品熟女少妇一区| 成人资源中文字幕在线观看天天| 日本精品性生活久久久| 亚洲爽图| 伊人婷婷五月天| 一区| yw尤物av无码点击进入麻豆| 大香蕉乱伦视频网| 日本三级韩国三级美三级91| 欧美熟妇成人一区二区| 女色视频社区| 欧州91高潮| 欧亚性爱视频免费看| 欧美性色综合网| 中文字幕在线免费观看 | 亚洲天堂人人妻| 一起草三级AV电影在线观看 | 精品久久久久成人码免| 精品人妻一区二区视频| 免费农村成人少妇人妻Aa一区二区视频| 国产91丝袜在线播放蜜月| 午夜操逼不卡| 四虎884a| 亚洲国产婷婷在线播放| 综合网欧| 色欲三区| 99www.bibizy香蕉资源国产一区二区三区高清 | 久久久性少妇| 亚洲区限制级| 精品人妻1区| 日韩欧美成人大香蕉| 一区二区高清视频| 天天综合日韩网| 国产成人五月天丁香花| 天天色粽合合合合合合合| 日本五区不卡| 综合色色婷婷| 无码二级三级| 婷婷六月色| 97在线视频网站| 久久99久久99精品免视看婷婷| 伊人嫩草| 性爱久久| 女性喷水高潮在线观看| 美女裸体麻豆天美蜜桃91| 色色色日本| 大香蕉欧美伊| 久久国产乱子伦精品免费女人| 青青草精品| 亚洲第一免费视频| 亚洲s色图| 91精品国产高清久久久久久,亚洲成人| 欧美综合色综合| 激情AV| 91美女网站| 久久夜夜夜夜| 亚洲古典另类欧美在线| 91无码人妻精品一区二区三区蜜桃| 亚洲啪啪性视频| 天天干18禁| 黄色成品网站| 五月丁香拍拍激情综合三级| 亚洲男人天堂视频| 中美日韩毛片| 国内偷自视频区视频综合| 色五月第四色| 入口操逼网站| 色97干| 久久精彩视频9| 日韩av免费一级电影| 激情终合网| 女人双腿搬开让男人桶| 超碰吊日色| 偷拍网站久久男女男| 高清无码在线播放网站| 一卡二卡在线播放| 殴美日韩m| 亚洲中文字母在线播放| 亚洲激情片| 91/欧美| 亚洲欧美精品91| 亚洲?V无码专区在线电影| 我想要啊 啊 啊| 小草精彩毛片| 尤物一级在线免费观看| 亚欧高清| 九九热精品视频六| 一区,二区,三区视频| 99热在线观看| 伊人久久综合影院| 欧美加勒比| 色网综合网| 黄页大片在线观看| 不卡免费av在线播放| 日本孕妇一区二区视频操逼免费看 | 天天操天天舔| 日韩视频中文字幕| 人妻熟女一区二区三区视频| 乱老熟女一区二区三区| 大香蕉在线视频15| 日本中文字幕在线电影| 家庭乱伦性爱av| 日韩性爱小视频| 欧美激情亚洲| 免费国产| 操淫穴亚洲五月丁香| 久热久一区二区三区| 婷婷伊人网| 手机在线人成免费视频| 大学生口爆吞精| 极品国产内射| 97超碰人妻| 91日韩网站| 蜜桃臀一区二区aV| 日韩精品9区| 久久久性爱视频| 国产精品经典一卡久久久 | 91性网| 九九久久国产精品怡红院| 色制服丝袜夫妻av一区| 丝袜美腿校园春色| 黄色十八禁网站| 成人综合网 欧美| 少妇毛片久久| 大香蕉在线视频重口味毛片在线| 青青草吊丝| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日韩免费三级黄片电影| 秋霞一集毛片观看| 内射小黄片| 日韩黄片视频试看| 国产Aα| www国产天美久久久| 国产美女mm131爽爽爽爽| 老司机老司机午夜影院| 日韩不卡a级视频专区| 亚洲 欧美日韩 另类| 中文字幕av色| 熟女在线视频| 77国产精品| 亚洲91射| 国产99热| 一本精品日本在线视频精品| 国产操操日韩三级黄| 日本三级R| 蜜臀少妇一区二区| 青青操在线亚洲视频观看欧美在线 | 久久噜| 欧美视频一区二区三区| 超碰91在线| 牛牛操视频逼| 中国探花熟女| 成人五月香网在线| 十八禁黄色成人网站观看| AV色五月天| 欧美一级二级三级| 国产亚洲精品美女久久久| 一本一道vs波多野结衣| 欧美一区91大爱| 蜜桃视频一区二区三区在线观看| 亚洲怡春院| 亚洲国产97| 日本熟女免费視颖| 99视频只有精品| 求求你操操我| 中国少妇啪啪视频| 欧美性爱免费短视频| 精品-91人妻子系列| 精品一区二区三区最新| 色综合 加勒比| 色网站导航大全| 成人日本视频人妻在线| 超碰 另类 欧美 | www色婷婷| 国产男女无套97| 精品国产乱码久久久影院| www国产无码| 99久久久无码国产精品性男| 有码人妻系列| 亚洲欧美在线丝袜| 亚洲日韩美女中文字幕乱| 欧美精品在线观看| 人人妻人人爽人人精品| 少妇一区二区三区精选| 日韩97超碰中文字幕| 国产精品乱码久久久久久久久| 99re9这里只有精品| 蜜臀久久99精品久久久久久| 欧美日日夜夜| 亚洲欧美国产日本一区二区三区 | 神马久久啊啊| 亚洲婷婷丁香在线| 五月色网| 欧美激情亚洲情色| 亚洲精品无码久久AV| 男人的天堂在线2| 男人天堂新在线| 国内三级自拍小视频在线观看| 亚洲欧洲色情高清| 精品久久无码午夜福利| 91逼逼女人91| 99久久99久久免费精品蜜臀| 九九av| 亚洲天堂一区二区| 日韩丝袜二区| 久久久成人免费av电影| 亚洲国产精品成人无码久久久 | 中国zzijzzijzzwww精品| 亚熟在线| 亚洲无无码αⅴ每日更新| 97国伦国色| 人人模人人看| 国产91精品久久久久久久网曝门| 2024年最新色情网站在线观看 | 亚洲中文字幕在线视频一区二区| 在现视频女上位好爽| 九九九九九精品视频| 色婷婷影视| 久操免费观看| 欧美专区第一页| 一区二区三区免费视频入口 | 日韩无码一级黄色av片| 天天爽夜夜欢视| 黄人人操人人操| 男人精品天堂一区| 1024人妻熟女一区二区三区| 99精品无码| 99无码| 欧美少妇色图| 亚洲综合性感在线| 国产精品爽爽v| 色777999综合| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 色综合99| 亚洲不卡三级手机播放| 久久內射| 免费黄色A片| 唯美清纯 妖精视频| 翘臀vidoes| 99色色| 日本一级特级毛片视频| 亚州综合AⅤ| 国产精品亚洲免费| 放黄片放3级黄片没穿衣服| 精品十三区| 天天日B夜夜干B时时操B| 加勒比99999| 久久超碰亚洲人| 午夜福利免费精品视频| 啪啪啪亚欧美视频| 啊啊啊不要啊啊受不了了视频在线 | 老司机射| 亚洲图片欧美色图| 新精精品久久精品| 婷婷激情啪啪| 亚洲精品xxx| 美女网站91| 久久99精品国产| 婷婷色婷婷| 欧美综合娱乐久久| 亚洲风情在线观看| 亚洲性少妇| 亚洲色吧网| 日日摸夜夜夜夜爽| 亚州欧美色图| 啊啊啊操死我了| 欧美97在线观看| 超碰国产在线| 在线a v| 无码精品久久久久久亚洲| 国产精品在线一区二区| 观看视频图片一区二区三区| 亚洲一区中文字幕一区| 国产亚洲深夜激情| 蜜臀网 一区| 国产和美国毛片| 密臀在线免费观看| 丁香五月大香蕉| 成人美女av| 无码一区免费在线不卡| 美女高潮国产高清| 女人18精品一区二区三区| 色天使大香蕉| 一区二区久久天天干狠狠| 天天天天天干夜夜夜夜夜操| 欧美日韩另类在线| 狠狠操狠狠操操| 麻豆av一区二区| 亚洲AV色图一区| 伦理弟一页| 欧美日韩黄色片一区二区三区四区人与兽做爱| 色色婷婷五月天| 日韩精品永久在线观看| 久久久久人妻二区精品叶可怜| 精品视频一区二区| 中文字幕在线观看网址| 色欲久久99国产精品久久久久久| 蜜区区视频79| 一本色道久久综合狠狠操| 好爽免费视频,| 亚洲综合九| 白 大 人妻 区 在线| 女同性恋一区二区三区精品视频| 黄色污污污污污污网站| 91neishe| 啊啊啊 在线观看| 丝袜熟女2P| 亚洲AV无码天美传媒一区| a网站免费观看| 天天干一干| 欧美图片偷拍| 久久久久久夜夜夜夜夜| 一道本东京热加勒比一区二区三区| 少妇高潮99p| 亚洲精品蜜桃久久久一区二区三区| 69超碰综合| 久久久久中出| 330Dv国产女人终合视频极品人与兽| 夜夜嗨AV蜜臀av| 97久久超碰国产网站| 欧美日韩一干二干| 色哟哟av网址| 精品十八在线观看| 777超碰| 日本熟女不卡视频| 国产成人欧美一区二区三区的国产| 丁香六月激情| 网页导航五月天免费一二三区| 人人做人人妻人人夜视频| 蜜桃无码AV一区二区| 成片免费观看视频大全| 性站 | 亚洲成人福利电影免费| 久久婷婷色| 狠狠狠一区二区三区| 二对二中文字幕。| 亚洲一二三四区在线免费看视频 | 国产剧情一区在线观看| 亚洲精品丝袜| 亚洲精品人伦一区二区| 日韩内| 人人么人人操| 日本一区二区成人在线| www.婷婷| 熟妇人妻一区二区三在线| 涩亚洲欧洲| 操一操摸一摸| 澳门特级毛片免费观看| 第二页中文字幕| 97久久国产精品| 天天看天天日| 人人天天干干| 曰本精品久久久| 神马久久免费电影观看| 亚洲欧美日韩中文播放| 爆操无码| 久久国产精品,久久国产| 国产高清在线自在拍69| 一起草三级AV电影在线观看| 成人免费在线网站| 99re9这里只有精品| 久久蜜桃一区二区| 亚洲国产一区二区入口| 久久精品一区二区三区不卡| 91AV天美在线视频| 中日韩免费看男女操逼大全| 影音先锋国产精品| 熟女欧美日韩综合婷婷| 97这里只有精品| 精品一区二区成人动漫| 中文97国产| 在线无码操| 欧美最婬乱婬爆婬性视频 | 黄色AAAAAAAAAAA大片| 天天综合精品| 果冻传媒A片麻豆熟妇人妻| 国产精品久久久久久无码红治院| 国产高清1234区| 亚洲情色 自拍| 十八禁的黄污污免费网站| 欧美亚洲第1页| 啊啊啊啊啊啊好多水| 99日精品欧美国产| 青操影院| 狠狠操夜夜| 欧美72网页| 翔田千里A片一区二区| 九九九九久久久| 99操逼| 亚洲中文字幕三级在线| 91男同| 欧美黄色大片在线观看| 快点操死我| 亚洲 欧美 日韩 国产一区二区| 成功精品影院| 综合亚洲欧美| 日韩三级视频一区二区三区| 无码粉嫩白虎一线天b区| 九九黄色视频在线观看| 国内成人圈中文字幕无码视频| 国产 日韩 欧美高清| 天堂在线一区二区| 女人被男人桶爽视频网站| 麻豆精品A片免费观看| 黄色片A级一区二区三区| 亚洲欧美另类少妇精品| 蜜乳AV免费观看| 99热aaa| 看大黄色大片原件| 天美传媒av一区二区| av无码av无码专区| 超碰97人人乐| 天天综合网站| 亚洲久久久久| 久久久久久久久久久久久久久乱码 | 亚洲情色中文字幕一区| 91熟女少妇| 国产又色又爽又舒服的三级视频| 欧美黑人与女人91| 成人资源中文字幕在线观看天天| 麻豆久久一区二区三区| 在线综合 亚洲 欧美中文字幕| 人人人摸人人| 欧美影音在线| 日韩黄色电影网站| 亚洲欧美另类图片| 天天综合欧美综合| 国产真实野战在线视频| 97视频播放| 台湾肥佬网一区二区三区| 欧美不卡二区| 一本色道熟妇| 色九月综合| 亚洲图片欧洲图片aⅴ| 99re视频在线播放青草| 男人的天堂.com| 丝袜剧情| 久久久久国产精品久久久| 97日视频| 香蕉久久国产AV一区二区| 2020久久免费视频| 插入粉嫩少妇视频| 亚洲人精| 99久久久久久久久| 国产9区| 日本高清熟女久久一区| 清柠毛片| 欧美日韩精品一区二区三区高清| 亚洲黄色AV电影| 成人五月天色网| 婷婷综合网| 热久久国产| 成人性交免费视屏| 新精精品久久精品| 91 亚洲 欧洲| 国产亚州高清国产拍精| 无码不卡亚洲成?人片| 91男同| 欧美色图偷拍另类| 欧美一级色| 日韩卡一卡二卡三在线| 久草加勒比一区在线| 久久人妻少妇| 欧美激情欧美精品| 亚洲性爱高潮影院| 久久久麻豆精品| 国产高清视频无码在线| 久久久性爱| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | yazhououmeizongya| 五月天综合网| 不卡超碰护士AV在线免费播放| 亚洲国产一区二区三区四区国产| 热无码中文亚洲H一道本一区二区| 久久香蕉国产线看观看亚洲女人 | 女人被添高潮免费视频| 啪啪啪东京| 超碰色综合| 97操B| 91插B网站| 91AV天美在线视频| 青青草日本中文字幕| 厕所偷拍在线| 九色 人妻 大香蕉| 99欧美| 99久久综合网| 中文字幕av乱伦| 333kkkk·亚洲com久久| 免费看黄视频亚洲网站| 熟女这里只有精品6| 欧美片第一页| 精品国产一区探花在线观看| 人人妻人人玩人人澡人人爽| 国产91美女视频| 新91视频.cmp| 久操免费电影| 午夜美女诱惑电源网| 欧美色交| 九九九九亚洲| 欧美综合色,www| 91白虎| 狠狠爱夜夜| 亚洲熟女av中文字幕| 一区二区视频在看| 91制服丝袜中文字幕| juliaann欧美丝袜办公室| 91欧美www| 一本色道久久综合精品婷婷| 97在线视频免费看| 久操免费观看| 亚洲国产综合视频| 亚洲AV麻豆Aⅴ无码电影一| 91精品无码久久久久久久| 超碰97人妻免费在线| 影音先锋日本乱伦| 九九综合久久中文字幕| 精品无码不卡视频| 婷婷激情五月天小说网| 大屁股xxxxx| 青青草中文-久久青草精品一区二区三 | 色噜噜国产在线| 精品无吗久久| 好舒服视频| 亚洲天堂一区二区| 在线不欧美| 中文字幕日韩电影人妻| 国产大学生口爆吞精合集| 一区二区三区精品久久| 五月激情综合网| 91网亚洲| 国产吹潮女在线观看| 98超碰欧美| 人人模人人看| 熟女精品va中文字幕| 操99| 超碰99热中文字幕| 久久久精品九| 色在线视频导航| 久久久亚洲欧美综合| 91精品丝袜久久久久久| 97综合在线观看| 五月开心久久AV官网| 欧美春色| 亚洲精品国产日韩无码AV永久免| 国产精品久久伊人| 久久久999网站| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 亚洲伊人久久综合97| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 成人蜜乳小视频网站| 国产第25页在线观看| 久久,精品一二三| 日韩欧亚中文在线| 欧美不在线| 精品高清一区二区三区三州| 色情综合网| 97视频www| 精品人妻av区天天看片| 3P乱轮视频| 啊啊啊com| yazhououmeizongya| 激情熟女12P| 亚洲无码99| 加勒比伊人影院| 亚洲中文字幕在线视频一区二区| A片三级无码| 欧美天堂日韩三级国产传媒| www.久久超碰| 乱伦av麻豆| 欧美成不卡网| 精品九区| 亚洲免费人妻在| 天天影视射综合网| 精品国产Av无码久久久伦古装| 久久99午夜精品一区人妻| 成人日本精品九区| 午夜超碰| 久99| 大干人妻| 国产极品99热在线播放69| 日本免费不卡二区| 91A欧美电影网站| 无码抄逼网| 操淫穴亚洲五月丁香| 一区二区精品日韩欧美在线观看| 一区二区激情国产熟女 | 亚洲精品中文字幕一区在线视频 | 搡老女人老熟女91| 久久曰曰| 91激情国产| 日韩国产成人自拍视频| 国产人妻一区二区三区欧美毛片| 国产精品不卡av免费在线观看| 大香交伊人网| 国产日韩怡红院| 丰满的三级少妇欧美久久久| 久久精品人妻一区二区| 日韩精品在线观看观看| 大香蕉在线免| 无码高清操逼网址| 麻豆AV96熟妇人妻| 国产三级在线现体验区| 麻豆人妻少妇在线免费观看| 亚洲欧美日韩制服另类| 中文字幕制服欧美久久一区| 黄片www视频免费| 极品丝袜无码| 大JI巴好深好爽又大又粗视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 夜夜欧美| 久久久蜜桃一区二区三区| 91殴美| 久久久亚洲精品电影免费看| 老女人综合网| 中文字幕乱碼在线| 成年人三级黄色片视频| 操逼999| 另类小色呦| 欧美欧美少妇| 青青草九九九九九| 日韩av在线精品观看| 熟女色图在线| 亚洲天堂AV在线播放| 91网站在线播放| www.久久99| 欧美裸体美女日麻屄| 中文久久一区| 综合操逼| 天躁夜夜躁2021| 91青视频| 超碰国产精品无码| 国产91专区| 校园春色 男人天堂| 人人弄人人摸| Aa东京男人的天堂| 国产超碰在线| 久久久久久网址| 使劲用力艹少妇视频一区二区| 99精品久久久久久久婷婷| 男人的天堂99| 中文久久一区| 抽插无码高清一区| 亚洲另类天堂| jiujiujiujingpin| 中文字幕 码 自拍 视频 区| 中文字幕蜜乳av| 任你干在线视频| 天天射影院| 久久久久久一日韩字幕无码| 中日992视频| 亭亭丁香激情| 一级A啪啪啪啪| 青青操网| 国产夫妻性生活视频| 日本一区二区三区欧美日韩中文字幕| 欧美激情另类一区二区| 伦理第一页| 天天综合香 ld视频| 国产一级αv免费看片| 极品销魂美女一区二区| 亚洲91射| 国产精品久久久777| 色色色综合网| 老熟妇一区二区三区…| 亚洲AV无码乱码| 欧美一区二区三熟女剧情| 麻豆AV一区二区| 91粉嫩萝控精品福利网站_精品影音先锋国 | 免费观看日本操逼视频| 肉丝中文无码高清| 九九久久国产精品| 色激情五月天| 91人妻中文| 成年人网站在线免费观看| 校园春色 亚洲| 在线情色电影 91大 | 99re6国产精品99re| 色一射色一射| 9 9精品一区二区三区| 久久久久久久久成人av解说| 国模无码人体一区二区三| 综合色欧美| 亚洲人妻久久久| 加勒比海成人视频网| 高树玛利亚无码流出| 六九九九| 99操视频| 日本在线激情一区二区三区| 女人被男人桶爽视频网站| 性色AV网站| 91网站18| 蜜臀99久久精品久久久久| 久久久久久综合久久伊人蜜月| 国产精品熟女一区二区三区| 91色人| 夜夜 中文视频rt| 神马久久久久久久久久| 国精品一区二区三| 天天综合日韩网| 欧美72网页| 国产成人亚洲精品无码最新在线| 亚洲双插| 亚熟在线| 97操97色| 日本亚洲vr欧美不卡高清专区| 丁香五月电影| 一级黄色影片| 久久丁香| 看日韩美女二区三区免费操逼视频| 午夜男女爽爽爽在线视频| 五月丁香社区婷婷日韩欧美精品影院 | 久草色在线观看| 欧美高清在线| 亚洲欧美综合网站| 日本性一区| 青青草五月份天| 床戏久久久av一区二区麻豆| 黑人精品欧美一区二区蜜桃| 人妻少妇无码| 另类欧美综合| 97Ai亚洲| 久久久9999| 免费家庭乱伦视频| 熟女这里只有精品6| 国产成人综合在线播放| 色呦呦呦在线观看视频| 日本三级R| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 在线一道啪| 亚洲熟女中文字幕在线|