[{"data":1,"prerenderedAt":1636},["ShallowReactive",2],{"page-/post/cli/cli-readme":3,"surrounding-page":1627},{"id":4,"title":5,"author":6,"body":7,"date":1616,"description":55,"extension":1617,"group":6,"lastmod":1618,"meta":1619,"navigation":476,"path":1620,"rawbody":1621,"seo":1622,"showTitle":6,"stem":1623,"tags":1624,"versions":6,"__hash__":1626},"content/post/CLI/cli-readme.md","Z-CLI 使用说明",null,{"type":8,"value":9,"toc":1595},"minimark",[10,14,19,31,36,42,49,103,106,125,134,144,148,151,174,177,193,195,210,217,220,261,265,268,275,282,288,291,312,342,345,742,745,847,934,939,947,950,954,987,991,997,1006,1035,1038,1060,1066,1177,1180,1276,1279,1284,1301,1304,1307,1396,1401,1404,1407,1415,1418,1427,1432,1503,1506,1511,1520,1525,1582,1591],[11,12,13],"h2",{"id":13},"安装",[15,16,18],"h3",{"id":17},"node","Node",[20,21,22,23,27,28,30],"p",{},"使用 ",[24,25,26],"code",{},"nvm"," 管理多个 ",[24,29,17],{}," 版本",[20,32,33],{},[24,34,35],{},"node >= 18.18.0",[20,37,38,39],{},"推荐版本(我的)：",[24,40,41],{},"20.18.1",[20,43,44,45,48],{},"查看 ",[24,46,47],{},"registry"," （非必要步骤）",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-shell shiki shiki-themes github-light","npm config get registry\n# https://registry.npmjs.org\n# 如果不是，则需要先设置\nnpm config set registry=https://registry.npmjs.org\n","shell","",[24,57,58,77,84,90],{"__ignoreMap":55},[59,60,63,67,71,74],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"s7eDp","npm",[59,68,70],{"class":69},"sYBdl"," config",[59,72,73],{"class":69}," get",[59,75,76],{"class":69}," registry\n",[59,78,80],{"class":61,"line":79},2,[59,81,83],{"class":82},"sAwPA","# https://registry.npmjs.org\n",[59,85,87],{"class":61,"line":86},3,[59,88,89],{"class":82},"# 如果不是，则需要先设置\n",[59,91,93,95,97,100],{"class":61,"line":92},4,[59,94,66],{"class":65},[59,96,70],{"class":69},[59,98,99],{"class":69}," set",[59,101,102],{"class":69}," registry=https://registry.npmjs.org\n",[20,104,105],{},"安装最新版",[50,107,109],{"className":52,"code":108,"language":54,"meta":55,"style":55},"npm i -g @zzclub/z-cli\n",[24,110,111],{"__ignoreMap":55},[59,112,113,115,118,122],{"class":61,"line":62},[59,114,66],{"class":65},[59,116,117],{"class":69}," i",[59,119,121],{"class":120},"sYu0t"," -g",[59,123,124],{"class":69}," @zzclub/z-cli\n",[20,126,127,128,130,131,133],{},"安装后只能在当前 ",[24,129,17],{}," 版本下使用，切换到其他低版本 ",[24,132,17],{}," 则无效",[20,135,136,137,140,141],{},"全局命令为：",[24,138,139],{},"zz","  或 ",[24,142,143],{},"z",[15,145,147],{"id":146},"bun","Bun",[20,149,150],{},"macos",[50,152,154],{"className":52,"code":153,"language":54,"meta":55,"style":55},"curl -fsSL https://bun.sh/install | bash\n",[24,155,156],{"__ignoreMap":55},[59,157,158,161,164,167,171],{"class":61,"line":62},[59,159,160],{"class":65},"curl",[59,162,163],{"class":120}," -fsSL",[59,165,166],{"class":69}," https://bun.sh/install",[59,168,170],{"class":169},"sD7c4"," |",[59,172,173],{"class":65}," bash\n",[20,175,176],{},"wind",[50,178,180],{"className":52,"code":179,"language":54,"meta":55,"style":55},"powershell -c \"irm bun.sh/install.ps1 | iex\"\n",[24,181,182],{"__ignoreMap":55},[59,183,184,187,190],{"class":61,"line":62},[59,185,186],{"class":65},"powershell",[59,188,189],{"class":120}," -c",[59,191,192],{"class":69}," \"irm bun.sh/install.ps1 | iex\"\n",[20,194,105],{},[50,196,198],{"className":52,"code":197,"language":54,"meta":55,"style":55},"bun i -g @zzclub/z-cli\n",[24,199,200],{"__ignoreMap":55},[59,201,202,204,206,208],{"class":61,"line":62},[59,203,146],{"class":65},[59,205,117],{"class":69},[59,207,121],{"class":120},[59,209,124],{"class":69},[20,211,212,216],{},[213,214,215],"strong",{},"如果提示缺少某个包","，可以按提示再次运行相关命令",[11,218,219],{"id":219},"命令",[221,222,223,237,249,255],"ul",{},[224,225,226,229,230,233,234],"li",{},[24,227,228],{},"i18n"," 缩写 ",[24,231,232],{},"i"," 从Vue文件提取出",[213,235,236],{},"中文国际化文件",[224,238,239,242,243,246,247],{},[24,240,241],{},"translate"," 缩写：",[24,244,245],{},"trans","  批量翻译",[213,248,236],{},[224,250,251,254],{},[24,252,253],{},"set"," 设置配置文件",[224,256,257,260],{},[24,258,259],{},"tiny"," 任意图片压缩体积",[11,262,264],{"id":263},"i18n-规则说明","i18n 规则说明",[15,266,267],{"id":267},"文件",[20,269,270,271,274],{},"只提取 ",[24,272,273],{},".vue"," 文件",[15,276,278,281],{"id":277},"t解析及生成规则",[24,279,280],{},"$t","解析及生成规则",[20,283,284,285],{},"提取正则： ",[24,286,287],{},"/\\$t\\(['\"]i18n\\.([^'\"]+)['\"]\\)/g",[20,289,290],{},"举例：",[50,292,296],{"className":293,"code":294,"language":295,"meta":55,"style":55},"language-js shiki shiki-themes github-light","$t('i18n.module-name.placeholder.month')\n","js",[24,297,298],{"__ignoreMap":55},[59,299,300,302,306,309],{"class":61,"line":62},[59,301,280],{"class":65},[59,303,305],{"class":304},"sgsFI","(",[59,307,308],{"class":69},"'i18n.module-name.placeholder.month'",[59,310,311],{"class":304},")\n",[221,313,314,320,326,332],{},[224,315,316,317],{},"module-name 会被解析为文件名称 => ",[24,318,319],{},"module-name.js",[224,321,322,323],{},"后面的内容会被解析为对象的属性 => ",[24,324,325],{},"{ placeholder: { month: \"month\"}} ",[224,327,328,329,331],{},"保存位置如果没传。就会保存在 ",[24,330,273],{}," 同级目录下",[224,333,334,335,338,339],{},"默认忽略 module-name 为 ",[24,336,337],{},"common"," => ",[24,340,341],{},"$t('i18n.common.xxx')",[15,343,344],{"id":344},"中文注释规范及提取规则",[50,346,350],{"className":347,"code":348,"language":349,"meta":55,"style":55},"language-vue shiki shiki-themes github-light","\u003Ctemplate>\n  \u003C!--i18n addTitle=你好呀 a=不错   b=叭叭叭 c=哈哈哈  -->\n  \u003CCommonEditForm :page-type=\"pageType\" :title-config=\"titleConfig\" :custom-components-code=\"$t('i18n.monthlyForecast.pageTitle.addTitle')\" :is-out=\"2\">\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.form.a') }}\u003C/div>\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.form.b') }}\u003C/div>\n    \u003C!--i18n select=真棒 -->\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.placeholder.select') }}\u003C/div>\n  \u003C/CommonEditForm>\n\n\u003C/template>\n\n\u003C!-- js 区域 -->\n\u003Cscript>\n   import {formatDate} from \"@/common/utils\"\n   import CommonEditForm from \"@/pages/ifpf/costForecast/monthlyForecast/views/common-edit-form.vue\"\n\n   export default {\n       name: 'ifpfExchangeRateMaintainAdd',\n       components:{\n           CommonEditForm,\n       },\n       data() {\n           return {\n               pageType: 'edit',\n               titleConfig: {\n                   title: this.$t('i18n.monthlyForecast.pageTitle.addTitle'),//测试\n                   icon: this.$t('i18n.monthlyForecast.pageTitle.icon'), // 图标\n                   date: formatDate.formatDateOnly(new Date()),\n                   info: this.$t('i18n.monthlyForecast.pageTitle.addInfo')//你好\n               },\n           };\n       }\n   };\n\u003C/script>\n\n","vue",[24,351,352,364,369,412,427,441,447,461,471,478,488,493,499,509,524,537,542,554,566,572,578,584,593,601,612,618,643,666,686,709,715,721,727,733],{"__ignoreMap":55},[59,353,354,357,361],{"class":61,"line":62},[59,355,356],{"class":304},"\u003C",[59,358,360],{"class":359},"shJU0","template",[59,362,363],{"class":304},">\n",[59,365,366],{"class":61,"line":79},[59,367,368],{"class":82},"  \u003C!--i18n addTitle=你好呀 a=不错   b=叭叭叭 c=哈哈哈  -->\n",[59,370,371,374,377,380,383,386,389,391,394,397,399,402,405,407,410],{"class":61,"line":86},[59,372,373],{"class":304},"  \u003C",[59,375,376],{"class":359},"CommonEditForm",[59,378,379],{"class":65}," :page-type",[59,381,382],{"class":304},"=",[59,384,385],{"class":69},"\"pageType\"",[59,387,388],{"class":65}," :title-config",[59,390,382],{"class":304},[59,392,393],{"class":69},"\"titleConfig\"",[59,395,396],{"class":65}," :custom-components-code",[59,398,382],{"class":304},[59,400,401],{"class":69},"\"$t('i18n.monthlyForecast.pageTitle.addTitle')\"",[59,403,404],{"class":65}," :is-out",[59,406,382],{"class":304},[59,408,409],{"class":69},"\"2\"",[59,411,363],{"class":304},[59,413,414,417,420,423,425],{"class":61,"line":92},[59,415,416],{"class":304},"    \u003C",[59,418,419],{"class":359},"div",[59,421,422],{"class":304},">{{ $t('i18n.monthlyForecast.form.a') }}\u003C/",[59,424,419],{"class":359},[59,426,363],{"class":304},[59,428,430,432,434,437,439],{"class":61,"line":429},5,[59,431,416],{"class":304},[59,433,419],{"class":359},[59,435,436],{"class":304},">{{ $t('i18n.monthlyForecast.form.b') }}\u003C/",[59,438,419],{"class":359},[59,440,363],{"class":304},[59,442,444],{"class":61,"line":443},6,[59,445,446],{"class":82},"    \u003C!--i18n select=真棒 -->\n",[59,448,450,452,454,457,459],{"class":61,"line":449},7,[59,451,416],{"class":304},[59,453,419],{"class":359},[59,455,456],{"class":304},">{{ $t('i18n.monthlyForecast.placeholder.select') }}\u003C/",[59,458,419],{"class":359},[59,460,363],{"class":304},[59,462,464,467,469],{"class":61,"line":463},8,[59,465,466],{"class":304},"  \u003C/",[59,468,376],{"class":359},[59,470,363],{"class":304},[59,472,474],{"class":61,"line":473},9,[59,475,477],{"emptyLinePlaceholder":476},true,"\n",[59,479,481,484,486],{"class":61,"line":480},10,[59,482,483],{"class":304},"\u003C/",[59,485,360],{"class":359},[59,487,363],{"class":304},[59,489,491],{"class":61,"line":490},11,[59,492,477],{"emptyLinePlaceholder":476},[59,494,496],{"class":61,"line":495},12,[59,497,498],{"class":82},"\u003C!-- js 区域 -->\n",[59,500,502,504,507],{"class":61,"line":501},13,[59,503,356],{"class":304},[59,505,506],{"class":359},"script",[59,508,363],{"class":304},[59,510,512,515,518,521],{"class":61,"line":511},14,[59,513,514],{"class":169},"   import",[59,516,517],{"class":304}," {formatDate} ",[59,519,520],{"class":169},"from",[59,522,523],{"class":69}," \"@/common/utils\"\n",[59,525,527,529,532,534],{"class":61,"line":526},15,[59,528,514],{"class":169},[59,530,531],{"class":304}," CommonEditForm ",[59,533,520],{"class":169},[59,535,536],{"class":69}," \"@/pages/ifpf/costForecast/monthlyForecast/views/common-edit-form.vue\"\n",[59,538,540],{"class":61,"line":539},16,[59,541,477],{"emptyLinePlaceholder":476},[59,543,545,548,551],{"class":61,"line":544},17,[59,546,547],{"class":169},"   export",[59,549,550],{"class":169}," default",[59,552,553],{"class":304}," {\n",[59,555,557,560,563],{"class":61,"line":556},18,[59,558,559],{"class":304},"       name: ",[59,561,562],{"class":69},"'ifpfExchangeRateMaintainAdd'",[59,564,565],{"class":304},",\n",[59,567,569],{"class":61,"line":568},19,[59,570,571],{"class":304},"       components:{\n",[59,573,575],{"class":61,"line":574},20,[59,576,577],{"class":304},"           CommonEditForm,\n",[59,579,581],{"class":61,"line":580},21,[59,582,583],{"class":304},"       },\n",[59,585,587,590],{"class":61,"line":586},22,[59,588,589],{"class":65},"       data",[59,591,592],{"class":304},"() {\n",[59,594,596,599],{"class":61,"line":595},23,[59,597,598],{"class":169},"           return",[59,600,553],{"class":304},[59,602,604,607,610],{"class":61,"line":603},24,[59,605,606],{"class":304},"               pageType: ",[59,608,609],{"class":69},"'edit'",[59,611,565],{"class":304},[59,613,615],{"class":61,"line":614},25,[59,616,617],{"class":304},"               titleConfig: {\n",[59,619,621,624,627,630,632,634,637,640],{"class":61,"line":620},26,[59,622,623],{"class":304},"                   title: ",[59,625,626],{"class":120},"this",[59,628,629],{"class":304},".",[59,631,280],{"class":65},[59,633,305],{"class":304},[59,635,636],{"class":69},"'i18n.monthlyForecast.pageTitle.addTitle'",[59,638,639],{"class":304},"),",[59,641,642],{"class":82},"//测试\n",[59,644,646,649,651,653,655,657,660,663],{"class":61,"line":645},27,[59,647,648],{"class":304},"                   icon: ",[59,650,626],{"class":120},[59,652,629],{"class":304},[59,654,280],{"class":65},[59,656,305],{"class":304},[59,658,659],{"class":69},"'i18n.monthlyForecast.pageTitle.icon'",[59,661,662],{"class":304},"), ",[59,664,665],{"class":82},"// 图标\n",[59,667,669,672,675,677,680,683],{"class":61,"line":668},28,[59,670,671],{"class":304},"                   date: formatDate.",[59,673,674],{"class":65},"formatDateOnly",[59,676,305],{"class":304},[59,678,679],{"class":169},"new",[59,681,682],{"class":65}," Date",[59,684,685],{"class":304},"()),\n",[59,687,689,692,694,696,698,700,703,706],{"class":61,"line":688},29,[59,690,691],{"class":304},"                   info: ",[59,693,626],{"class":120},[59,695,629],{"class":304},[59,697,280],{"class":65},[59,699,305],{"class":304},[59,701,702],{"class":69},"'i18n.monthlyForecast.pageTitle.addInfo'",[59,704,705],{"class":304},")",[59,707,708],{"class":82},"//你好\n",[59,710,712],{"class":61,"line":711},30,[59,713,714],{"class":304},"               },\n",[59,716,718],{"class":61,"line":717},31,[59,719,720],{"class":304},"           };\n",[59,722,724],{"class":61,"line":723},32,[59,725,726],{"class":304},"       }\n",[59,728,730],{"class":61,"line":729},33,[59,731,732],{"class":304},"   };\n",[59,734,736,738,740],{"class":61,"line":735},34,[59,737,483],{"class":304},[59,739,506],{"class":359},[59,741,363],{"class":304},[20,743,744],{},"解析后：",[50,746,748],{"className":293,"code":747,"language":295,"meta":55,"style":55},"export default {\n  pageTitle: {\n    addTitle: \"测试\",\n    icon: \"图标\",\n    addInfo: \"你好\"\n  },\n  form: {\n    a: \"不错\",\n    b: \"叭叭叭\"\n  },\n  placeholder: {\n    select: \"真棒\"\n  }\n}\n",[24,749,750,759,764,774,784,792,797,802,812,820,824,829,837,842],{"__ignoreMap":55},[59,751,752,755,757],{"class":61,"line":62},[59,753,754],{"class":169},"export",[59,756,550],{"class":169},[59,758,553],{"class":304},[59,760,761],{"class":61,"line":79},[59,762,763],{"class":304},"  pageTitle: {\n",[59,765,766,769,772],{"class":61,"line":86},[59,767,768],{"class":304},"    addTitle: ",[59,770,771],{"class":69},"\"测试\"",[59,773,565],{"class":304},[59,775,776,779,782],{"class":61,"line":92},[59,777,778],{"class":304},"    icon: ",[59,780,781],{"class":69},"\"图标\"",[59,783,565],{"class":304},[59,785,786,789],{"class":61,"line":429},[59,787,788],{"class":304},"    addInfo: ",[59,790,791],{"class":69},"\"你好\"\n",[59,793,794],{"class":61,"line":443},[59,795,796],{"class":304},"  },\n",[59,798,799],{"class":61,"line":449},[59,800,801],{"class":304},"  form: {\n",[59,803,804,807,810],{"class":61,"line":463},[59,805,806],{"class":304},"    a: ",[59,808,809],{"class":69},"\"不错\"",[59,811,565],{"class":304},[59,813,814,817],{"class":61,"line":473},[59,815,816],{"class":304},"    b: ",[59,818,819],{"class":69},"\"叭叭叭\"\n",[59,821,822],{"class":61,"line":480},[59,823,796],{"class":304},[59,825,826],{"class":61,"line":490},[59,827,828],{"class":304},"  placeholder: {\n",[59,830,831,834],{"class":61,"line":495},[59,832,833],{"class":304},"    select: ",[59,835,836],{"class":69},"\"真棒\"\n",[59,838,839],{"class":61,"line":501},[59,840,841],{"class":304},"  }\n",[59,843,844],{"class":61,"line":511},[59,845,846],{"class":304},"}\n",[221,848,849,860,873,880,894],{},[224,850,851,852,855,856,859],{},"template 中的注释，",[213,853,854],{},"必须","以 ",[24,857,858],{},"\u003C!--i18n"," 开头",[224,861,862,863,866,867,869,870],{},"template 中的中文配置以 ",[24,864,865],{},"空格"," 分割，以 ",[24,868,382],{},"号拼接key=value, 如 ",[24,871,872],{},"addTitle=你好呀 a=不错",[224,874,875,876,879],{},"template 中支",[213,877,878],{},"持多个","注释信息",[224,881,882,883,886,887,890,891],{},"template 中的 ",[24,884,885],{},"key=value"," 的 ",[24,888,889],{},"key"," 对应 ",[213,892,893],{},"$t中最后一个key",[224,895,896,897],{},"js 中支持两种注释信息提取\n",[221,898,899,916],{},[224,900,901,904,905,908,909,911,912,915],{},[24,902,903],{},"$t()"," 后紧跟 ",[24,906,907],{},"//"," , ",[24,910,907],{},"后的",[213,913,914],{},"中文内容","都被视为默认值",[224,917,918,920,921,924,925,927,928,930,931,933],{},[24,919,903],{}," 后存在 ",[24,922,923],{},","," 、",[24,926,865],{}," 这两种符号，然后再跟 ",[24,929,907],{},", ",[24,932,907],{},"后的中文内容都被视为默认值",[20,935,936],{},[213,937,938],{},"解析完成后，自行把文件挪到到 zh-CN 文件夹下",[20,940,941],{},[213,942,943,944,946],{},"然后使用 ",[24,945,241],{}," 命令进行中译英",[11,948,949],{"id":949},"翻译功能配置说明",[15,951,953],{"id":952},"初始化翻译平台appid和key","初始化翻译平台appId和key",[50,955,957],{"className":52,"code":956,"language":54,"meta":55,"style":55},"zz set translate account.appId xxx\nzz set translate account.key xxx\n",[24,958,959,974],{"__ignoreMap":55},[59,960,961,963,965,968,971],{"class":61,"line":62},[59,962,139],{"class":65},[59,964,99],{"class":69},[59,966,967],{"class":69}," translate",[59,969,970],{"class":69}," account.appId",[59,972,973],{"class":69}," xxx\n",[59,975,976,978,980,982,985],{"class":61,"line":79},[59,977,139],{"class":65},[59,979,99],{"class":69},[59,981,967],{"class":69},[59,983,984],{"class":69}," account.key",[59,986,973],{"class":69},[15,988,990],{"id":989},"在哪里可以创建appid和key","在哪里可以创建appId和key",[992,993,994],"blockquote",{},[20,995,996],{},"请使用前仔细阅读百度翻译开发平台相关规则",[20,998,999],{},[1000,1001,1005],"a",{"href":1002,"rel":1003},"https://fanyi-api.baidu.com/api/trans/product/desktop",[1004],"nofollow","百度翻译开放平台",[1007,1008,1009,1012,1023,1026,1029,1032],"ol",{},[224,1010,1011],{},"注册",[224,1013,1014,1015],{},"实名认证\n",[1007,1016,1017,1020],{},[224,1018,1019],{},"标准版 qbs 1  每月5万字符",[224,1021,1022],{},"高级版 qbs 10 每月100万字符",[224,1024,1025],{},"开通通用文本翻译功能",[224,1027,1028],{},"生成appId和key",[224,1030,1031],{},"生成后的文件请仔细检查，有可能会有遗漏的翻译，如有，重新执行即可",[224,1033,1034],{},"注意: 百度翻译的api有一定的调用限制, 请自行评估是否需要使用高级版",[15,1036,1037],{"id":1037},"翻译单个文件",[50,1039,1041],{"className":52,"code":1040,"language":54,"meta":55,"style":55},"zz translate -f ./yourfile.js\n# 会在同级目录下生成 yourfile-en.js\n",[24,1042,1043,1055],{"__ignoreMap":55},[59,1044,1045,1047,1049,1052],{"class":61,"line":62},[59,1046,139],{"class":65},[59,1048,967],{"class":69},[59,1050,1051],{"class":120}," -f",[59,1053,1054],{"class":69}," ./yourfile.js\n",[59,1056,1057],{"class":61,"line":79},[59,1058,1059],{"class":82},"# 会在同级目录下生成 yourfile-en.js\n",[20,1061,1062,1063],{},"如",[24,1064,1065],{},"test.js",[50,1067,1069],{"className":293,"code":1068,"language":295,"meta":55,"style":55},"export default {\n    isok: '早早下班',\n    common: {\n        listTitle: '标题',\n        addTitle: '测试'\n    },\n    test: {\n        a: {\n            b: {\n                c: '哈哈哈'\n            }\n        },\n        aaa: {\n            value: '输入'\n        }\n    }\n}\n",[24,1070,1071,1079,1089,1094,1104,1112,1117,1122,1127,1132,1140,1145,1150,1155,1163,1168,1173],{"__ignoreMap":55},[59,1072,1073,1075,1077],{"class":61,"line":62},[59,1074,754],{"class":169},[59,1076,550],{"class":169},[59,1078,553],{"class":304},[59,1080,1081,1084,1087],{"class":61,"line":79},[59,1082,1083],{"class":304},"    isok: ",[59,1085,1086],{"class":69},"'早早下班'",[59,1088,565],{"class":304},[59,1090,1091],{"class":61,"line":86},[59,1092,1093],{"class":304},"    common: {\n",[59,1095,1096,1099,1102],{"class":61,"line":92},[59,1097,1098],{"class":304},"        listTitle: ",[59,1100,1101],{"class":69},"'标题'",[59,1103,565],{"class":304},[59,1105,1106,1109],{"class":61,"line":429},[59,1107,1108],{"class":304},"        addTitle: ",[59,1110,1111],{"class":69},"'测试'\n",[59,1113,1114],{"class":61,"line":443},[59,1115,1116],{"class":304},"    },\n",[59,1118,1119],{"class":61,"line":449},[59,1120,1121],{"class":304},"    test: {\n",[59,1123,1124],{"class":61,"line":463},[59,1125,1126],{"class":304},"        a: {\n",[59,1128,1129],{"class":61,"line":473},[59,1130,1131],{"class":304},"            b: {\n",[59,1133,1134,1137],{"class":61,"line":480},[59,1135,1136],{"class":304},"                c: ",[59,1138,1139],{"class":69},"'哈哈哈'\n",[59,1141,1142],{"class":61,"line":490},[59,1143,1144],{"class":304},"            }\n",[59,1146,1147],{"class":61,"line":495},[59,1148,1149],{"class":304},"        },\n",[59,1151,1152],{"class":61,"line":501},[59,1153,1154],{"class":304},"        aaa: {\n",[59,1156,1157,1160],{"class":61,"line":511},[59,1158,1159],{"class":304},"            value: ",[59,1161,1162],{"class":69},"'输入'\n",[59,1164,1165],{"class":61,"line":526},[59,1166,1167],{"class":304},"        }\n",[59,1169,1170],{"class":61,"line":539},[59,1171,1172],{"class":304},"    }\n",[59,1174,1175],{"class":61,"line":544},[59,1176,846],{"class":304},[20,1178,1179],{},"输出文件为test-en.js, 内容如下",[50,1181,1183],{"className":293,"code":1182,"language":295,"meta":55,"style":55},"export default {\n    isok: \"Leave work early\",\n    common: {\n        listTitle: \"title\",\n        addTitle: \"test\"\n    },\n    test: {\n        a: {\n            b: {\n                c: \"Hahaha\"\n            }\n        },\n        aaa: {\n            value: \"input\"\n        }\n    }\n}\n",[24,1184,1185,1193,1202,1206,1215,1222,1226,1230,1234,1238,1245,1249,1253,1257,1264,1268,1272],{"__ignoreMap":55},[59,1186,1187,1189,1191],{"class":61,"line":62},[59,1188,754],{"class":169},[59,1190,550],{"class":169},[59,1192,553],{"class":304},[59,1194,1195,1197,1200],{"class":61,"line":79},[59,1196,1083],{"class":304},[59,1198,1199],{"class":69},"\"Leave work early\"",[59,1201,565],{"class":304},[59,1203,1204],{"class":61,"line":86},[59,1205,1093],{"class":304},[59,1207,1208,1210,1213],{"class":61,"line":92},[59,1209,1098],{"class":304},[59,1211,1212],{"class":69},"\"title\"",[59,1214,565],{"class":304},[59,1216,1217,1219],{"class":61,"line":429},[59,1218,1108],{"class":304},[59,1220,1221],{"class":69},"\"test\"\n",[59,1223,1224],{"class":61,"line":443},[59,1225,1116],{"class":304},[59,1227,1228],{"class":61,"line":449},[59,1229,1121],{"class":304},[59,1231,1232],{"class":61,"line":463},[59,1233,1126],{"class":304},[59,1235,1236],{"class":61,"line":473},[59,1237,1131],{"class":304},[59,1239,1240,1242],{"class":61,"line":480},[59,1241,1136],{"class":304},[59,1243,1244],{"class":69},"\"Hahaha\"\n",[59,1246,1247],{"class":61,"line":490},[59,1248,1144],{"class":304},[59,1250,1251],{"class":61,"line":495},[59,1252,1149],{"class":304},[59,1254,1255],{"class":61,"line":501},[59,1256,1154],{"class":304},[59,1258,1259,1261],{"class":61,"line":511},[59,1260,1159],{"class":304},[59,1262,1263],{"class":69},"\"input\"\n",[59,1265,1266],{"class":61,"line":526},[59,1267,1167],{"class":304},[59,1269,1270],{"class":61,"line":539},[59,1271,1172],{"class":304},[59,1273,1274],{"class":61,"line":544},[59,1275,846],{"class":304},[15,1277,1278],{"id":1278},"批量翻译",[992,1280,1281],{},[20,1282,1283],{},"检索目标文件夹内所有langs文件夹下的zh-CN 文件夹下的所有文件, 输出至其同级的en-US下, 文件名同名",[50,1285,1287],{"className":52,"code":1286,"language":54,"meta":55,"style":55},"zz translate -d ./demo\n",[24,1288,1289],{"__ignoreMap":55},[59,1290,1291,1293,1295,1298],{"class":61,"line":62},[59,1292,139],{"class":65},[59,1294,967],{"class":69},[59,1296,1297],{"class":120}," -d",[59,1299,1300],{"class":69}," ./demo\n",[20,1302,1303],{},"如: demo文件夹是以下结构, zh-CN中所有JS会翻译后输出至en-US",[20,1305,1306],{},"每个文件输出内容同翻译单个文件",[50,1308,1310],{"className":52,"code":1309,"language":54,"meta":55,"style":55},".\n├── en-US\n│   ├── test.js\n│   ├── test2.js\n│   └── test3.js\n├── test-en.js\n├── test.js\n└── zh-CN\n    ├── test.js\n    ├── test2.js\n    └── test3.js\n\n",[24,1311,1312,1317,1325,1336,1345,1355,1362,1368,1376,1383,1389],{"__ignoreMap":55},[59,1313,1314],{"class":61,"line":62},[59,1315,1316],{"class":120},".\n",[59,1318,1319,1322],{"class":61,"line":79},[59,1320,1321],{"class":65},"├──",[59,1323,1324],{"class":69}," en-US\n",[59,1326,1327,1330,1333],{"class":61,"line":86},[59,1328,1329],{"class":65},"│  ",[59,1331,1332],{"class":69}," ├──",[59,1334,1335],{"class":69}," test.js\n",[59,1337,1338,1340,1342],{"class":61,"line":92},[59,1339,1329],{"class":65},[59,1341,1332],{"class":69},[59,1343,1344],{"class":69}," test2.js\n",[59,1346,1347,1349,1352],{"class":61,"line":429},[59,1348,1329],{"class":65},[59,1350,1351],{"class":69}," └──",[59,1353,1354],{"class":69}," test3.js\n",[59,1356,1357,1359],{"class":61,"line":443},[59,1358,1321],{"class":65},[59,1360,1361],{"class":69}," test-en.js\n",[59,1363,1364,1366],{"class":61,"line":449},[59,1365,1321],{"class":65},[59,1367,1335],{"class":69},[59,1369,1370,1373],{"class":61,"line":463},[59,1371,1372],{"class":65},"└──",[59,1374,1375],{"class":69}," zh-CN\n",[59,1377,1378,1381],{"class":61,"line":473},[59,1379,1380],{"class":65},"    ├──",[59,1382,1335],{"class":69},[59,1384,1385,1387],{"class":61,"line":480},[59,1386,1380],{"class":65},[59,1388,1344],{"class":69},[59,1390,1391,1394],{"class":61,"line":490},[59,1392,1393],{"class":65},"    └──",[59,1395,1354],{"class":69},[20,1397,1398],{},[213,1399,1400],{},"翻译时可能存在翻译失败的情况，重新运行  translate 命令即可",[11,1402,1403],{"id":1403},"压缩图片",[20,1405,1406],{},"使用help命令查看所有支持的功能",[50,1408,1413],{"className":1409,"code":1411,"language":1412},[1410],"language-text","zz tiny --help\n\n  -t, --type \u003CfileType>         转换后的图片类型 (default: null)\n  -f, --file \u003Cfile>             要压缩的图片文件 (default: null)\n  -d, --dir \u003Cdir>               压缩文件夹内所有文件 (default: null)\n  -co, --condition \u003Ccondition>  压缩文件夹内所有名称包含[--condition]的图片文件 (default: null)\n  -q, --quality \u003Cquality>       压缩质量(1-100) (default: 75)\n  -c, --colours \u003Ccolours>       GIF色彩保留(2-256) (default: 128)\n  -n, --name \u003Cname>             指定文件名输出 (default: \"\")\n  -m, --max \u003Cmax>               限制要上传的文件大小(kb)(仅当开启 --picgo 时会用到) (default: 60)\n  --picgo [type]                调用picgo (无参数) (default: null)\n  --no-picgo [type]             不调用picgo (无参数) (default: null)\n  -h, --help                    display help for command\n","text",[24,1414,1411],{"__ignoreMap":55},[11,1416,1417],{"id":1417},"操作流程演示",[20,1419,1420,1421],{},"按照规则写好 Vue 文件后，",[213,1422,1423,1426],{},[24,1424,1425],{},"cd"," 到对应的文件夹",[20,1428,22,1429,1431],{},[24,1430,228],{}," 命令，生成中文国际化文件",[50,1433,1435],{"className":52,"code":1434,"language":54,"meta":55,"style":55},"zz i18n -d ./demo\n\n✔ 开始检索/Users/xxxx/demo\n✔ 共找到1个要处理的文件\n✔ 从 demo 中提取了 6 个国际化键值\n✔ 生成文件: /Users/xxxx/demo/monthlyForecast.js\n✔ 国际化文件生成完成\n",[24,1436,1437,1448,1452,1460,1467,1486,1496],{"__ignoreMap":55},[59,1438,1439,1441,1444,1446],{"class":61,"line":62},[59,1440,139],{"class":65},[59,1442,1443],{"class":69}," i18n",[59,1445,1297],{"class":120},[59,1447,1300],{"class":69},[59,1449,1450],{"class":61,"line":79},[59,1451,477],{"emptyLinePlaceholder":476},[59,1453,1454,1457],{"class":61,"line":86},[59,1455,1456],{"class":65},"✔",[59,1458,1459],{"class":69}," 开始检索/Users/xxxx/demo\n",[59,1461,1462,1464],{"class":61,"line":92},[59,1463,1456],{"class":65},[59,1465,1466],{"class":69}," 共找到1个要处理的文件\n",[59,1468,1469,1471,1474,1477,1480,1483],{"class":61,"line":429},[59,1470,1456],{"class":65},[59,1472,1473],{"class":69}," 从",[59,1475,1476],{"class":69}," demo",[59,1478,1479],{"class":69}," 中提取了",[59,1481,1482],{"class":120}," 6",[59,1484,1485],{"class":69}," 个国际化键值\n",[59,1487,1488,1490,1493],{"class":61,"line":443},[59,1489,1456],{"class":65},[59,1491,1492],{"class":69}," 生成文件:",[59,1494,1495],{"class":69}," /Users/xxxx/demo/monthlyForecast.js\n",[59,1497,1498,1500],{"class":61,"line":449},[59,1499,1456],{"class":65},[59,1501,1502],{"class":69}," 国际化文件生成完成\n",[20,1504,1505],{},"生成后检查有没有问题，自行完善生成后的文件",[20,1507,1508],{},[213,1509,1510],{},"确认中文国际化文件完整后",[20,1512,1513],{},[213,1514,1515,1516,1519],{},"把文件放到 ",[24,1517,1518],{},"zh-CN"," 目录下",[20,1521,22,1522,1524],{},[24,1523,241],{},"  命令翻译",[50,1526,1528],{"className":52,"code":1527,"language":54,"meta":55,"style":55},"zz trans -d ./demo\n✔ 开始检索/Users/xxxx/demo\n✔ 共找到3个要翻译的文件\n✔ /Users/xxxx/demo/en-US/test.js已翻译\n✔ /Users/xxxx/demo/en-US/test2.js已翻译\n✔ /Users/xxxx/demo/en-US/test3.js已翻译\n✔ 翻译完毕\n",[24,1529,1530,1541,1547,1554,1561,1568,1575],{"__ignoreMap":55},[59,1531,1532,1534,1537,1539],{"class":61,"line":62},[59,1533,139],{"class":65},[59,1535,1536],{"class":69}," trans",[59,1538,1297],{"class":120},[59,1540,1300],{"class":69},[59,1542,1543,1545],{"class":61,"line":79},[59,1544,1456],{"class":65},[59,1546,1459],{"class":69},[59,1548,1549,1551],{"class":61,"line":86},[59,1550,1456],{"class":65},[59,1552,1553],{"class":69}," 共找到3个要翻译的文件\n",[59,1555,1556,1558],{"class":61,"line":92},[59,1557,1456],{"class":65},[59,1559,1560],{"class":69}," /Users/xxxx/demo/en-US/test.js已翻译\n",[59,1562,1563,1565],{"class":61,"line":429},[59,1564,1456],{"class":65},[59,1566,1567],{"class":69}," /Users/xxxx/demo/en-US/test2.js已翻译\n",[59,1569,1570,1572],{"class":61,"line":443},[59,1571,1456],{"class":65},[59,1573,1574],{"class":69}," /Users/xxxx/demo/en-US/test3.js已翻译\n",[59,1576,1577,1579],{"class":61,"line":449},[59,1578,1456],{"class":65},[59,1580,1581],{"class":69}," 翻译完毕\n",[20,1583,1584],{},[213,1585,1586,1587,1590],{},"到 ",[24,1588,1589],{},"en-US"," 目录下检查翻译情况",[1592,1593,1594],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":55,"searchDepth":79,"depth":79,"links":1596},[1597,1601,1602,1608,1614,1615],{"id":13,"depth":79,"text":13,"children":1598},[1599,1600],{"id":17,"depth":86,"text":18},{"id":146,"depth":86,"text":147},{"id":219,"depth":79,"text":219},{"id":263,"depth":79,"text":264,"children":1603},[1604,1605,1607],{"id":267,"depth":86,"text":267},{"id":277,"depth":86,"text":1606},"$t解析及生成规则",{"id":344,"depth":86,"text":344},{"id":949,"depth":79,"text":949,"children":1609},[1610,1611,1612,1613],{"id":952,"depth":86,"text":953},{"id":989,"depth":86,"text":990},{"id":1037,"depth":86,"text":1037},{"id":1278,"depth":86,"text":1278},{"id":1403,"depth":79,"text":1403},{"id":1417,"depth":79,"text":1417},"2025-03-21T00:00:00.000Z","md","2025-08-19T00:00:00.000Z",{},"/post/cli/cli-readme","---\ntitle: Z-CLI 使用说明\ndate: 2025-03-21\nlastmod: 2025-08-19\ntags: [\"Cli\"]\n\n---\n## 安装\n\n### Node\n\n使用 `nvm` 管理多个 `node` 版本\n\n `node >= 18.18.0` \n \n 推荐版本(我的)：`20.18.1` \n\n查看 `registry` （非必要步骤）\n\n```shell\nnpm config get registry\n# https://registry.npmjs.org\n# 如果不是，则需要先设置\nnpm config set registry=https://registry.npmjs.org\n```\n\n安装最新版\n\n```shell\nnpm i -g @zzclub/z-cli\n```\n\n安装后只能在当前 `node` 版本下使用，切换到其他低版本 `node` 则无效\n\n全局命令为：`zz`  或 `z`\n\n### Bun\n\nmacos\n```shell\ncurl -fsSL https://bun.sh/install | bash\n```\n\nwind\n```shell\npowershell -c \"irm bun.sh/install.ps1 | iex\"\n```\n\n安装最新版\n\n```shell\nbun i -g @zzclub/z-cli\n```\n\n**如果提示缺少某个包**，可以按提示再次运行相关命令\n\n## 命令\n\n- `i18n` 缩写 `i` 从Vue文件提取出**中文国际化文件**\n- `translate` 缩写：`trans`  批量翻译**中文国际化文件**\n- `set` 设置配置文件\n- `tiny` 任意图片压缩体积\n\n## i18n 规则说明\n\n### 文件\n\n只提取 `.vue` 文件\n\n### `$t`解析及生成规则\n\n提取正则： `/\\$t\\(['\"]i18n\\.([^'\"]+)['\"]\\)/g`\n\n举例：\n\n```js\n$t('i18n.module-name.placeholder.month')\n```\n\n- module-name 会被解析为文件名称 => `module-name.js`\n- 后面的内容会被解析为对象的属性 => `{ placeholder: { month: \"month\"}} `\n- 保存位置如果没传。就会保存在 `.vue` 同级目录下\n- 默认忽略 module-name 为 `common` => `$t('i18n.common.xxx')`\n\n### 中文注释规范及提取规则\n\n```vue\n\u003Ctemplate>\n  \u003C!--i18n addTitle=你好呀 a=不错   b=叭叭叭 c=哈哈哈  -->\n  \u003CCommonEditForm :page-type=\"pageType\" :title-config=\"titleConfig\" :custom-components-code=\"$t('i18n.monthlyForecast.pageTitle.addTitle')\" :is-out=\"2\">\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.form.a') }}\u003C/div>\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.form.b') }}\u003C/div>\n    \u003C!--i18n select=真棒 -->\n    \u003Cdiv>{{ $t('i18n.monthlyForecast.placeholder.select') }}\u003C/div>\n  \u003C/CommonEditForm>\n\n\u003C/template>\n\n\u003C!-- js 区域 -->\n\u003Cscript>\n   import {formatDate} from \"@/common/utils\"\n   import CommonEditForm from \"@/pages/ifpf/costForecast/monthlyForecast/views/common-edit-form.vue\"\n\n   export default {\n       name: 'ifpfExchangeRateMaintainAdd',\n       components:{\n           CommonEditForm,\n       },\n       data() {\n           return {\n               pageType: 'edit',\n               titleConfig: {\n                   title: this.$t('i18n.monthlyForecast.pageTitle.addTitle'),//测试\n                   icon: this.$t('i18n.monthlyForecast.pageTitle.icon'), // 图标\n                   date: formatDate.formatDateOnly(new Date()),\n                   info: this.$t('i18n.monthlyForecast.pageTitle.addInfo')//你好\n               },\n           };\n       }\n   };\n\u003C/script>\n\n```\n\n解析后：\n\n```js\nexport default {\n  pageTitle: {\n    addTitle: \"测试\",\n    icon: \"图标\",\n    addInfo: \"你好\"\n  },\n  form: {\n    a: \"不错\",\n    b: \"叭叭叭\"\n  },\n  placeholder: {\n    select: \"真棒\"\n  }\n}\n```\n- template 中的注释，**必须**以 `\u003C!--i18n` 开头\n- template 中的中文配置以 `空格` 分割，以 `=`号拼接key=value, 如 `addTitle=你好呀 a=不错`\n- template 中支**持多个**注释信息\n- template 中的 `key=value` 的 `key` 对应 **$t中最后一个key**\n- js 中支持两种注释信息提取\n  - `$t()` 后紧跟 `//` , `//`后的**中文内容**都被视为默认值\n  - `$t()` 后存在 `,` 、`空格` 这两种符号，然后再跟 `//`, `//`后的中文内容都被视为默认值\n\n**解析完成后，自行把文件挪到到 zh-CN 文件夹下**\n\n**然后使用 `translate` 命令进行中译英**\n\n\n## 翻译功能配置说明\n### 初始化翻译平台appId和key\n\n```shell\nzz set translate account.appId xxx\nzz set translate account.key xxx\n```\n\n### 在哪里可以创建appId和key\n\n> 请使用前仔细阅读百度翻译开发平台相关规则\n\n[百度翻译开放平台](https://fanyi-api.baidu.com/api/trans/product/desktop)\n\n1. 注册\n2. 实名认证\n   1. 标准版 qbs 1  每月5万字符\n   2. 高级版 qbs 10 每月100万字符\n3. 开通通用文本翻译功能\n4. 生成appId和key\n5. 生成后的文件请仔细检查，有可能会有遗漏的翻译，如有，重新执行即可\n6. 注意: 百度翻译的api有一定的调用限制, 请自行评估是否需要使用高级版\n\n### 翻译单个文件\n\n```shell\nzz translate -f ./yourfile.js\n# 会在同级目录下生成 yourfile-en.js\n```\n\n如`test.js`\n\n```js\nexport default {\n    isok: '早早下班',\n    common: {\n        listTitle: '标题',\n        addTitle: '测试'\n    },\n    test: {\n        a: {\n            b: {\n                c: '哈哈哈'\n            }\n        },\n        aaa: {\n            value: '输入'\n        }\n    }\n}\n```\n\n输出文件为test-en.js, 内容如下\n\n```js\nexport default {\n    isok: \"Leave work early\",\n    common: {\n        listTitle: \"title\",\n        addTitle: \"test\"\n    },\n    test: {\n        a: {\n            b: {\n                c: \"Hahaha\"\n            }\n        },\n        aaa: {\n            value: \"input\"\n        }\n    }\n}\n```\n\n### 批量翻译\n\n> 检索目标文件夹内所有langs文件夹下的zh-CN 文件夹下的所有文件, 输出至其同级的en-US下, 文件名同名\n\n```shell\nzz translate -d ./demo\n```\n\n如: demo文件夹是以下结构, zh-CN中所有JS会翻译后输出至en-US\n\n每个文件输出内容同翻译单个文件\n\n```shell\n.\n├── en-US\n│   ├── test.js\n│   ├── test2.js\n│   └── test3.js\n├── test-en.js\n├── test.js\n└── zh-CN\n    ├── test.js\n    ├── test2.js\n    └── test3.js\n\n```\n\n**翻译时可能存在翻译失败的情况，重新运行  translate 命令即可**\n\n## 压缩图片\n\n使用help命令查看所有支持的功能\n```\nzz tiny --help\n\n  -t, --type \u003CfileType>         转换后的图片类型 (default: null)\n  -f, --file \u003Cfile>             要压缩的图片文件 (default: null)\n  -d, --dir \u003Cdir>               压缩文件夹内所有文件 (default: null)\n  -co, --condition \u003Ccondition>  压缩文件夹内所有名称包含[--condition]的图片文件 (default: null)\n  -q, --quality \u003Cquality>       压缩质量(1-100) (default: 75)\n  -c, --colours \u003Ccolours>       GIF色彩保留(2-256) (default: 128)\n  -n, --name \u003Cname>             指定文件名输出 (default: \"\")\n  -m, --max \u003Cmax>               限制要上传的文件大小(kb)(仅当开启 --picgo 时会用到) (default: 60)\n  --picgo [type]                调用picgo (无参数) (default: null)\n  --no-picgo [type]             不调用picgo (无参数) (default: null)\n  -h, --help                    display help for command\n```\n\n\n## 操作流程演示\n\n按照规则写好 Vue 文件后，**`cd` 到对应的文件夹**\n\n使用 `i18n` 命令，生成中文国际化文件\n\n```shell\nzz i18n -d ./demo\n\n✔ 开始检索/Users/xxxx/demo\n✔ 共找到1个要处理的文件\n✔ 从 demo 中提取了 6 个国际化键值\n✔ 生成文件: /Users/xxxx/demo/monthlyForecast.js\n✔ 国际化文件生成完成\n```\n\n生成后检查有没有问题，自行完善生成后的文件\n\n**确认中文国际化文件完整后**\n\n**把文件放到 `zh-CN` 目录下**\n\n使用 `translate`  命令翻译\n\n```shell\nzz trans -d ./demo\n✔ 开始检索/Users/xxxx/demo\n✔ 共找到3个要翻译的文件\n✔ /Users/xxxx/demo/en-US/test.js已翻译\n✔ /Users/xxxx/demo/en-US/test2.js已翻译\n✔ /Users/xxxx/demo/en-US/test3.js已翻译\n✔ 翻译完毕\n```\n\n**到 `en-US` 目录下检查翻译情况**",{"title":5,"description":55},"post/CLI/cli-readme",[1625],"Cli","ci_Y5d_aTP4ScsaYG9xrnCZbWPfj8colE7G1OlIP5cw",[1628,1632],{"title":1629,"path":1630,"stem":1631},"OpenClaw 安装入门（Windows）","/post/zzao/openclaw/openclaw-install-windows","post/zzao/openclaw/openclaw-install-windows",{"title":1633,"path":1634,"stem":1635},"假设你是AI，你的Skill应该是什么样的","/post/zzao/ai-skill-structure","post/zzao/ai-skill-structure",1779005085891]