windows: 优化 iso 语言查找

This commit is contained in:
bin456789
2026-08-06 22:13:07 +08:00
parent 27dd00c078
commit 73fa468c42
3 changed files with 218 additions and 174 deletions
+44 -42
View File
@@ -366,49 +366,51 @@ bash reinstall.sh windows \
``` ```
<details> <details>
<summary>Supported languages</summary> <summary> --lang list </summary>
```text Supports these three language format codes. Case insensitive.
ar-sa
bg-bg | CC Format | CC-CC Format | Language |
cs-cz | - | - | - |
da-dk | ar | ar-sa | Arabic |
de-de | bg | bg-bg | Bulgarian |
el-gr | cs | cs-cz | Czech |
en-gb | da | da-dk | Danish |
en-us | de | de-de | German |
es-es | el | el-gr | Greek |
es-mx | gb | en-gb | Eng_Intl |
et-ee | en | en-us | English |
fi-fi | es | es-es | Spanish |
fr-ca | mx | es-mx | Spanish_Latam |
fr-fr | et | et-ee | Estonian |
he-il | fi | fi-fi | Finnish |
hr-hr | | fr-ca | FrenchCanadian |
hu-hu | fr | fr-fr | French |
it-it | he | he-il | Hebrew |
ja-jp | hr | hr-hr | Croatian |
ko-kr | hu | hu-hu | Hungarian |
lt-lt | it | it-it | Italian |
lv-lv | ja | ja-jp | Japanese |
nb-no | ko | ko-kr | Korean |
nl-nl | lt | lt-lt | Lithuanian |
pl-pl | lv | lv-lv | Latvian |
pt-pt | no | nb-no | Norwegian |
pt-br | nl | nl-nl | Dutch |
ro-ro | pl | pl-pl | Polish |
ru-ru | pp | pt-pt | Portuguese |
sk-sk | pt | pt-br | Brazilian |
sl-si | ro | ro-ro | Romanian |
sr-latn-rs | ru | ru-ru | Russian |
sv-se | sk | sk-sk | Slovak |
th-th | sl | sl-si | Slovenian |
tr-tr | sr | sr-latn / sr-latn-rs | Serbian_Latin |
uk-ua | sv | sv-se | Swedish |
zh-cn | th | th-th | Thai |
zh-hk | tr | tr-tr | Turkish |
zh-tw | uk | uk-ua | Ukrainian |
``` | cn | zh-cn | ChnSimp |
| tw | zh-tw | ChnTrad |
| hk | zh-hk | ChnTrad_Hong_Kong |
</details> </details>
+44 -42
View File
@@ -366,49 +366,51 @@ bash reinstall.sh windows \
``` ```
<details> <details>
<summary>支持的语言</summary> <summary> --lang 列表</summary>
```text 支持这三种语言代码格式,不区分大小写
ar-sa
bg-bg | CC 格式 | CC-CC 格式 | 语言 |
cs-cz | - | - | - |
da-dk | ar | ar-sa | Arabic |
de-de | bg | bg-bg | Bulgarian |
el-gr | cs | cs-cz | Czech |
en-gb | da | da-dk | Danish |
en-us | de | de-de | German |
es-es | el | el-gr | Greek |
es-mx | gb | en-gb | Eng_Intl |
et-ee | en | en-us | English |
fi-fi | es | es-es | Spanish |
fr-ca | mx | es-mx | Spanish_Latam |
fr-fr | et | et-ee | Estonian |
he-il | fi | fi-fi | Finnish |
hr-hr | | fr-ca | FrenchCanadian |
hu-hu | fr | fr-fr | French |
it-it | he | he-il | Hebrew |
ja-jp | hr | hr-hr | Croatian |
ko-kr | hu | hu-hu | Hungarian |
lt-lt | it | it-it | Italian |
lv-lv | ja | ja-jp | Japanese |
nb-no | ko | ko-kr | Korean |
nl-nl | lt | lt-lt | Lithuanian |
pl-pl | lv | lv-lv | Latvian |
pt-pt | no | nb-no | Norwegian |
pt-br | nl | nl-nl | Dutch |
ro-ro | pl | pl-pl | Polish |
ru-ru | pp | pt-pt | Portuguese |
sk-sk | pt | pt-br | Brazilian |
sl-si | ro | ro-ro | Romanian |
sr-latn-rs | ru | ru-ru | Russian |
sv-se | sk | sk-sk | Slovak |
th-th | sl | sl-si | Slovenian |
tr-tr | sr | sr-latn / sr-latn-rs | Serbian_Latin |
uk-ua | sv | sv-se | Swedish |
zh-cn | th | th-th | Thai |
zh-hk | tr | tr-tr | Turkish |
zh-tw | uk | uk-ua | Ukrainian |
``` | cn | zh-cn | ChnSimp |
| tw | zh-tw | ChnTrad |
| hk | zh-hk | ChnTrad_Hong_Kong |
</details> </details>
+130 -90
View File
@@ -732,99 +732,127 @@ assert_cpu_supports_x86_64_v3() {
fi fi
} }
# sr-latn-rs 到 sr-latn # 判断语言字符是否合法,允许全名和缩写
en_us() { is_valid_lang_chars() {
echo "$lang" | awk -F- '{print $1"-"$2}' [[ "$1" =~ ^[A-Za-z_-]+$ ]]
# zh-hk 可回落到 zh-tw
if [ "$lang" = zh-hk ]; then
echo zh-tw
fi
} }
# fr-ca 到 ca lang_convert() {
us() { local out_format=$1
# 葡萄牙准确对应 pp local in=$lang
if [ "$lang" = pt-pt ]; then
echo pp if ! is_valid_lang_chars "$in"; then
return
fi
# 巴西准确对应 pt
if [ "$lang" = pt-br ]; then
echo pt
return return
fi fi
echo "$lang" | awk -F- '{print $2}' # 如果是 fallback_ 开头的,先得到 fallback 后的 cc-cc
if [[ "$out_format" = fallback_* ]]; then
in=$(lang_convert_inner "$in" fallback_cc-cc)
# 如果要输出 fallback_cc-cc ,直接输出
if [ "$out_format" = fallback_cc-cc ]; then
printf '%s' "$in"
return
fi
# 去除 fallback_ 前缀
out_format=${out_format#fallback_}
fi
# hk 额外回落到 tw # 尝试转换成目标格式
if [ "$lang" = zh-hk ]; then local out
echo tw out=$(lang_convert_inner "$in" "$out_format")
# 如果转换成功,则表示输入的语言在列表里面
if [ -n "$out" ]; then
printf '%s' "$out"
else
# 如果没有,则手动截取
case "$out_format" in
cc) cut -d- -f1 <<<"$in" ;;
cc-cc) cut -d- -f1-2 <<<"$in" ;;
cc-cc-cc) cut -d- -f1-3 <<<"$in" ;;
esac
fi fi
} }
# fr-ca 到 fr-fr lang_convert_inner() {
en_en() { local in=$1
echo "$lang" | awk -F- '{print $1"-"$1}' local out_format=$2
# en-gb 额外回落到 en-us if ! is_valid_lang_chars "$in"; then
if [ "$lang" = en-gb ]; then
echo en-us
fi
}
# fr-ca 到 fr
en() {
# 巴西/葡萄牙回落到葡萄牙语
if [ "$lang" = pt-br ] || [ "$lang" = pt-pt ]; then
echo "pp"
return return
fi fi
echo "$lang" | awk -F- '{print $1}' # 可能得到 / ,用 is_valid_lang_chars 过滤掉
local out
if out=$(
lang_map_with_head | sed 1d | to_lower | awk \
-v val="$in" \
-v c1="$(get_col_number cc)" \
-v c2="$(get_col_number cc-cc)" \
-v c3="$(get_col_number cc-cc-cc)" \
-v c4="$(get_col_number full_language)" \
-v cout="$(get_col_number "$out_format")" \
'$c1 == val || $c2 == val || $c3 == val || $c4 == val { print $cout }'
) && is_valid_lang_chars "$out"; then
printf '%s' "$out"
fi
} }
english() { get_col_number() {
case "$lang" in local col_name=$1
ar-sa) echo Arabic ;;
bg-bg) echo Bulgarian ;; # 找出第一行,用 xargs -n 1 转成列,然后用 grep 找到行号,再用 cut 取出行号
cs-cz) echo Czech ;; lang_map_with_head | head -1 | xargs -n 1 | grep -Fxn "$col_name" | cut -d: -f1
da-dk) echo Danish ;; }
de-de) echo German ;;
el-gr) echo Greek ;; lang_map_with_head() {
en-gb) echo Eng_Intl ;; # 没有 gb mx 开头的镜像,列出它们作用是,用户输入时识别成 en-gb es-mx
en-us) echo English ;; # ca 并非对应 fr-ca
es-es) echo Spanish ;; # pt 对应 pt-br,而不是 pt-pt
es-mx) echo Spanish_Latam ;; # uk 对应乌克兰语而不是英国,如果用户输入 uk ,要识别成乌克兰
et-ee) echo Estonian ;; # 第 5 列是可回落的语言
fi-fi) echo Finnish ;; cat <<EOF
fr-ca) echo FrenchCanadian ;; cc cc-cc cc-cc-cc full_language fallback_cc-cc
fr-fr) echo French ;; ar ar-sa / Arabic
he-il) echo Hebrew ;; bg bg-bg / Bulgarian
hr-hr) echo Croatian ;; cs cs-cz / Czech
hu-hu) echo Hungarian ;; da da-dk / Danish
it-it) echo Italian ;; de de-de / German
ja-jp) echo Japanese ;; el el-gr / Greek
ko-kr) echo Korean ;; gb en-gb / Eng_Intl en-us
lt-lt) echo Lithuanian ;; en en-us / English
lv-lv) echo Latvian ;; es es-es / Spanish
nb-no) echo Norwegian ;; mx es-mx / Spanish_Latam
nl-nl) echo Dutch ;; et et-ee / Estonian
pl-pl) echo Polish ;; fi fi-fi / Finnish
pt-pt) echo Portuguese ;; / fr-ca / FrenchCanadian fr-fr
pt-br) echo Brazilian ;; fr fr-fr / French
ro-ro) echo Romanian ;; he he-il / Hebrew
ru-ru) echo Russian ;; hr hr-hr / Croatian
sk-sk) echo Slovak ;; hu hu-hu / Hungarian
sl-si) echo Slovenian ;; it it-it / Italian
sr-latn | sr-latn-rs) echo Serbian_Latin ;; ja ja-jp / Japanese
sv-se) echo Swedish ;; ko ko-kr / Korean
th-th) echo Thai ;; lt lt-lt / Lithuanian
tr-tr) echo Turkish ;; lv lv-lv / Latvian
uk-ua) echo Ukrainian ;; no nb-no / Norwegian
zh-cn) echo ChnSimp ;; nl nl-nl / Dutch
zh-hk | zh-tw) echo ChnTrad ;; pl pl-pl / Polish
esac pp pt-pt / Portuguese
pt pt-br / Brazilian pt-pt
ro ro-ro / Romanian
ru ru-ru / Russian
sk sk-sk / Slovak
sl sl-si / Slovenian
sr sr-latn sr-latn-rs Serbian_Latin
sv sv-se / Swedish
th th-th / Thai
tr tr-tr / Turkish
uk uk-ua / Ukrainian
cn zh-cn / ChnSimp
tw zh-tw / ChnTrad
hk zh-hk / ChnTrad_Hong_Kong zh-tw
EOF
} }
parse_windows_image_name() { parse_windows_image_name() {
@@ -890,9 +918,15 @@ find_windows_iso() {
if [ -z "$lang" ]; then if [ -z "$lang" ]; then
lang=en-us lang=en-us
fi fi
langs="$lang $(en_us) $(us) $(en_en) $(en)"
langs=$(echo "$langs" | xargs -n 1 | awk '!seen[$0]++') # 用户输入的语言最优先
full_lang=$(english) langs=$lang
langs+=" $(lang_convert cc-cc-cc) $(lang_convert cc-cc) $(lang_convert cc)"
langs+=" $(lang_convert fallback_cc-cc-cc) $(lang_convert fallback_cc-cc) $(lang_convert fallback_cc)"
langs=$(xargs -n 1 <<<"$langs" | awk '!seen[$0]++' | xargs)
full_langs="$(lang_convert full_language) $(lang_convert fallback_full_language)"
full_langs=$(xargs -n 1 <<<"$full_langs" | awk '!seen[$0]++' | xargs)
case "$basearch" in case "$basearch" in
x86) # 备用,查找功能目前不支持 32 位 x86) # 备用,查找功能目前不支持 32 位
@@ -1085,6 +1119,7 @@ get_windows_iso_link() {
echo "Label msdl: $label_msdl" echo "Label msdl: $label_msdl"
echo "Label vlsc: $label_vlsc" echo "Label vlsc: $label_vlsc"
echo "Page: $page_url" echo "Page: $page_url"
echo "Languages: $langs $full_langs"
echo echo
# 先判断是否能自动查找该版本 # 先判断是否能自动查找该版本
@@ -1210,16 +1245,18 @@ get_windows_iso_link_inner() {
# 先判断 full_lang 是否为空 # 先判断 full_lang 是否为空
# 因为假如用户输入的 lang 不正确,full_lang 就为空,正则表达式就无法只匹配当前语言 # 因为假如用户输入的 lang 不正确,full_lang 就为空,正则表达式就无法只匹配当前语言
if [ -n "$label_vlsc" ] && [ -n "$full_lang" ]; then for full_lang in $full_langs; do
regexs+=("sw_?dvd[59]_win_?${label_vlsc}_?${version}_.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)") if [ -n "$label_vlsc" ] && [ -n "$full_lang" ]; then
regexs+=("sw_?dvd[59]_win_?${version}_${label_vlsc}_?.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)") regexs+=("sw_?dvd[59]_win_?${label_vlsc}_?${version}_.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)")
# LTSC 没有 windows 主版本号 regexs+=("sw_?dvd[59]_win_?${version}_${label_vlsc}_?.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)")
# SW_DVD5_WIN_ENT_LTSB_10_2015_64BIT_Arabic_MLF_X20-26578.ISO # 将 ENT_LTSB_10_2015 视为 label # LTSC 没有 windows 主版本号
# SW_DVD5_WIN_ENT_LTSB_2016_64BIT_Arabic_MLF_X21-07425.ISO # 将 ENT_LTSB_2016 视为 label # SW_DVD5_WIN_ENT_LTSB_10_2015_64BIT_Arabic_MLF_X20-26578.ISO # 将 ENT_LTSB_10_2015 视为 label
if is_ltsc; then # SW_DVD5_WIN_ENT_LTSB_2016_64BIT_Arabic_MLF_X21-07425.ISO # 将 ENT_LTSB_2016 视为 label
regexs+=("sw_?dvd[59]_win_?${label_vlsc}_?.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)") if is_ltsc; then
regexs+=("sw_?dvd[59]_win_?${label_vlsc}_?.*${arch_win_vlsc}.*_${full_lang}.*.(iso|img)")
fi
fi fi
fi done
# 查找 # 查找
for regex in "${regexs[@]}"; do for regex in "${regexs[@]}"; do
@@ -4897,6 +4934,9 @@ EOF
shift 2 shift 2
;; ;;
--lang) --lang)
if ! is_valid_lang_chars "$2"; then
error_and_exit "Invalid $1 value: $2"
fi
lang=$(echo "$2" | to_lower) lang=$(echo "$2" | to_lower)
shift 2 shift 2
;; ;;