diff --git a/copyparty/__main__.py b/copyparty/__main__.py index c1533a30..cc2f02dc 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1412,7 +1412,7 @@ def add_ui(ap, retry): ap2 = ap.add_argument_group('ui options') ap2.add_argument("--grid", action="store_true", help="show grid/thumbnails by default (volflag=grid)") ap2.add_argument("--gsel", action="store_true", help="select files in grid by ctrl-click (volflag=gsel)") - ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor\033[0m") + ap2.add_argument("--lang", metavar="LANG", type=u, default="eng", help="language; one of the following: \033[32meng nor chi\033[0m") ap2.add_argument("--theme", metavar="NUM", type=int, default=0, help="default theme to use (0..7)") ap2.add_argument("--themes", metavar="NUM", type=int, default=8, help="number of themes installed") ap2.add_argument("--au-vol", metavar="0-100", type=int, default=50, choices=range(0, 101), help="default audio/video volume percent") diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index da66afa5..ff4bc894 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -312,6 +312,20 @@ var Ls = { "fs_sc": "share the folder you're in", "fs_ss": "share the selected file/folder", "fs_just1": "select one or zero things to share", + "fs_abrt": "❌ abort", + "fs_rand": "🎲 rand.name", + "fs_go": "✅ create share", + "fs_name": "name", + "fs_src": "source", + "fs_pwd": "passwd", + "fs_exp": "expiry", + "fs_tmin": "min", + "fs_thrs": "hours", + "fs_tdays": "days", + "fs_never": "eternal", + "fs_pname": "optional link name; will be random if blank", + "fs_tsrc": "the file or folder to share", + "fs_ppwd": "optional password", "fs_ok": "
share-URL created
\npress Enter/OK to Clipboard\npress ESC/Cancel to Close\n\n", "frt_dec": "may fix some cases of broken filenames\">url-decode", @@ -826,7 +840,7 @@ var Ls = { "fr_eperm": 'kan ikke endre navn:\ndu har ikke “move”-rettigheten i denne mappen', "fd_eperm": 'kan ikke slette:\ndu har ikke “delete”-rettigheten i denne mappen', "fc_eperm": 'kan ikke klippe ut:\ndu har ikke “move”-rettigheten i denne mappen', - "fp_eperm": 'kan ikke lime inn:\ndu har ikke "write"-rettigheten i denne mappen', + "fp_eperm": 'kan ikke lime inn:\ndu har ikke “write”-rettigheten i denne mappen', "fr_emore": "velg minst én fil som skal få nytt navn", "fd_emore": "velg minst én fil som skal slettes", "fc_emore": "velg minst én fil som skal klippes ut", @@ -834,6 +848,20 @@ var Ls = { "fs_sc": "del mappen du er i nå", "fs_ss": "del den valgte filen/mappen", "fs_just1": "velg 1 eller 0 ting å dele", + "fs_abrt": "❌ avbryt", + "fs_rand": "🎲 tilfeldig navn", + "fs_go": "✅ opprett deling", + "fs_name": "navn", + "fs_src": "kilde", + "fs_pwd": "passord", + "fs_exp": "varighet", + "fs_tmin": "min", + "fs_thrs": "timer", + "fs_tdays": "dager", + "fs_never": "for evig", + "fs_pname": "frivillig navn (blir noe tilfeldig ellers)", + "fs_tsrc": "fil/mappe som skal deles", + "fs_ppwd": "frivillig passord", "fs_ok": "
URL opprettet
\ntrykk Enter/OK for å kopiere linken (for CTRL-V)\ntrykk ESC/Avbryt for å bare bekrefte\n\n", "frt_dec": "kan korrigere visse ødelagte filnavn\">url-decode", @@ -1049,6 +1077,7 @@ var Ls = { }, "chi": { + // 以 //m 结尾的行是未经验证的机器翻译 "tt": "中文", "cols": { "c": "操作按钮", @@ -1133,10 +1162,10 @@ var Ls = { "m_ok": "确定", "m_ng": "取消", - "ht_s": "秒!s", - "ht_m": "分!s", - "ht_h": "时!s", - "ht_d": "天!s", + "ht_s": "秒", + "ht_m": "分", + "ht_h": "时", + "ht_d": "天", "ht_and": " 和 ", "goh": "控制面板", @@ -1239,19 +1268,19 @@ var Ls = { "ct_grid": '网格视图', "ct_thumb": '在网格视图中,切换图标或缩略图$N快捷键: T">🖼️ 缩略图', - "ct_csel": '在网格视图中使用 CTRL 和 SHIFT 进行文件选择">CTRL SHIFT', + "ct_csel": '在网格视图中使用 CTRL 和 SHIFT 进行文件选择">CTRL', "ct_ihop": '当图像查看器关闭时,滚动到最后查看的文件">滚动', "ct_dots": '显示隐藏文件(如果服务器允许)">隐藏文件', "ct_dir1st": '在文件之前排序文件夹">📁 排序', - "ct_readme": '在文件夹列表中显示 README.md">📜 显示readme', + "ct_readme": '在文件夹列表中显示 README.md">📜 readme', "ct_idxh": '显示 index.html 代替文件夹列表">htm', "ct_sbars": '显示滚动条">⟊', "cut_umod": "如果文件已存在于服务器上,将服务器的最后修改时间戳更新为与你的本地文件匹配(需要写入和删除权限)\">re📅", - "cut_turbo": "YOLO 按钮,你可能不想启用这个:$N$N如果你上传了大量文件并且由于某些原因需要重新启动,并且想要尽快继续上传,使用此选项$N$N这会用简单的 "服务器上的文件大小是否相同?" 替代哈希检查,因此如果文件内容不同,它将不会被上传$N$N上传完成后,你应该关闭此选项,然后重新"上传"相同的文件以让客户端验证它们\">加速", + "cut_turbo": "YOLO 按钮,你可能不想启用这个:$N$N如果你上传了大量文件并且由于某些原因需要重新启动,$N并且想要尽快继续上传,使用此选项$N$N这会用简单的 "服务器上的文件大小是否相同?" 替代哈希检查,$N因此如果文件内容不同,它将不会被上传$N$N上传完成后,你应该关闭此选项,$N然后重新"上传"相同的文件以让客户端验证它们\">加速", - "cut_datechk": "除非启用 turbo 按钮,否则没有效果$N$N略微减少 YOLO 因素;检查服务器上的文件时间戳是否与你的一致$N$N理论上 应该能捕捉到大多数未完成/损坏的上传,但不能替代之后禁用 turbo 进行的验证\">日期检查", + "cut_datechk": "除非启用「加速」按钮,否则没有效果$N$N略微减少 YOLO 因素;检查服务器上的文件时间戳是否与你的一致$N$N理论上 应该能捕捉到大多数未完成/损坏的上传,$N但不能替代之后禁用「加速」进行的验证\">日期检查", "cut_u2sz": "每个上传块的大小(以 MiB 为单位);较大的值跨大西洋传输效果更好。在非常不可靠的连接上尝试较小的值", @@ -1294,7 +1323,7 @@ var Ls = { "mt_fullpre": "尝试预加载整首歌;$N✅ 在 不可靠 连接上启用,$N❌ 可能在慢速连接上禁用\">加载整首歌", "mt_fau": "在手机上,如果下一首歌未能快速预加载,防止音乐停止(可能导致标签显示异常)\">☕️", "mt_waves": "波形进度条:$N显示音频幅度\">进度条", - "mt_npclip": "显示当前播放歌曲的剪贴板按钮\">/剪切板", + "mt_npclip": "显示当前播放歌曲的剪贴板按钮\">♪剪切板", "mt_octl": "操作系统集成(媒体快捷键 / OSD)\">OSD", "mt_oseek": "允许通过操作系统集成进行跳转$N$N注意:在某些设备(如 iPhone)上,$N这将替代下一首歌按钮\">seek", "mt_oscv": "在 OSD 中显示专辑封面\">封面", @@ -1315,7 +1344,7 @@ var Ls = { "mp_breq": "需要 Firefox 82+ 或 Chrome 73+ 或 iOS 15+", "mm_bload": "正在加载...", "mm_bconv": "正在转换为 {0},请稍等...", - "mm_opusen": "你的浏览器无法播放 aac / m4a 文件;$N现在启用转码为 opus", + "mm_opusen": "你的浏览器无法播放 aac / m4a 文件;\n现在启用转码为 opus", "mm_playerr": "播放失败:", "mm_eabrt": "播放尝试已取消", "mm_enet": "你的互联网连接有问题", @@ -1323,7 +1352,7 @@ var Ls = { "mm_esupp": "你的浏览器不支持这个音频格式", "mm_eunk": "未知错误", "mm_e404": "无法播放音频;错误 404:文件未找到。", - "mm_e403": "无法播放音频;错误 403:访问被拒绝。$N$N尝试按 F5 重新加载,也许你已被注销", + "mm_e403": "无法播放音频;错误 403:访问被拒绝。\n\n尝试按 F5 重新加载,也许你已被注销", "mm_e5xx": "无法播放音频;服务器错误", "mm_nof": "附近找不到更多音频文件", "mm_prescan": "正在寻找下一首音乐...", @@ -1334,14 +1363,14 @@ var Ls = { "im_hnf": "那张图片不再存在", "f_empty": "该文件夹为空", - "f_chide": "这将隐藏列 «{0}»$N$N你可以在设置选项卡中重新显示列", + "f_chide": "这将隐藏列 «{0}»\n\n你可以在设置选项卡中重新显示列", "f_bigtxt": "这个文件大小为 {0} MiB -- 真的以文本形式查看?", "fbd_more": '
显示 {0} 个文件中的 {1} 个;显示 {2}显示全部
', "fbd_all": '
显示 {0} 个文件中的 {1} 个;显示全部
', - "f_dls": "当前文件夹中的文件链接已$N更改为下载链接", + "f_dls": "当前文件夹中的文件链接已\n更改为下载链接", - "f_partial": "要安全下载正在上传的文件,请点击没有 .PARTIAL 文件扩展名的同名文件。请按取消或 Escape 执行此操作。$N$N按 OK / Enter 将忽略此警告并继续下载 .PARTIAL 临时文件,这几乎肯定会导致数据损坏。", + "f_partial": "要安全下载正在上传的文件,请点击没有 .PARTIAL 文件扩展名的同名文件。请按取消或 Escape 执行此操作。\n\n按 OK / Enter 将忽略此警告并继续下载 .PARTIAL 临时文件,这几乎肯定会导致数据损坏。", "ft_paste": "粘贴 {0} 项$N快捷键: ctrl-V", "fr_eperm": '无法重命名:\n你在此文件夹中没有 “移动” 权限', @@ -1355,13 +1384,27 @@ var Ls = { "fs_sc": "分享你所在的文件夹", "fs_ss": "分享选定的文件/文件夹", "fs_just1": "选择一个或零个项目进行分享", + "fs_abrt": "❌ 取消", + "fs_rand": "🎲 随机名称", //m + "fs_go": "✅ 创建共享", //m + "fs_name": "名称", //m + "fs_src": "源", //m + "fs_pwd": "密码", //m + "fs_exp": "过期 时间", //m + "fs_tmin": "分", + "fs_thrs": "时", + "fs_tdays": "天", + "fs_never": "永存", //m + "fs_pname": "可选链接名称;如果为空则随机", //m + "fs_tsrc": "要共享的文件或文件夹", //m + "fs_ppwd": "可选密码", //m "fs_ok": "
分享链接已创建
\n按 Enter/OK 复制到剪贴板\n按 ESC/Cancel 关闭\n\n", "frt_dec": "可能修复一些损坏的文件名\">url-decode", "frt_rst": "将修改后的文件名重置为原始文件名\">↺ 重置", "frt_abrt": "中止并关闭此窗口\">❌ 取消", "frb_apply": "应用重命名", - "fr_adv": "批量 / 元数据 / 模式重命名\n高级", + "fr_adv": "批量 / 元数据 / 模式重命名\">高级", "fr_case": "区分大小写的正则表达式\">case", "fr_win": "Windows 安全名称;将 <>:"\\|?* 替换为日文全角字符\">win", "fr_slash": "将 / 替换为不会导致新文件夹创建的字符\">不使用 /", @@ -4337,18 +4380,18 @@ var fileman = (function () { '
', '', '', - '', - '', - '', - '', + '', + '', + '', '
', - '', - '', - '', + '', + '', + '', '
name
source
passwd
expiry', - ' min / ', - ' hours / ', - ' days / ', - '', + '
' + L.fs_name + '
' + L.fs_src + '
' + L.fs_pwd + '
' + L.fs_exp + '', + ' ' + L.fs_tmin + ' / ', + ' ' + L.fs_thrs + ' / ', + ' ' + L.fs_tdays + ' / ', + '', '
perms', ]; @@ -8122,10 +8165,11 @@ var settheme = (function () { function setlang(e) { ev(e); + var t = L.lang_set; L = Ls[this.textContent]; swrite("cpp_lang", this.textContent); freshen(); - modal.confirm(Ls.eng.lang_set + "\n\n" + Ls.nor.lang_set + "\n\n" + Ls.chi.lang_set, location.reload.bind(location), null); + modal.confirm(L.lang_set + "\n\n" + t, location.reload.bind(location), null); }; freshen(); diff --git a/scripts/tlcheck.sh b/scripts/tlcheck.sh new file mode 100755 index 00000000..cece6639 --- /dev/null +++ b/scripts/tlcheck.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +# usage: ./scripts/tlcheck.sh eng chi copyparty/web/browser.js + +awk <"$3" -v lang1=\"$1\": -v lang2=\"$2\": ' + /^\t\}/{fa=0;fb=0} + !/":/{next} + $0~lang1{fa=1} + $0~lang2{fb=1} + fa{a[ia++]=$0} + fb{b[ib++]=$0} + END{for (i=0;i"); + c("{"); + c("}"); + c("&"); + c("\\\$"); + c("\\\\"); + print t $0; + } +' | +sed -r $' + s/\\\\/\033[1;37;41m\\\\\033[0m/g; + s/\$N/\033[1;37;45m$N\033[0m/g; + s/([{}])/\033[34m\\1\033[0m/g; + s/"/\033[44m"\033[0m/g; + s/\'/\033[45m\'\033[0m/g; + s/&/\033[1;43;30m&\033[0m/g; + s/([<>])/\033[30;47m\\1\033[0m/g +' | +sed -r 's/\t+//' | +less -R