diff --git a/README.md b/README.md index 7b713d0..6836396 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ | 徽章与回复 | 🏁 首位施主 💎 单笔最大 🔥 常客;站长可回复留言;感谢页一键生成像素分享卡 | | 声音 | 8-bit 音效由 Web Audio 现场合成,不加载音频文件;背景音乐可选(放一个 `static/bgm.m4a` 即可);喇叭一键静音 | | 后台 | 改资料、设收款、确认 / 拒绝手动施舍、屏蔽、回复、改口令(弹窗);主站站长额外可巡查全站留言、除名违规子站、帮站长重置口令 | +| 多语言 | 中文原文即 key,按语言查表:中 / 英 / 日 / 韩 / 俄 / 西 / 葡 / 法 / 德 / 越 / 印尼 / 土 12 种;按浏览器语言自动选,导航栏 🌐 可切换(记 cookie);查不到的回落英文再回落中文 | | 部署 | 单二进制、SQLite(无 CGO)、模板与字体全部内嵌;交叉编译扔到任何 Linux 上就能跑 | ## 工作原理 @@ -226,6 +227,8 @@ python3 e2e/real_gateway.py --serve --port=8124 # 同上但不退出,造一 python3 tools/sprite.py > templates/sprite.html # 从字符网格重新生成像素小人 / 金币 / 碗 ``` +多语言:模板里的中文用 `{{T "…"}}` 包起来,Go 里用 `a.T(r, "…")` / `tr(lang, "…")`,中文原文就是 key;译文在 `i18n_.go`,新增语言只需加一个文件并在 `i18n.go` 的 `langs` 里登记。`tools/i18n_wrap.py` 可把模板里裸露的中文批量包上 T 并列出 key。 + 背景音乐是可选的:把一段 AAC 循环片段放到 `static/bgm.m4a` 再编译即可,仓库不附带。换曲子请改文件名(静态路由是永久缓存)。 ## 常见问题 diff --git a/app.go b/app.go index fdb027d..d50bce9 100644 --- a/app.go +++ b/app.go @@ -32,7 +32,7 @@ type App struct { cfg *Config st *Store mux *http.ServeMux - tpl map[string]*template.Template + tpl map[string]map[string]*template.Template lim *limiter secure bool session []byte // 会话签名密钥(首次启动生成,存 meta 表) @@ -55,6 +55,8 @@ type Base struct { InApp bool // App 内置浏览器(X/微信等) HasBGM bool // static/bgm.m4a 存在才渲染背景音乐 HomePath string // 左上角站名点回哪:刚才浏览的子站(cookie bhome),否则主站 + Lang string // 当前语言代码 + Langs []langInfo NoIndex bool // 未收录的子站不让搜索引擎收录 Desc string // 页面描述(站点页用站名 + 口号) OGImage string // 分享缩略图(站点页用 X 头像) @@ -116,6 +118,7 @@ func (a *App) loadTemplates() error { "xav": a.xAvatar, "handleOf": handleOf, "lastSeg": xHandle, + "safeHTML": func(s string) template.HTML { return template.HTML(s) }, "dict": func(kv ...any) map[string]any { m := map[string]any{} for i := 0; i+1 < len(kv); i += 2 { @@ -124,17 +127,42 @@ func (a *App) loadTemplates() error { return m }, } - a.tpl = map[string]*template.Template{} - for _, p := range []string{"site", "pay", "status", "new", "login", "manage", "rank", "error"} { - t, err := template.New(p).Funcs(funcs).ParseFS(tplFS, "templates/layout.html", "templates/sprite.html", "templates/paypanel.html", "templates/"+p+".html") - if err != nil { - return err + // 每种语言各编译一套:T / ago / level 等输出文案的函数绑定到对应语言 + a.tpl = map[string]map[string]*template.Template{} + for _, l := range langs { + fm := template.FuncMap{} + for k, v := range funcs { + fm[k] = v } - a.tpl[p] = t + for k, v := range langFuncs(l.Code) { + fm[k] = v + } + set := map[string]*template.Template{} + for _, p := range []string{"site", "pay", "status", "new", "login", "manage", "rank", "error"} { + t, err := template.New(p).Funcs(fm).ParseFS(tplFS, "templates/layout.html", "templates/sprite.html", "templates/paypanel.html", "templates/"+p+".html") + if err != nil { + return err + } + set[p] = t + } + a.tpl[l.Code] = set } return nil } +// langOf 渲染数据里的语言(所有页面数据都内嵌 Base)。 +type langData interface{ langCode() string } + +func (b Base) langCode() string { return b.Lang } + +func (a *App) tplFor(data any, page string) *template.Template { + lang := "zh" + if ld, ok := data.(langData); ok && langOK(ld.langCode()) { + lang = ld.langCode() + } + return a.tpl[lang][page] +} + func (a *App) routes() { m := http.NewServeMux() m.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) { @@ -158,6 +186,7 @@ func (a *App) routes() { m.HandleFunc("POST /d/{code}/claim", a.handleGatewayClaim) m.HandleFunc("POST /bpg/notify", a.handleNotify) m.HandleFunc("GET /rank", a.handleRank) + m.HandleFunc("GET /lang", a.handleLang) m.HandleFunc("GET /new", a.handleNewGet) m.HandleFunc("POST /new/verify", a.handleNewVerify) m.HandleFunc("POST /new", a.handleNewPost) @@ -220,6 +249,7 @@ func (a *App) base(r *http.Request) Base { if b.Me != nil { b.MeID = b.Me.ID } + b.Lang, b.Langs = a.lang(r), langs b.HomePath = "/" if s := cookieVal(r, "bhome"); s != "" && validSlug(s) { b.HomePath = "/" + s @@ -230,7 +260,7 @@ func (a *App) base(r *http.Request) Base { // renderFragment 只渲染某个 define(弹窗用的 HTML 片段)。 func (a *App) renderFragment(w http.ResponseWriter, status int, page, name string, data any) { var buf bytes.Buffer - if err := a.tpl[page].ExecuteTemplate(&buf, name, data); err != nil { + if err := a.tplFor(data, page).ExecuteTemplate(&buf, name, data); err != nil { log.Printf("[error] 渲染片段 %s: %v", name, err) http.Error(w, "页面渲染失败", http.StatusInternalServerError) return @@ -243,7 +273,7 @@ func (a *App) renderFragment(w http.ResponseWriter, status int, page, name strin func (a *App) render(w http.ResponseWriter, status int, name string, data any) { var buf bytes.Buffer - if err := a.tpl[name].ExecuteTemplate(&buf, "layout", data); err != nil { + if err := a.tplFor(data, name).ExecuteTemplate(&buf, "layout", data); err != nil { log.Printf("[error] 渲染 %s: %v", name, err) http.Error(w, "页面渲染失败", http.StatusInternalServerError) return diff --git a/app_test.go b/app_test.go index f178c08..3c91fa5 100644 --- a/app_test.go +++ b/app_test.go @@ -378,7 +378,7 @@ func TestFullFlow(t *testing.T) { // 金额 / 垃圾过滤 st, body, _ = c.post("/donate", url.Values{"site": {""}, "amount": {"0.001"}}) - must(t, st == 400 && strings.Contains(body, "最多 2 位小数"), "小数校验: %d", st) + must(t, st == 400 && strings.Contains(body, "最多两位小数"), "小数校验: %d", st) st, body, _ = c.post("/donate", url.Values{"site": {""}, "amount": {"0.05"}}) must(t, st == 400 && strings.Contains(body, "最少施舍 0.1"), "下限校验: %d", st) st, body, _ = c.post("/donate", url.Values{"site": {""}, "amount": {"1"}, "message": {"加微信 abc123 领福利"}}) @@ -414,7 +414,7 @@ func TestFullFlow(t *testing.T) { must(t, p1 != nil && p1.Avatar != "", "施主头像应异步抓取: %+v", p1) st, body, _ = c.get("/d/" + code) must(t, st == 200 && strings.Contains(body, "谢谢施主 路人") && strings.Contains(body, "+5.0037") && strings.Contains(body, "生成分享卡"), "到账页: %d", st) - must(t, strings.Contains(body, "排第 1 位"), "名次") + must(t, strings.Contains(body, "排第 1 位"), "名次") st, body, _ = c.get("/") must(t, strings.Contains(body, "加油要饭 <b>x</b>") && strings.Contains(body, "🥇") && strings.Contains(body, "5.0037"), "主页功德簿/榜") must(t, strings.Contains(body, "/a/"+p1.Avatar) && strings.Contains(body, "@qianyu_fan") && strings.Contains(body, "🏁"), "主页应显示 X 头像与徽章") @@ -508,7 +508,7 @@ func TestFullFlow(t *testing.T) { must(t, st == 302 && strings.HasPrefix(h.Get("Location"), "/pay/BEG"), "子站下单: %d %s", st, h.Get("Location")) code3 := strings.TrimPrefix(h.Get("Location"), "/pay/") st, body, _ = c2.get("/pay/" + code3) - must(t, st == 200 && strings.Contains(body, "123456") && strings.Contains(body, "支付」→「转账") && strings.Contains(body, "我已施舍"), "手动付款页: %d", st) + must(t, st == 200 && strings.Contains(body, "123456") && strings.Contains(body, "「支付」→「转账」") && strings.Contains(body, "我已施舍"), "手动付款页: %d", st) st, _, h = c2.post("/pay/"+code3+"/claim", url.Values{"binance_order_id": {"452100000000000077"}}) must(t, st == 302 && h.Get("Location") == "/d/"+code3, "自报: %d", st) st, body, _ = c.get("/manage") @@ -622,7 +622,7 @@ func TestFullFlow(t *testing.T) { must(t, st == 200, "重置口令直接渲染: %d", st) i := strings.Index(body, "的口令为 ") must(t, i > 0, "应显示新口令") - newpw := strings.TrimSpace(strings.SplitN(body[i+len("的口令为 "):], " ", 2)[0]) + newpw := strings.TrimSpace(strings.SplitN(body[i+len("的口令为 "):], "(", 2)[0]) st, _, _ = c.get("/manage") must(t, st == 302, "管理员重置口令后站长旧会话应失效: %d", st) st, _, _ = c.post("/login", url.Values{"slug": {"qianyuwing"}, "password": {newpw}}) @@ -658,7 +658,7 @@ func TestFullFlow(t *testing.T) { // ⑬ 弹窗:异步下单返回付款面板;回填订单编号由本站代转网关核对 c8 := e.client() st, body, h = c8.post("/donate", url.Values{"site": {""}, "amount": {"0.001"}, "ajax": {"1"}}) - must(t, st == 400 && strings.Contains(body, "最多 2 位小数") && !strings.Contains(body, " a.cfg.MaxAmountE8 { - bad("最多施舍 " + fmtE8(a.cfg.MaxAmountE8) + " " + site.Currency + ",真有这么多请分几次") + bad(a.T(r, "最多施舍 %s %s,真有这么多请分几次", fmtE8(a.cfg.MaxAmountE8), site.Currency)) return } key := nickKey(nick) @@ -243,7 +243,7 @@ func (a *App) handleDonate(w http.ResponseWriter, r *http.Request) { if err := a.createGatewayOrder(site, d); err != nil { a.st.SetStatusIf(d.ID, []string{"pending"}, "failed") a.logf("[error] 下单 %s 失败: %v", d.Code, err) - bad("支付网关开小差了:" + gatewayErr(err)) + bad(a.T(r, "支付网关开小差了:%s", gatewayErrL(a.lang(r), err))) return } } @@ -270,29 +270,29 @@ func (a *App) handleCoin(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(v) } if !a.lim.allow("coin:"+a.ip(r), 60, time.Minute) { - reply(429, map[string]any{"ok": false, "msg": "手速太快了"}) + reply(429, map[string]any{"ok": false, "msg": a.T(r, "手速太快了")}) return } slug := strings.ToLower(strings.TrimSpace(r.FormValue("site"))) site, err := a.st.GetSiteBySlug(slug) if err != nil || site == nil || site.Status != "active" { - reply(404, map[string]any{"ok": false, "msg": "这个乞丐不在"}) + reply(404, map[string]any{"ok": false, "msg": a.T(r, "这个乞丐不在")}) return } visitor := cookieVal(r, "bv") if len(visitor) != 24 { // 访客标识只在打开页面时发放;跨站脚本发的请求带不上,直接拒 - reply(403, map[string]any{"ok": false, "msg": "请先打开要饭页再丢"}) + reply(403, map[string]any{"ok": false, "msg": a.T(r, "请先打开要饭页再丢")}) return } added, msg, err := a.st.AddCoin(site.ID, visitor, a.ip(r), today(), a.cfg.CoinsPerDay, a.cfg.CoinsIPCap) if err != nil { a.logf("[error] 丢钢镚: %v", err) - reply(500, map[string]any{"ok": false, "msg": "服务器开小差了"}) + reply(500, map[string]any{"ok": false, "msg": a.T(r, "服务器开小差了")}) return } total, todayN, _ := a.st.CoinStats(site.ID) mine, _ := a.st.VisitorCoinsToday(site.ID, visitor) - reply(200, map[string]any{"ok": true, "added": added, "msg": msg, "total": total, "today": todayN, "mine": mine, "per_day": a.cfg.CoinsPerDay}) + reply(200, map[string]any{"ok": true, "added": added, "msg": a.T(r, msg), "total": total, "today": todayN, "mine": mine, "per_day": a.cfg.CoinsPerDay}) } // payPanel 付款面板(弹窗 / 状态页 / 付款页共用)。 @@ -384,7 +384,7 @@ func (a *App) handleClaim(w http.ResponseWriter, r *http.Request) { ajax := r.FormValue("ajax") == "1" if !a.lim.allow("claim:"+a.ip(r), 5, time.Minute) { if ajax { - replyJSON(w, 429, map[string]any{"ok": false, "msg": "手速太快了,歇一会儿"}) + replyJSON(w, 429, map[string]any{"ok": false, "msg": a.T(r, "手速太快了,歇一会儿")}) } else { a.errorPage(w, r, http.StatusTooManyRequests, "手速太快了", "歇一会儿再来。") } @@ -403,6 +403,7 @@ func (a *App) handleClaim(w http.ResponseWriter, r *http.Request) { return } fail := func(status int, m string) { + m = a.T(r, m) if ajax { replyJSON(w, status, map[string]any{"ok": false, "msg": m}) } else { @@ -424,7 +425,7 @@ func (a *App) handleClaim(w http.ResponseWriter, r *http.Request) { } a.logf("[info] 施舍 %s 自报已转账 %s %s(站点 %d)", d.Code, d.Amount, d.Currency, site.ID) if ajax { - replyJSON(w, 200, map[string]any{"ok": true, "status": "claimed", "msg": "已提交,等站长确认"}) + replyJSON(w, 200, map[string]any{"ok": true, "status": "claimed", "msg": a.T(r, "已提交,等站长确认")}) return } http.Redirect(w, r, "/d/"+d.Code, http.StatusFound) @@ -438,6 +439,7 @@ func (a *App) handleGatewayClaim(w http.ResponseWriter, r *http.Request) { return } fail := func(status int, m string) { + m = a.T(r, m) if ajax { replyJSON(w, status, map[string]any{"ok": false, "status": d.Status, "msg": m}) } else { @@ -463,16 +465,16 @@ func (a *App) handleGatewayClaim(w http.ResponseWriter, r *http.Request) { } code, err := a.gatewayClaim(d, boid) if err != nil { - fail(http.StatusBadGateway, gatewayErr(err)) + fail(http.StatusBadGateway, gatewayErrL(a.lang(r), err)) return } a.refreshFromGateway(d) - msg := claimMsgs[code] + msg := a.T(r, claimMsgs[code]) if msg == "" { - msg = "网关返回 " + code + msg = a.T(r, "网关返回 %s", code) } if ajax { - replyJSON(w, 200, map[string]any{"ok": d.Status == "paid", "status": d.Status, "msg": msg}) + replyJSON(w, 200, map[string]any{"ok": d.Status == "paid", "status": d.Status, "msg": a.T(r, msg)}) return } http.Redirect(w, r, "/d/"+d.Code, http.StatusFound) diff --git a/handlers_sub.go b/handlers_sub.go index f3aba3b..9b7d0e7 100644 --- a/handlers_sub.go +++ b/handlers_sub.go @@ -42,24 +42,26 @@ type verifyProfile struct { } // tweetTexts 发推话术模板,第一条为默认;都带验证码和站点链接(顺便传播)。 -func (a *App) tweetTexts(code, purpose string) []string { +func (a *App) tweetTexts(lang, code, purpose string) []string { site := shortURL(a.cfg.BaseURL) // 推文里只放裸域名,短 if purpose == "reset" { return []string{ - "我在「" + a.cfg.SiteTitle + "」要饭的碗口令忘了,发推证明是我本人 🥣 " + code + " " + site, + tr(lang, "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s", tr(lang, a.cfg.SiteTitle), code, site), } } return []string{ - "我在「" + a.cfg.SiteTitle + "」摆了个碗 🥣 行行好,赏口饭吃~ " + code + " #赛博丐帮 " + site, - "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 " + code + " #赛博丐帮 " + site, - "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 " + code + " #赛博丐帮 " + site, - "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 " + code + " #赛博丐帮 " + site, + tr(lang, "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s", tr(lang, a.cfg.SiteTitle), code, site), + tr(lang, "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s", code, site), + tr(lang, "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s", code, site), + tr(lang, "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s", code, site), } } func intentFor(text string) string { return "https://x.com/intent/post?text=" + url.QueryEscape(text) } -func (a *App) intentURL(code string) string { return intentFor(a.tweetTexts(code, "new")[0]) } +func (a *App) intentURL(lang, code string) string { + return intentFor(a.tweetTexts(lang, code, "new")[0]) +} // startVerify 生成验证码并渲染第一步。验证码与浏览器 cookie 里的密钥绑定:推文是公开的,光知道码没用。 func (a *App) startVerify(w http.ResponseWriter, r *http.Request, purpose, errMsg string) { @@ -89,7 +91,7 @@ func (a *App) startVerify(w http.ResponseWriter, r *http.Request, purpose, errMs a.setCookie(w, "xv_"+code, secret, 24*3600) a.setCookie(w, "xvp_"+purpose, code, 24*3600) } - texts := a.tweetTexts(code, purpose) + texts := a.tweetTexts(a.lang(r), code, purpose) a.render(w, http.StatusOK, "new", newPage{Base: a.base(r), Step: 1, Purpose: purpose, Code: code, Texts: texts, IntentURL: intentFor(texts[0]), Err: errMsg}) } @@ -128,7 +130,7 @@ func (a *App) verifyTweet(r *http.Request, purpose string) (*Verify, *xUser, str } text, u, created, err := a.fetchTweet(id) if err != nil { - return v, nil, err.Error() + return v, nil, a.T(r, err.Error()) } if !strings.Contains(strings.ToUpper(text), code) { // 页面上的码和推文里的不一致(发推后页面重载换了码):推文里只要有本浏览器生成过的任何一个有效码就认 @@ -143,7 +145,7 @@ func (a *App) verifyTweet(r *http.Request, purpose string) (*Verify, *xUser, str } } if !found { - return v, nil, "这条推文里没有验证码 " + code + ",请检查是否发对了" + return v, nil, a.T(r, "这条推文里没有验证码 %s,请检查是否发对了", code) } } if created > 0 && created < v.CreatedAt-10*60*1000 { @@ -166,12 +168,12 @@ func (a *App) handleNewVerify(w http.ResponseWriter, r *http.Request) { a.startVerify(w, r, "new", msg) return } - a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "new", Code: v.Code, Texts: a.tweetTexts(v.Code, "new"), IntentURL: a.intentURL(v.Code), TweetURL: r.FormValue("tweet_url"), Err: msg}) + a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "new", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "new"), IntentURL: a.intentURL(a.lang(r), v.Code), TweetURL: r.FormValue("tweet_url"), Err: msg}) return } if exist := a.siteOfX(u); exist != nil { - a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "new", Code: v.Code, Texts: a.tweetTexts(v.Code, "new"), IntentURL: a.intentURL(v.Code), - Err: "@" + u.Handle + " 已经开过站了:" + a.cfg.BaseURL + exist.Path() + "。忘了口令可以在登录页用 X 重置。"}) + a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "new", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "new"), IntentURL: a.intentURL(a.lang(r), v.Code), + Err: a.T(r, "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。", u.Handle, a.cfg.BaseURL+exist.Path())}) return } prof := verifyProfile{Name: cleanText(u.Name, 20, false), Handle: u.Handle, XID: u.ID, AvatarURL: u.Avatar} @@ -251,18 +253,18 @@ func (a *App) handleNewPost(w http.ResponseWriter, r *http.Request) { return } if exist := a.siteOfX(&xUser{ID: prof.XID, Handle: prof.Handle}); exist != nil { - bad("@" + prof.Handle + " 已经开过站了") + bad(a.T(r, "@%s 已经开过站了", prof.Handle)) return } site := &Site{Slug: f.Slug, Name: prof.Name, Slogan: f.Slogan, Story: f.Story, Avatar: "🥣", XURL: "https://x.com/" + prof.Handle, XHandle: prof.Handle, XName: prof.Name, XAvatar: prof.AvatarFile, XID: prof.XID, Listed: !a.cfg.SubsiteReview, PassHash: hashPassword(pw), Currency: a.cfg.Currency} id, err := a.st.CreateSite(site) if errors.Is(err, ErrSlugTaken) { - bad("路径 " + f.Slug + " 已被占用(@" + prof.Handle + " 可能已经开过站,忘了口令可在登录页用 X 找回)") + bad(a.T(r, "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)", f.Slug, prof.Handle)) return } if errors.Is(err, ErrXTaken) { - bad("@" + prof.Handle + " 已经开过站了") + bad(a.T(r, "@%s 已经开过站了", prof.Handle)) return } if err != nil { @@ -293,20 +295,20 @@ func (a *App) handleResetVerify(w http.ResponseWriter, r *http.Request) { a.startVerify(w, r, "reset", msg) return } - a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(v.Code, "reset")[0]), TweetURL: r.FormValue("tweet_url"), Err: msg}) + a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(a.lang(r), v.Code, "reset")[0]), TweetURL: r.FormValue("tweet_url"), Err: msg}) return } site := a.siteOfX(u) // 先按 X 数字 ID 认人(改过用户名也能找回),再按用户名 if site != nil && site.IsMain() { - a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(v.Code, "reset")[0]), Err: "主站口令在服务器 config.env 里改,不走 X 找回"}) + a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(a.lang(r), v.Code, "reset")[0]), Err: "主站口令在服务器 config.env 里改,不走 X 找回"}) return } if site == nil { - a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(v.Code, "reset")[0]), Err: "@" + u.Handle + " 还没开过要饭站"}) + a.render(w, http.StatusBadRequest, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(a.lang(r), v.Code, "reset")[0]), Err: a.T(r, "@%s 还没开过要饭站", u.Handle)}) return } if !a.lim.allow("reset:"+strconv.FormatInt(site.ID, 10), 3, 24*time.Hour) { - a.render(w, http.StatusTooManyRequests, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(v.Code, "reset")[0]), Err: "这个 X 今天重置得太频繁了,明天再来"}) + a.render(w, http.StatusTooManyRequests, "new", newPage{Base: a.base(r), Step: 1, Purpose: "reset", Code: v.Code, Texts: a.tweetTexts(a.lang(r), v.Code, "reset"), IntentURL: intentFor(a.tweetTexts(a.lang(r), v.Code, "reset")[0]), Err: "这个 X 今天重置得太频繁了,明天再来"}) return } a.syncSiteX(site, u) // X 上改了昵称/用户名/头像:站点资料跟着更新 @@ -719,7 +721,7 @@ func (a *App) handleManagePayment(w http.ResponseWriter, r *http.Request) { } if site.PayMode == "gateway" { if err := a.unbindAccount(site); err != nil { - a.renderManage(w, r, site, "解绑币安 Key 失败:"+gatewayErr(err)) + a.renderManage(w, r, site, a.T(r, "解绑币安 Key 失败:%s", gatewayErrL(a.lang(r), err))) return } } @@ -762,7 +764,7 @@ func (a *App) handleManageBind(w http.ResponseWriter, r *http.Request) { acc, err := a.bindAccount(site, key, secret, uid, link) if err != nil { a.logf("[warn] 站点 /%s 绑定 Key 失败: %v", site.Slug, err) - a.renderManage(w, r, site, "绑定失败:"+gatewayErr(err)) + a.renderManage(w, r, site, a.T(r, "绑定失败:%s", gatewayErrL(a.lang(r), err))) return } if err := a.st.UpdateSitePayment(site.ID, "gateway", acc.AccountID, uid, link, site.PayID); err != nil { @@ -784,7 +786,7 @@ func (a *App) handleManageUnbind(w http.ResponseWriter, r *http.Request) { return } if err := a.unbindAccount(site); err != nil { - a.renderManage(w, r, site, "解绑失败:"+gatewayErr(err)) + a.renderManage(w, r, site, a.T(r, "解绑失败:%s", gatewayErrL(a.lang(r), err))) return } if err := a.st.UpdateSitePayment(site.ID, "manual", "", "", site.ReceiveLink, site.PayID); err != nil { @@ -809,7 +811,7 @@ func (a *App) handleManageVerify(w http.ResponseWriter, r *http.Request) { return } if _, err := a.verifyAccount(site); err != nil { - a.flash(w, "校验失败:"+gatewayErr(err)) + a.flash(w, a.T(r, "校验失败:%s", gatewayErrL(a.lang(r), err))) } else { a.flash(w, "校验通过:币安 Key 可用,到账会自动确认") } @@ -951,7 +953,7 @@ func (a *App) handleManageSite(w http.ResponseWriter, r *http.Request) { pw := strings.ToLower(randCode(10)) if err = a.st.SetSitePassword(target.ID, hashPassword(pw)); err == nil { a.logf("[info] 重置站点 /%s 口令", target.Slug) - a.renderManageFlash(w, r, site, "", "已重置 /"+target.Slug+" 的口令为 "+pw+" (只显示这一次,请转告站长)") + a.renderManageFlash(w, r, site, "", a.T(r, "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)", target.Slug, pw)) return } default: diff --git a/i18n.go b/i18n.go new file mode 100644 index 0000000..2b82ac7 --- /dev/null +++ b/i18n.go @@ -0,0 +1,120 @@ +package main + +import ( + "fmt" + "net/http" + "net/url" + "strings" + "time" +) + +// 多语言:模板与代码里的中文原文就是 key,按语言查表;查不到回落英文,再回落中文。 +// 各语言表在 i18n_.go 里注册(translations[lang][中文] = 译文),占位符用 %s / %d。 + +type langInfo struct{ Code, Name string } + +var langs = []langInfo{ + {"zh", "中文"}, {"en", "English"}, {"ja", "日本語"}, {"ko", "한국어"}, {"ru", "Русский"}, {"es", "Español"}, + {"pt", "Português"}, {"fr", "Français"}, {"de", "Deutsch"}, {"vi", "Tiếng Việt"}, {"id", "Bahasa Indonesia"}, {"tr", "Türkçe"}, +} + +var translations = map[string]map[string]string{} + +func langOK(c string) bool { + for _, l := range langs { + if l.Code == c { + return true + } + } + return false +} + +// tr 翻译一句(s 为中文原文),带参数时按 fmt 格式化。 +func tr(lang, s string, args ...any) string { + if lang != "zh" && s != "" { + if t, ok := translations[lang][s]; ok { + s = t // 译文为空串也算有(中文量词在别的语言里就是没有) + } else if t, ok := translations["en"][s]; ok { + s = t + } + } + if len(args) > 0 { + return fmt.Sprintf(s, args...) + } + return s +} + +// lang 当前请求的语言:cookie lang 优先,其次 Accept-Language,都没有就中文。 +func (a *App) lang(r *http.Request) string { + if c := cookieVal(r, "lang"); langOK(c) { + return c + } + for _, part := range strings.Split(r.Header.Get("Accept-Language"), ",") { + tag := strings.ToLower(strings.TrimSpace(strings.SplitN(part, ";", 2)[0])) + if tag == "" || tag == "*" { + continue + } + primary := strings.SplitN(tag, "-", 2)[0] + if langOK(primary) { + return primary + } + return "en" // 列表外的语言一律英文 + } + return "zh" +} + +func (a *App) T(r *http.Request, s string, args ...any) string { return tr(a.lang(r), s, args...) } + +// handleLang GET /lang?to=xx:记 cookie 一年,回到来时的页面。 +func (a *App) handleLang(w http.ResponseWriter, r *http.Request) { + to := r.URL.Query().Get("to") + if !langOK(to) { + http.Redirect(w, r, "/", http.StatusFound) + return + } + a.setCookie(w, "lang", to, 365*24*3600) + back := "/" + if ref, err := url.Parse(r.Referer()); err == nil && ref.Path != "" && ref.Path != "/lang" { + back = ref.Path + if ref.RawQuery != "" { + back += "?" + ref.RawQuery + } + } + http.Redirect(w, r, back, http.StatusFound) +} + +// agoL 相对时间(按语言)。 +func agoL(lang string, t int64) string { + if t <= 0 { + return "" + } + d := time.Since(time.UnixMilli(t)) + switch { + case d < time.Minute: + return tr(lang, "刚刚") + case d < time.Hour: + return tr(lang, "%d 分钟前", int(d.Minutes())) + case d < 24*time.Hour: + return tr(lang, "%d 小时前", int(d.Hours())) + case d < 30*24*time.Hour: + return tr(lang, "%d 天前", int(d.Hours()/24)) + } + return time.UnixMilli(t).Format("2006-01-02") +} + +// langFuncs 每种语言一套模板函数:T 与几个会输出文案的函数都绑定到该语言。 +func langFuncs(lang string) map[string]any { + return map[string]any{ + "T": func(s string, args ...any) string { return tr(lang, s, args...) }, + "ago": func(t int64) string { return agoL(lang, t) }, + "level": func(exp int64) LevelInfo { + li := levelOf(exp) + li.Title, li.NextT = tr(lang, li.Title), tr(lang, li.NextT) + return li + }, + "beggarLevel": func(exp int64) string { return tr(lang, beggarLevel(exp)) }, + "sectTitle": func(pos int) string { return tr(lang, sectTitle(pos)) }, + "donorTier": func(e8 int64) string { return tr(lang, donorTier(e8)) }, + "statusText": func(s string) string { return tr(lang, statusText(s)) }, + } +} diff --git a/i18n_de.go b/i18n_de.go new file mode 100644 index 0000000..e85ebf8 --- /dev/null +++ b/i18n_de.go @@ -0,0 +1,490 @@ +package main + +// 德语:key 是中文原文,占位符 %s/%d 顺序须与中文一致。查不到回落英文。 +func init() { + translations["de"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Cyber-Bettler", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Cyber-Bettler: eine kleine Münze, gute Seele. Spende mit Binance Pay und hinterlass eine Zeile im Buch der Verdienste; pleite? wirf eine Gratis-Münze; ein Tweet auf X und dein eigener Napf steht.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Eine kleine Münze, gute Seele. Spenden und ins Buch der Verdienste; eine Gratis-Münze ist auch Liebe.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Cyber-Bettler", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Eine kleine Münze, gute Seele. Spende mit Binance Pay und hinterlass eine Zeile im Buch der Verdienste.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(ausgeblendet: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Zurück auf die Straße", + "回到刚才看的碗": "Zurück zum Napf von eben", + "声音开关": "Ton an/aus", + "声音": "Ton", + "排行榜": "Rangliste", + "我的后台": "Mein Dashboard", + "站长": "Besitzer ", + "登录": "Anmelden", + "我的站": "Mein Napf", + "开通要饭站": "Napf aufstellen", + "🙏 行行好,赏口饭吃": "🙏 Eine kleine Münze, gute Seele", + "🪙 一毛也是爱": "🪙 Jeder Cent zählt", + "💸 投币就上榜": "💸 Spenden und auf die Rangliste", + "📜 留一句话刻功德簿": "📜 Hinterlass eine Zeile im Buch der Verdienste", + "🏚 发条推就能开自己的要饭站": "🏚 Ein Tweet und dein eigener Napf steht", + "👾 赛博丐帮,人人有碗": "👾 Cyber-Bettlergilde: ein Napf für jeden", + "· 赛博丐帮,行行好": "· Cyber-Bettlergilde · Hab Erbarmen", + "作者": "Autor", + "收款由": "Zahlungen über", + "驱动 · 字体": "· Schrift", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Ton: aus", + "声音:开(点击静音)": "Ton: an (klicken zum Stummschalten)", + "点一下开始播放": "Antippen für Musik", + "已复制": "Kopiert", + "功德 +": "Verdienst +", + "你的名号和留言已刻上功德簿": "Dein Name und deine Zeile stehen jetzt im Buch der Verdienste", + "看看功德簿": "Buch der Verdienste ansehen", + "分享卡片": "Teilen-Karte", + "已提交,等站长确认后上榜。本页会自动更新。": "Abgeschickt. Sobald der Besitzer bestätigt, bist du auf der Rangliste. Diese Seite aktualisiert sich von selbst.", + "这笔施舍已": "Diese Spende ist ", + "过期": "abgelaufen", + "下单失败": "beim Anlegen fehlgeschlagen", + "被站长拒绝": "vom Besitzer abgelehnt", + "关闭": "geschlossen", + ",请回到页面重新投币。": ". Bitte zurück zur Seite und nochmal spenden.", + "没成功,再试试": "Hat nicht geklappt, nochmal", + "网络开小差了": "Netzwerk hakt", + "分页": "Seiten", + "‹ 上一页": "‹ Zurück", + "下一页 ›": "Weiter ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Besitzer-Login ·", + "🔑 站长登录": "🔑 Besitzer-Login", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Melde dich mit deinem X-Benutzernamen und dem Passwort an, das du beim Aufstellen des Napfs gesetzt hast. Besitzer der Hauptseite: Benutzername leer lassen.", + "X 用户名": "X-Benutzername", + "例如 qianyuwing(主站留空)": "z. B. qianyuwing (Hauptseite: leer lassen)", + "口令": "Passwort", + "忘了口令?": "Passwort vergessen?", + "用 X 发推找回": "Per Tweet wiederherstellen", + "。还没有要饭站?": ". Noch keinen Napf?", + "用 X 开一个": "Mit X einen aufstellen", + // ---- 后台 ---- + "后台 ·": "Dashboard ·", + "🎉 开张大吉!你的要饭站": "🎉 Eröffnet! Dein Napf", + "已上线": "ist online", + "(待主站站长收录后进榜)": " (auf die Ranglisten kommt er, sobald der Hauptseiten-Besitzer ihn listet)", + "下一步:": "Nächster Schritt: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "trag unten unter „Zahlung“ deine Binance-UID ein (zehn Sekunden), sonst kann dir niemand etwas geben.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Komm später über %s zurück (X-Name %s + dein Passwort). Vergessen? Einfach noch einen Tweet posten.", + "后台": "das Dashboard", + "· 碗里": "· Im Napf", + "位施主 ·": "Spender ·", + "次 · 钢镚": "Spenden · Münzen", + "待收录": "ungelistet", + "🔑 改口令": "🔑 Passwort", + "退出": "Abmelden", + "⏳ 待确认": "⏳ Offen", + "✏️ 资料": "✏️ Profil", + "💰 收款方式": "💰 Zahlung", + "📜 施舍记录": "📜 Spenden", + "🏚 所有站点": "🏚 Alle Näpfe", + "🧹 留言巡查": "🧹 Nachrichten", + "⏳ 待确认的施舍": "⏳ Spenden warten auf Bestätigung", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Prüf die Überweisung in der Binance-App (Betrag und Memo-Code), dann bestätigen und ab auf die Rangliste.", + "备注码": "Memo", + "· 币安订单": "· Binance-Auftrag", + "✓ 确认到账": "✓ Erhalten", + "✗ 没收到": "✗ Nicht erhalten", + "站点标题": "Napf-Name", + "(来自 X @": "(von X @", + ",锁定)": ", gesperrt)", + "头像 emoji": "Avatar-Emoji", + "一句话口号": "Einzeiler-Slogan", + "绑定 X": "X verknüpfen", + "(主页链接或 @名字,留空不显示)": "(Profil-Link oder @Name; leer = ausblenden)", + "https://x.com/你的名字": "https://x.com/deinname", + "保存资料": "Profil speichern", + "config.env 配置": "in config.env gesetzt", + "已绑币安 Key · 自动确认": "Binance-Key verknüpft · Auto-Bestätigung", + "直接转账 · UID": "Direktüberweisung · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Noch kein Napf — antippen zum Einrichten", + "主站的收款方式在服务器 config.env 里配置。当前:": "Die Zahlungsmethode der Hauptseite wird in config.env auf dem Server gesetzt. Aktuell: ", + "BinancePayTool 网关自动确认(默认账号)": "Auto-Bestätigung über das BinancePayTool-Gateway (Standardkonto)", + "直接转账": "Direktüberweisung", + "校验网关默认账号": "Standardkonto des Gateways prüfen", + "✅ 已绑定币安账号(UID": "✅ Binance-Konto verknüpft (UID", + "),施主付款后": "). Spenden werden ", + "自动确认上榜": "automatisch bestätigt", + "收银页会展示你的收款码 / 一键唤起。": " Das Zahlungsfenster zeigt deinen QR-Code / Ein-Tipp-Öffnen.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Füg einen Empfangslink hinzu, damit Spender scannen oder die App direkt öffnen können.", + "重新校验 Key": "Key erneut prüfen", + "解绑后改为直接转账(需你手动确认到账),确定?": "Nach dem Trennen gilt Direktüberweisung (du bestätigst jede Zahlung von Hand). Weiter?", + "解绑": "Trennen", + "换一个 Key / 更新收款链接": "Key wechseln / Empfangslink aktualisieren", + "当前是": "Aktueller Modus: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Spender überweisen in der Binance-App an deine UID, tippen auf „Ich habe gespendet“, und du bestätigst hier.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Noch kein Napf: Binance-UID eintragen und du kannst Geld empfangen. Zehn Sekunden.", + "方式一:填币安 UID(最简单)": "Option 1: deine Binance-UID (am einfachsten)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Binance-App → Avatar oben links antippen; die Nummer darunter ist deine", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (auch deine Pay ID). Spender sehen sie beim Spenden und überweisen über Binance-App „Pay → Überweisen“, ohne Gebühren.", + "币安 UID": "Binance-UID", + "例如 12345678": "z. B. 12345678", + "收款链接": "Empfangslink", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(optional. Damit können Spender scannen oder die Binance-App direkt öffnen; ohne überweisen sie per UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "So bekommst du ihn: auf der Binance-Empfangsseite „Bild speichern“ antippen, den QR mit einer beliebigen Scanner-App lesen und den Link hier einfügen.", + "保存": "Speichern", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Option 2: schreibgeschützten Binance API Key verknüpfen (Auto-Bestätigung)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Spenden werden automatisch bestätigt. Der Key braucht nur „Lesen erlauben“ und kann kein Geld bewegen; diese Seite speichert ihn nie, das Zahlungs-Gateway hält ihn verschlüsselt.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "gesamt · Spam ausblenden oder Person blockieren (Einträge bleiben) · antworten", + "已屏蔽此人": "Person blockiert", + "(已屏蔽:": "(ausgeblendet: ", + "🥣 站长:": "🥣 Besitzer: ", + "恢复留言": "Nachricht einblenden", + "屏蔽留言": "Nachricht ausblenden", + "恢复此人": "Person entblocken", + "屏蔽此人": "Person blockieren", + "回一句…": "Antworten…", + "回复": "Antworten", + "还没有施舍记录": "Noch keine Spenden", + "🔑 修改口令": "🔑 Passwort ändern", + "新口令(至少 6 位)": "Neues Passwort (mind. 6 Zeichen)", + "再输一遍": "Nochmal eingeben", + "改完后其它设备上的登录会失效。": "Andere Geräte werden abgemeldet.", + "确认修改": "Passwort ändern", + "🏚 所有要饭站": "🏚 Alle Näpfe", + "个 · 违规可除名 · 可帮站长重置口令": "gesamt · Regelbrecher verbannen · Passwort eines Besitzers zurücksetzen", + "已除名": "verbannt", + "未收录": "ungelistet", + "已绑 Key 自动确认": "Key verknüpft, Auto-Bestätigung", + "位施主 · 钢镚": "Spender · Münzen", + "开张": "eröffnet", + "取消收录": "Auslisten", + "收录上榜": "Listen", + "除名": "Verbannen", + "恢复": "Wiederherstellen", + "重置 /%s 的口令?新口令只显示一次。": "Passwort für /%s zurücksetzen? Das neue wird nur einmal angezeigt.", + "重置口令": "Passwort zurücksetzen", + "还没有子站": "Noch keine Näpfe", + "🧹 全站最新留言": "🧹 Neueste Nachrichten seitenweit", + "条 · 跨站点巡查广告": "gesamt · Spam-Streife über alle Näpfe", + "暂无留言": "Noch keine Nachrichten", + "币安 App → 账户 → API 管理 → 创建 API:": "Binance-App → Konto → API-Verwaltung → API erstellen: ", + "只勾「允许读取」": "nur „Lesen erlauben“ anhaken", + ",其它权限都不要,": ", sonst nichts, ", + "不用设 IP 白名单": "keine IP-Whitelist nötig", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (ein Lese-Key kann kein Geld bewegen). Er liest nur deine Eingänge, wird verschlüsselt gespeichert und nie angezeigt.", + "(App 头像页可见)": "(auf deiner Profilseite in der App zu sehen)", + "(选填,填了施主能扫码)": "(optional; Spender können dann einen QR scannen)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "So bekommst du den Empfangslink: auf der Binance-Empfangsseite „Bild speichern“ antippen und den QR mit einer Scanner-App lesen.", + "绑定并校验": "Verknüpfen und prüfen", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Passwort mit X wiederherstellen", + "🔑 用 X 找回口令": "🔑 Passwort mit X wiederherstellen", + "🏚 开通我的要饭站": "🏚 Meinen Napf aufstellen", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Poste einen Tweet mit dem Code, um zu beweisen, dass du der Besitzer bist, dann setz ein neues Passwort.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Keine Spende nötig. Ein Tweet von deinem X-Konto stellt deinen Napf auf: benannt nach deinem X-Anzeigenamen, mit deinem X-Avatar, ein Napf pro Konto. Der Tweet stellt deinen Napf gleich auf die Straße.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Du bist in einem In-App-Browser. Der Ein-Tipp-Tweet öffnet X vielleicht nicht, und beim Zurückkommen kann der Stand verloren gehen.", + "建议点右上角「⋯」选「在浏览器中打开」": "Tipp oben rechts auf „⋯“ und wähl „Im Browser öffnen“", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (oder kopier den Link in Safari / Chrome), bevor du weitermachst.", + "复制本页链接": "Link dieser Seite kopieren", + "发一条推文,带上验证码": "Poste einen Tweet mit dem Code", + "推文内容(可以随便改,只要保留验证码)": "Tweet-Text (frei änderbar, nur den Code drinlassen)", + "换一条": "Anderer Text", + "🐦 一键去 X 发推": "🐦 Auf X posten", + "复制文案": "Text kopieren", + "没拉起 X App?点这里用网页版发 →": "X-App nicht geöffnet? Über die Website posten →", + "验证码": "Code", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": " – Groß-/Kleinschreibung egal, 24 Stunden gültig. Der Text enthält den Link zu deinem Napf, der Tweet ist also gleich Werbung.", + "把推文链接贴回来": "Tweet-Link hier einfügen", + "推文链接": "Tweet-Link", + "https://x.com/你的名字/status/1234567890": "https://x.com/deinname/status/1234567890", + "验证": "Prüfen", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Nach dem Posten: Teilen-Button des Tweets → Link kopieren.", + "还没开过站?": "Noch keinen Napf? ", + "去开一个": "Einen aufstellen", + "已经开过站?": "Schon einen Napf? ", + "站长登录": "Besitzer-Login", + "🔑 设置新口令": "🔑 Neues Passwort setzen", + "保存并登录": "Speichern und anmelden", + "✅ X 验证通过": "✅ X verifiziert", + "· 站名和头像来自 X(头像会定期同步)": "· Name und Avatar kommen von X (Avatar wird regelmäßig synchronisiert)", + "站点地址": "Napf-Adresse", + "(就是你的 X 用户名,不用填)": "(dein X-Benutzername; nichts auszufüllen)", + "行行好,赏口饭吃 🙏": "Eine kleine Münze, gute Seele 🙏", + "登录口令": "Login-Passwort", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Später mit X-Name + Passwort anmelden; vergessen? Einfach noch einen Tweet posten.", + "口令(至少 6 位)": "Passwort (mind. 6 Zeichen)", + "开张 🏚": "Eröffnen 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Nach der Eröffnung im Dashboard einen Binance-Key verknüpfen oder deine UID eintragen, um Geld zu empfangen. Für deine Inhalte bist du selbst verantwortlich; Spam-Näpfe verbannt die Gilde.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "An %s spenden", + "先回去看看": "Erstmal zurück", + "给 %s 投币": "Spende an %s", + "金额要": "Der Betrag muss ", + "一分不差": "exakt stimmen", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": das Gateway erkennt die Zahlung an dieser einmaligen Endung und bestätigt in Sekunden", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Direkt an den Besitzer mit Binance Pay überweisen, dann unten auf „Ich habe gespendet“ tippen", + "打开币安 App 转账": "Binance-App zum Zahlen öffnen", + "唤起后手动输入金额": "In der App den Betrag eingeben", + ",备注填": ", Memo", + "用另一台手机扫码": "Mit einem anderen Handy scannen", + "收款二维码": "Zahlungs-QR-Code", + "币安 App → 首页「扫一扫」→ 输入金额": "Binance-App → Scannen → Betrag eingeben", + "或手动转账": "Oder manuell überweisen", + "转账信息": "Überweisungsdaten", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Binance-App → „Pay“ → „Überweisen“ → Empfänger: die UID unten → Betrag", + "→ 备注填": "→ Memo", + "→ 转完回来点「我已施舍」": "→ zurückkommen und auf „Ich habe gespendet“ tippen", + "收款方": "Empfänger", + "复制": "Kopieren", + "金额": "Betrag", + "备注": "Memo", + "等待到账…转完自动确认,本页会自动更新": "Warte auf Zahlung… wird nach dem Senden automatisch bestätigt; diese Seite aktualisiert sich selbst", + "付了但一直没确认?": "Bezahlt, aber nicht bestätigt?", + "币安订单编号(18 位数字,转账详情里有)": "Binance-Auftragsnummer (18 Ziffern, in den Überweisungsdetails)", + "我付过了,帮我核对": "Ich habe bezahlt, bitte prüfen", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Binance-Auftragsnummer (optional, 18 Ziffern; beschleunigt die Bestätigung)", + "我已施舍,等站长确认": "Ich habe gespendet, warte auf den Besitzer", + "「我已施舍」要在发起施舍的那台设备上点。": "Tipp „Ich habe gespendet“ auf dem Gerät, das die Spende gestartet hat.", + "打不开?": "Geht nicht auf? ", + "用网关收银页支付": "Über die Gateway-Kasse zahlen", + "施舍进行中": "Spende läuft", + "🙏 谢谢施主": "🙏 Danke, edler Spender", + "你在 %s 的施主榜排第 %d 位": "Auf der Spenderliste von %s bist du Nr. %d", + "回到 %s 的碗": "Zurück zum Napf von %s", + "复制链接分享": "Link zum Teilen kopieren", + "🖼 分享卡片": "🖼 Teilen-Karte", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Erzeug eine Pixel-Karte für X oder deine Freunde und mach dem Bettler etwas Werbung.", + "生成分享卡": "Karte erstellen", + "分享卡": "Teilen-Karte", + "长按图片保存,或": "Lange drücken zum Speichern, oder ", + "下载": "herunterladen", + "🏚 你也可以要饭": "🏚 Du kannst auch betteln", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Ein Tweet von deinem X-Konto stellt deinen eigenen Napf auf; das Geld geht direkt auf dein Binance-Konto.", + "站长没有确认这笔施舍": "Der Besitzer hat diese Spende nicht bestätigt", + "这笔施舍已过期": "Diese Spende ist abgelaufen", + "如果你确实转了,请联系站长核对。": "Falls du wirklich überwiesen hast, kontaktier den Besitzer zum Prüfen.", + "没付款不扣钱;想施舍请重新来一次。": "Nichts wurde abgebucht; fang neu an, wenn du spenden willst.", + "再来一次": "Nochmal", + // ---- 排行榜 ---- + "排行榜 ·": "Rangliste ·", + "🏆 施主榜": "🏆 Spender", + "🥣 乞丐榜": "🥣 Bettler", + "🪙 人气榜": "🪙 Beliebtheit", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · alle Näpfe zusammen ·", + "位施主": "Spender", + "总榜": "Gesamt", + "本周": "Diese Woche", + "要到最多的要饭站 · 共": "Näpfe mit der größten Ausbeute ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Meiste Münzen erhalten (kostenlos) ·", + "← 回到刚才看的碗": "← Zurück zum Napf von eben", + "施主自己填的 X,未经验证": "Vom Spender angegebenes X, nicht verifiziert", + "次 · 施舍过": "Spenden · gab an", + "个乞丐": "Bettler", + "榜上无人": "Noch niemand hier", + "就是我": "ich", + "还没有人上榜": "Noch niemand auf der Rangliste", + // ---- 站点页 ---- + "在要饭 ·": "bettelt ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Dieser Napf ist noch nicht von der Gilde gelistet, also nicht auf den Ranglisten.", + "主站站长审核后会收录。": "Der Hauptseiten-Besitzer listet ihn nach Prüfung.", + "· 榜 #": "· Rang #", + "升%s要 %s": "%s ab %s EXP", + "满级": "Max-Level", + "饱食度": "Sättigung", + "今天还没吃饭": "Heute noch nichts gegessen", + "今天有人投币了": "Heute hat jemand gespendet", + "今天丢过了": "Heute schon geworfen", + "丢个钢镚(免费)": "Münze werfen (gratis)", + "💸 投币施舍": "💸 Spenden", + "还没摆碗,暂不能投币": "Noch kein Napf, Spenden geht nicht", + "去配置": "Einrichten", + "钢镚": "Münzen", + "· 今日": "· heute", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 Münze =", + "碗里已有": "Im Napf", + "施主": "Spender", + "人": "", + "今日": "Heute", + "🕹️ 投币施舍": "🕹️ Münze einwerfen", + "玩家名(上榜用,可留空)": "Spielername (für die Rangliste, optional)", + "匿名施主": "Anonym", + "你的 X(可选,显示头像)": "Dein X (optional, zeigt deinen Avatar)", + "投多少": "Betrag in", + "✏️ 自定义": "✏️ Eigener", + "输入金额,最多两位小数": "Betrag, max. 2 Nachkommastellen", + "对乞丐喊话": "Sag dem Bettler was", + "例如:别买烟了,去吃饭": "z. B. Keine Kippen, kauf dir was zu essen", + "投币 💸": "Spenden 💸", + "投币": "Spenden", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Mit der Binance-App scannen oder direkt öffnen; nach Eingang landet es automatisch im Buch der Verdienste.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Direkt an den Besitzer per Binance Pay überweisen; er bestätigt und du bist auf der Rangliste.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Min. %s, max. %s. Keine Links oder Kontaktdaten in der Nachricht.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Dieser Bettler hat noch keinen Napf aufgestellt (keine Zahlungsmethode) und kann kein Geld empfangen.", + "去后台配置 →": "Im Dashboard einrichten →", + "🏚 想自己要饭?": "🏚 Selbst betteln?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Ein Tweet von deinem X-Konto stellt deinen eigenen Napf auf: eigene Adresse, eigenes Buch der Verdienste und eigene Spenderliste, das Geld direkt auf dein Binance-Konto.", + "用 X 开通我的要饭站 →": "Meinen Napf mit X aufstellen →", + "人气榜": "Beliebtheit", + "功德簿": "Verdienste", + "施主榜": "Spender", + "乞丐榜": "Bettler", + "已屏蔽的施主": "Blockierter Spender", + "功德簿空空如也,第一枚硬币会刻在这里": "Das Buch der Verdienste ist leer. Die erste Münze wird hier eingetragen.", + "HIGH SCORE · 给": "HIGH SCORE · Top-Spender für", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 erster Spender 💎 größte Spende 🔥 Stammgast", + "丐帮排名 · 要到最多的要饭站": "Gilden-Rangliste · Näpfe mit der größten Ausbeute", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Beliebtheit · Näpfe mit den meisten Münzen (Münzen sind gratis)", + "次": "Spenden", + "榜上无人,第一个投币的就是首席施主": "Noch niemand hier. Wer zuerst spendet, wird Chef-Spender.", + "本站": "dieser Napf", + "叮!钢镚 +1": "Kling! Münze +1", + "没丢进去": "Daneben geworfen", + "网络开小差了,再试一次": "Netzwerk hakt, nochmal versuchen", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Ungültiger Betrag (max. 2 Nachkommastellen)", + "最少施舍 %s %s": "Mindestspende: %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Höchstspende: %s %s. Wenn du wirklich so viel hast, teil es auf", + "支付网关开小差了:%s": "Zahlungs-Gateway hakt: %s", + "手速太快了": "Zu schnell", + "这个乞丐不在": "Dieser Bettler ist nicht da", + "请先打开要饭页再丢": "Erst die Napf-Seite öffnen", + "服务器开小差了": "Server hakt", + "手速太快了,歇一会儿": "Zu schnell, mach mal Pause", + "已提交,等站长确认": "Abgeschickt, warte auf Bestätigung des Besitzers", + "网关返回 %s": "Gateway meldet %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Ich habe das Passwort für meinen Napf auf %s vergessen, dieser Tweet beweist, dass ich es bin 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Ich habe meinen Napf auf %s aufgestellt 🥣 Eine kleine Münze, gute Seelen~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Ich bin jetzt in der Cyber-Bettlergilde 🧎 Jeder Cent zählt, eine Gratis-Münze tut's auch 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Job gekündigt, jetzt wird gebettelt. Der Napf steht hier, seid gnädig 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Die Bettlergilde sucht Nachwuchs und ich mache den Anfang 🥣 Spenden und ins Buch der Verdienste, oder eine Gratis-Münze werfen %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Dieser Tweet enthält den Code %s nicht. Prüf, ob du den richtigen gepostet hast", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s hat schon einen Napf: %s. Passwort vergessen? Auf der Login-Seite mit X zurücksetzen.", + "@%s 已经开过站了": "@%s hat schon einen Napf", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "Die Adresse %s ist vergeben (@%s hat vielleicht schon einen Napf; Passwort auf der Login-Seite mit X wiederherstellen)", + "@%s 还没开过要饭站": "@%s hat noch keinen Napf", + "解绑币安 Key 失败:%s": "Binance-Key konnte nicht getrennt werden: %s", + "绑定失败:%s": "Verknüpfen fehlgeschlagen: %s", + "解绑失败:%s": "Trennen fehlgeschlagen: %s", + "校验失败:%s": "Prüfung fehlgeschlagen: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Passwort für /%s auf %s zurückgesetzt (wird nur einmal angezeigt, gib es dem Besitzer weiter)", + "本站未配置支付网关": "Kein Zahlungs-Gateway konfiguriert", + "网关连不上,请稍后再试": "Gateway nicht erreichbar, später nochmal versuchen", + "方法不允许": "Methode nicht erlaubt", + "主站不存在": "Hauptseite nicht gefunden", + "页面不存在": "Seite nicht gefunden", + "赛博丐帮没有这条路。": "Diesen Weg gibt es in der Cyber-Bettlergilde nicht.", + "要么还没开张,要么已被丐帮除名。": "Entweder noch nicht eröffnet oder von der Gilde verbannt.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Dieser Bettler hat noch keinen Napf aufgestellt (keine Zahlungsmethode) und kann noch kein Geld empfangen", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "Der X-Benutzername darf nur Buchstaben, Ziffern und Unterstriche enthalten (mit oder ohne @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Keine Links oder Kontaktdaten in Name oder Nachricht. Bettler nehmen keine Werbung", + "没有这笔施舍": "Spende nicht gefunden", + "站点不存在": "Napf nicht gefunden", + "请在发起施舍的那台设备上点「我已施舍」": "Tipp „Ich habe gespendet“ auf dem Gerät, das die Spende gestartet hat", + "币安订单编号是 18 位数字,不填也行": "Die Binance-Auftragsnummer hat 18 Ziffern (optional)", + "核对失败": "Prüfung fehlgeschlagen", + "这笔施舍不是网关模式": "Diese Spende läuft nicht über das Gateway", + "试得太频繁了,一分钟后再试": "Zu viele Versuche, in einer Minute nochmal", + "请在发起施舍的那台设备上回填": "Gib die Auftragsnummer auf dem Gerät ein, das die Spende gestartet hat", + "币安订单编号是 18 位数字": "Die Binance-Auftragsnummer hat 18 Ziffern", + "本站未开放开站": "Näpfe aufstellen ist auf dieser Seite deaktiviert", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Der Code ist abgelaufen (oder wurde in einem anderen Browser erzeugt). Erzeug einen neuen", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Ungültiger Tweet-Link. Er sollte so aussehen: https://x.com/deinname/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Dieser Tweet ist älter als der Code. Nimm einen Tweet, der nach dem Erzeugen des Codes gepostet wurde", + "验证已失效,请重新验证": "Verifizierung abgelaufen, bitte erneut prüfen", + "口号和介绍里别放链接、联系方式": "Keine Links oder Kontaktdaten im Slogan", + "口令至少 6 位": "Passwort braucht mindestens 6 Zeichen", + "两次口令不一致": "Passwörter stimmen nicht überein", + "主站口令在服务器 config.env 里改,不走 X 找回": "Das Passwort der Hauptseite wird in config.env auf dem Server gesetzt, nicht über X", + "这个 X 今天重置得太频繁了,明天再来": "Zu viele Resets für dieses X-Konto heute, komm morgen wieder", + "口令至少 6 位,且两次一致": "Passwort braucht mindestens 6 Zeichen und muss übereinstimmen", + "口令已重置,其它设备上的登录已失效": "Passwort zurückgesetzt. Andere Geräte wurden abgemeldet", + "X 用户名或口令不对": "X-Benutzername oder Passwort falsch", + "请先登录": "Bitte erst anmelden", + "登录状态已失效,请重新登录。": "Deine Sitzung ist abgelaufen, bitte neu anmelden.", + "歇一会儿再来。": "Mach eine Pause und komm wieder.", + "这个站点的错误口令太多,歇一会儿。": "Zu viele falsche Passwörter für diesen Napf. Mach eine Pause.", + "站点标题不能为空": "Napf-Name darf nicht leer sein", + "资料里别放链接、联系方式": "Keine Links oder Kontaktdaten im Profil", + "资料已保存": "Profil gespeichert", + "主站的收款方式在服务器 config.env 里改": "Die Zahlungsmethode der Hauptseite wird in config.env auf dem Server gesetzt", + "填一下币安 UID,不然钱没处去": "Trag deine Binance-UID ein, sonst weiß das Geld nicht wohin", + "已切换为直接转账:施主转完自报,你在这里确认": "Auf Direktüberweisung umgestellt: Spender melden ihre Zahlung und du bestätigst hier", + "本站不支持绑定": "Verknüpfen ist auf dieser Seite nicht verfügbar", + "API Key 和 Secret 都要填": "API Key und Secret sind beide erforderlich", + "币安 UID 是纯数字(App 头像页可见)": "Die Binance-UID besteht nur aus Ziffern (auf deiner Profilseite in der App zu sehen)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Verknüpft! Binance hat den Key bestätigt; Spenden werden ab jetzt automatisch bestätigt", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Getrennt. Du bist jetzt im Direktüberweisungs-Modus, achte darauf, dass deine UID eingetragen ist", + "校验通过:币安 Key 可用,到账会自动确认": "Geprüft: der Binance-Key funktioniert, Zahlungen werden automatisch bestätigt", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Das Passwort der Hauptseite wird in config.env (ADMIN_PASSWORD) auf dem Server gesetzt", + "口令已修改,其它设备上的登录已失效": "Passwort geändert. Andere Geräte wurden abgemeldet", + "这笔施舍当前不能确认/拒绝": "Diese Spende kann gerade nicht bestätigt oder abgelehnt werden", + "只能回复自己站的施舍": "Du kannst nur auf Spenden an deinen eigenen Napf antworten", + "回复里别放链接、联系方式": "Keine Links oder Kontaktdaten in Antworten", + "未知操作": "Unbekannte Aktion", + "无权操作": "Nicht erlaubt", + "没有这个站": "Diesen Napf gibt es nicht", + "未配置支付网关": "Kein Zahlungs-Gateway konfiguriert", + "请求来源不对": "Falsche Anfrage-Herkunft", + "请从本站页面操作。": "Bitte über die Seiten dieser Website vorgehen.", + "页面渲染失败": "Seite konnte nicht gerendert werden", + "稍后再试。": "Später nochmal versuchen.", + "地址已被占用": "Adresse bereits vergeben", + "这个 X 账号已经开过站了": "Dieses X-Konto hat schon einen Napf", + "连不上 X 接口: %w": "X nicht erreichbar: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet nicht gefunden (falscher Link oder Tweet nicht öffentlich)", + "推文读不到(可能被删除或账号受保护)": "Tweet nicht lesbar (gelöscht oder Konto geschützt)", + "头像地址不在允许的域名": "Avatar-URL liegt nicht auf einer erlaubten Domain", + "头像下载失败": "Avatar-Download fehlgeschlagen", + "头像不是有效图片": "Avatar ist kein gültiges Bild", + "金额格式不对": "Ungültiger Betrag", + "收款链接过长": "Empfangslink zu lang", + "收款链接须为 https 链接": "Empfangslink muss ein https-Link sein", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Empfangslink muss eine Binance-Domain sein (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "Der X-Profil-Link sollte so aussehen: https://x.com/deinname", + "核对成功,已到账": "Geprüft, Zahlung eingegangen", + "查到了这笔转账但金额不足,已按实付记账": "Überweisung gefunden, aber Betrag zu niedrig; mit dem tatsächlichen Betrag verbucht", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Überweisung nicht gefunden: prüf Auftragsnummer und Empfängerkonto und versuch es nochmal, sobald Binance sie anzeigt", + "这笔转账已经被别的订单用过了": "Diese Überweisung wurde schon für einen anderen Auftrag verwendet", + "币种不对": "Falsche Währung", + "这笔施舍当前状态不能回填": "Der Status dieser Spende erlaubt keine Auftragsnummer", + "这个网络今天丢得够多了": "Dieses Netzwerk hat heute genug Münzen geworfen", + "今天已经丢过了,明天再来": "Heute schon geworfen, komm morgen wieder", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "unbezahlt", + "待确认": "ausstehend", + "已到账": "bezahlt", + "已过期": "abgelaufen", + "已关闭": "geschlossen", + "已拒绝": "abgelehnt", + "空碗未入帮": "Leerer Napf", + "一袋弟子": "1-Sack-Jünger", + "二袋弟子": "2-Sack-Jünger", + "三袋弟子": "3-Sack-Jünger", + "四袋弟子": "4-Sack-Jünger", + "五袋弟子": "5-Sack-Jünger", + "六袋弟子": "6-Sack-Jünger", + "七袋弟子": "7-Sack-Jünger", + "八袋弟子": "8-Sack-Jünger", + "九袋长老": "9-Sack-Ältester", + "帮主": "Gildenmeister", + "副帮主": "Vize-Gildenmeister", + "传功长老": "Ältester der Lehre", + "执法长老": "Ältester des Gesetzes", + "掌棒龙头": "Stabhüter", + "掌钵龙头": "Napfhüter", + "长老": "Ältester", + "舵主": "Zweigleiter", + "弟子": "Jünger", + "总舵": "Hauptquartier", + "投了个硬币": "hat eine Münze geworfen", + "善心人": "gute Seele", + "大善人": "großer Wohltäter", + "活菩萨": "lebender Heiliger", + "财神爷": "Gott des Reichtums", + "刚刚": "gerade eben", + "%d 分钟前": "vor %d Min.", + "%d 小时前": "vor %d Std.", + "%d 天前": "vor %d Tagen", + } +} diff --git a/i18n_en.go b/i18n_en.go new file mode 100644 index 0000000..2f0488b --- /dev/null +++ b/i18n_en.go @@ -0,0 +1,490 @@ +package main + +// 英文:其它语言查不到时也回落到这里。key 是中文原文(模板/代码里的 T "…"),占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["en"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Cyber Beggar", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Cyber Beggar: spare a coin. Tip with Binance Pay and leave a line in the Book of Merit; toss a free coin if you're broke; open your own bowl with one tweet on X.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Spare a coin. Tip to enter the Book of Merit; a free coin counts as love too.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Cyber Beggar", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Spare a coin. Tip with Binance Pay and leave a line in the Book of Merit.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(hidden: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Back to the street", + "回到刚才看的碗": "Back to the bowl you were viewing", + "声音开关": "Sound toggle", + "声音": "Sound", + "排行榜": "Leaderboard", + "我的后台": "Dashboard", + "站长": "Owner ", + "登录": "Login", + "我的站": "My bowl", + "开通要饭站": "Open bowl", + "🙏 行行好,赏口饭吃": "🙏 Spare a coin, kind stranger", + "🪙 一毛也是爱": "🪙 Every cent counts", + "💸 投币就上榜": "💸 Tip and get on the board", + "📜 留一句话刻功德簿": "📜 Leave a line in the Book of Merit", + "🏚 发条推就能开自己的要饭站": "🏚 One tweet opens your own bowl", + "👾 赛博丐帮,人人有碗": "👾 Cyber Beggars Guild: a bowl for everyone", + "· 赛博丐帮,行行好": "· Cyber Beggars Guild · Spare a coin", + "作者": "Author", + "收款由": "Payments by", + "驱动 · 字体": "· Font", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Sound: off", + "声音:开(点击静音)": "Sound: on (click to mute)", + "点一下开始播放": "Tap to start the music", + "已复制": "Copied", + "功德 +": "Merit +", + "你的名号和留言已刻上功德簿": "Your name and message are now in the Book of Merit", + "看看功德簿": "See the Book of Merit", + "分享卡片": "Share card", + "已提交,等站长确认后上榜。本页会自动更新。": "Submitted. You'll be on the board once the owner confirms. This page updates automatically.", + "这笔施舍已": "This donation has ", + "过期": "expired", + "下单失败": "failed to create", + "被站长拒绝": "been rejected by the owner", + "关闭": "been closed", + ",请回到页面重新投币。": ". Please go back and tip again.", + "没成功,再试试": "Didn't work, try again", + "网络开小差了": "Network hiccup", + "分页": "Pagination", + "‹ 上一页": "‹ Prev", + "下一页 ›": "Next ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Owner login ·", + "🔑 站长登录": "🔑 Owner login", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Log in with your X username and the password you set when opening your bowl. Main-site owner: leave the username empty.", + "X 用户名": "X username", + "例如 qianyuwing(主站留空)": "e.g. qianyuwing (leave empty for the main site)", + "口令": "Password", + "忘了口令?": "Forgot your password?", + "用 X 发推找回": "Recover with a tweet", + "。还没有要饭站?": ". No bowl yet?", + "用 X 开一个": "Open one with X", + // ---- 后台 ---- + "后台 ·": "Dashboard ·", + "🎉 开张大吉!你的要饭站": "🎉 You're open for business! Your bowl", + "已上线": "is live", + "(待主站站长收录后进榜)": " (it joins the boards once the main-site owner lists it)", + "下一步:": "Next: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "fill in your Binance UID under \"Payment\" below (ten seconds), otherwise nobody can pay you.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Come back via %s (X username %s + your password). Forgot it? Recover with another tweet.", + "后台": "dashboard", + "· 碗里": "· Bowl", + "位施主 ·": "donors ·", + "次 · 钢镚": "tips · coins", + "待收录": "unlisted", + "🔑 改口令": "🔑 Password", + "退出": "Log out", + "⏳ 待确认": "⏳ Pending", + "✏️ 资料": "✏️ Profile", + "💰 收款方式": "💰 Payment", + "📜 施舍记录": "📜 Donations", + "🏚 所有站点": "🏚 All bowls", + "🧹 留言巡查": "🧹 Messages", + "⏳ 待确认的施舍": "⏳ Donations awaiting confirmation", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Check the Binance app for the transfer (amount and memo code), then confirm to put them on the board.", + "备注码": "Memo", + "· 币安订单": "· Binance order", + "✓ 确认到账": "✓ Received", + "✗ 没收到": "✗ Not received", + "站点标题": "Bowl name", + "(来自 X @": "(from X @", + ",锁定)": ", locked)", + "头像 emoji": "Avatar emoji", + "一句话口号": "One-line slogan", + "绑定 X": "Link X", + "(主页链接或 @名字,留空不显示)": "(profile URL or @name; leave empty to hide)", + "https://x.com/你的名字": "https://x.com/yourname", + "保存资料": "Save profile", + "config.env 配置": "set in config.env", + "已绑币安 Key · 自动确认": "Binance Key linked · auto-confirm", + "直接转账 · UID": "Direct transfer · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ No bowl yet — tap to set up", + "主站的收款方式在服务器 config.env 里配置。当前:": "The main site's payment method is set in config.env on the server. Current: ", + "BinancePayTool 网关自动确认(默认账号)": "BinancePayTool gateway auto-confirm (default account)", + "直接转账": "direct transfer", + "校验网关默认账号": "Verify gateway default account", + "✅ 已绑定币安账号(UID": "✅ Binance account linked (UID", + "),施主付款后": "). Donations are ", + "自动确认上榜": "confirmed automatically", + "收银页会展示你的收款码 / 一键唤起。": " The payment panel shows your QR code / one-tap open.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Add a receive link so donors can scan or open the app in one tap.", + "重新校验 Key": "Re-verify Key", + "解绑后改为直接转账(需你手动确认到账),确定?": "Unlinking switches to direct transfer (you confirm each payment by hand). Continue?", + "解绑": "Unlink", + "换一个 Key / 更新收款链接": "Change Key / update receive link", + "当前是": "Current mode: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Donors transfer to your UID in the Binance app, tap \"I've paid\", and you confirm here.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ No bowl yet: enter your Binance UID and you can receive money. Ten seconds.", + "方式一:填币安 UID(最简单)": "Option 1: your Binance UID (easiest)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Binance app → tap your avatar top-left; the number under it is your", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (also your Pay ID). Donors see it when tipping and send to it via Binance app \"Pay → Transfer\", zero fees.", + "币安 UID": "Binance UID", + "例如 12345678": "e.g. 12345678", + "收款链接": "Receive link", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(optional. With it donors can scan or open the Binance app in one tap; without it they transfer by UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "How to get it: on the Binance receive page tap \"Save image\", read the QR with any scanner app, and paste the link here.", + "保存": "Save", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Option 2: link a read-only Binance API Key (auto-confirm)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Donations are confirmed automatically. The Key only needs \"Enable Reading\" and cannot move funds; this site never stores it, the payment gateway keeps it encrypted.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "total · hide spam messages or block the user (records kept) · reply", + "已屏蔽此人": "User blocked", + "(已屏蔽:": "(hidden: ", + "🥣 站长:": "🥣 Owner: ", + "恢复留言": "Unhide message", + "屏蔽留言": "Hide message", + "恢复此人": "Unblock user", + "屏蔽此人": "Block user", + "回一句…": "Reply…", + "回复": "Reply", + "还没有施舍记录": "No donations yet", + "🔑 修改口令": "🔑 Change password", + "新口令(至少 6 位)": "New password (min 6 chars)", + "再输一遍": "Repeat it", + "改完后其它设备上的登录会失效。": "Other devices will be logged out.", + "确认修改": "Change password", + "🏚 所有要饭站": "🏚 All bowls", + "个 · 违规可除名 · 可帮站长重置口令": "total · ban rule-breakers · reset an owner's password", + "已除名": "banned", + "未收录": "unlisted", + "已绑 Key 自动确认": "Key linked, auto-confirm", + "位施主 · 钢镚": "donors · coins", + "开张": "opened", + "取消收录": "Unlist", + "收录上榜": "List", + "除名": "Ban", + "恢复": "Restore", + "重置 /%s 的口令?新口令只显示一次。": "Reset the password for /%s? The new password is shown only once.", + "重置口令": "Reset password", + "还没有子站": "No bowls yet", + "🧹 全站最新留言": "🧹 Latest messages site-wide", + "条 · 跨站点巡查广告": "total · spam patrol across all bowls", + "暂无留言": "No messages yet", + "币安 App → 账户 → API 管理 → 创建 API:": "Binance app → Account → API Management → Create API: ", + "只勾「允许读取」": "tick only \"Enable Reading\"", + ",其它权限都不要,": ", nothing else, ", + "不用设 IP 白名单": "no IP whitelist needed", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (a read-only Key cannot move funds). It is only used to read your incoming transfers, stored encrypted, never displayed.", + "(App 头像页可见)": "(shown on your profile page in the app)", + "(选填,填了施主能扫码)": "(optional; lets donors scan a QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "How to get the receive link: on the Binance receive page tap \"Save image\" and read the QR with any scanner app.", + "绑定并校验": "Link and verify", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Recover password with X", + "🔑 用 X 找回口令": "🔑 Recover password with X", + "🏚 开通我的要饭站": "🏚 Open my bowl", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Post a tweet with the verification code to prove you're the owner, then set a new password.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "No donation required. One tweet from your X account opens your bowl: named after your X display name, with your X avatar, one bowl per account. The tweet also puts your bowl on the street.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 You're inside an in-app browser. One-tap tweeting may not open X, and you may lose your place when you come back.", + "建议点右上角「⋯」选「在浏览器中打开」": "Tap \"⋯\" top-right and choose \"Open in browser\"", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (or copy the link into Safari / Chrome) before continuing.", + "复制本页链接": "Copy this page's link", + "发一条推文,带上验证码": "Post a tweet containing the code", + "推文内容(可以随便改,只要保留验证码)": "Tweet text (edit freely, just keep the code)", + "换一条": "Another one", + "🐦 一键去 X 发推": "🐦 Post on X", + "复制文案": "Copy text", + "没拉起 X App?点这里用网页版发 →": "X app didn't open? Post via the web →", + "验证码": "Code", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "is case-insensitive and valid for 24 hours. The text includes your bowl's link, so the tweet doubles as promotion.", + "把推文链接贴回来": "Paste the tweet link back here", + "推文链接": "Tweet link", + "https://x.com/你的名字/status/1234567890": "https://x.com/yourname/status/1234567890", + "验证": "Verify", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "After posting, tap the tweet's share button → Copy link.", + "还没开过站?": "No bowl yet? ", + "去开一个": "Open one", + "已经开过站?": "Already have a bowl? ", + "站长登录": "Owner login", + "🔑 设置新口令": "🔑 Set a new password", + "保存并登录": "Save and log in", + "✅ X 验证通过": "✅ X verified", + "· 站名和头像来自 X(头像会定期同步)": "· name and avatar come from X (avatar syncs periodically)", + "站点地址": "Bowl address", + "(就是你的 X 用户名,不用填)": "(your X username; nothing to fill in)", + "行行好,赏口饭吃 🙏": "Spare a coin, kind stranger 🙏", + "登录口令": "Login password", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Log in later with X username + password; forgot it? Recover with another tweet.", + "口令(至少 6 位)": "Password (min 6 chars)", + "开张 🏚": "Open for business 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "After opening, link a Binance Key or enter your UID in the dashboard to receive money. You're responsible for your content; spam bowls get banned by the guild.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Tip %s", + "先回去看看": "Go back for now", + "给 %s 投币": "Tipping %s", + "金额要": "The amount must be ", + "一分不差": "exact", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": the gateway matches by this unique tail and confirms within seconds", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Transfer directly to the owner with Binance Pay, then tap \"I've paid\" below", + "打开币安 App 转账": "Open Binance app to pay", + "唤起后手动输入金额": "In the app, enter amount", + ",备注填": ", memo", + "用另一台手机扫码": "Scan with another phone", + "收款二维码": "Payment QR code", + "币安 App → 首页「扫一扫」→ 输入金额": "Binance app → Scan → enter amount", + "或手动转账": "Or transfer manually", + "转账信息": "Transfer details", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Binance app → \"Pay\" → \"Transfer\" → recipient: the UID below → amount", + "→ 备注填": "→ memo", + "→ 转完回来点「我已施舍」": "→ come back and tap \"I've paid\"", + "收款方": "Recipient", + "复制": "Copy", + "金额": "Amount", + "备注": "Memo", + "等待到账…转完自动确认,本页会自动更新": "Waiting for payment… confirms automatically once sent; this page updates itself", + "付了但一直没确认?": "Paid but not confirmed?", + "币安订单编号(18 位数字,转账详情里有)": "Binance order ID (18 digits, in the transfer details)", + "我付过了,帮我核对": "I've paid, please check", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Binance order ID (optional, 18 digits; speeds up confirmation)", + "我已施舍,等站长确认": "I've paid, waiting for the owner", + "「我已施舍」要在发起施舍的那台设备上点。": "Tap \"I've paid\" on the device that started this donation.", + "打不开?": "Can't open it? ", + "用网关收银页支付": "Pay via the gateway checkout page", + "施舍进行中": "Donation in progress", + "🙏 谢谢施主": "🙏 Thank you, kind donor", + "你在 %s 的施主榜排第 %d 位": "You rank #%[2]d on %[1]s's donor board", + "回到 %s 的碗": "Back to %s's bowl", + "复制链接分享": "Copy link to share", + "🖼 分享卡片": "🖼 Share card", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Generate a pixel share card for X or your friends, and give the beggar a shout-out.", + "生成分享卡": "Make share card", + "分享卡": "Share card", + "长按图片保存,或": "Long-press to save, or ", + "下载": "download", + "🏚 你也可以要饭": "🏚 You can beg too", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "One tweet from your X account opens your own bowl; money goes straight to your Binance account.", + "站长没有确认这笔施舍": "The owner didn't confirm this donation", + "这笔施舍已过期": "This donation has expired", + "如果你确实转了,请联系站长核对。": "If you did transfer, contact the owner to check.", + "没付款不扣钱;想施舍请重新来一次。": "Nothing was charged; start again if you'd like to tip.", + "再来一次": "Try again", + // ---- 排行榜 ---- + "排行榜 ·": "Leaderboard ·", + "🏆 施主榜": "🏆 Donors", + "🥣 乞丐榜": "🥣 Beggars", + "🪙 人气榜": "🪙 Popularity", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · all bowls combined ·", + "位施主": "donors", + "总榜": "All time", + "本周": "This week", + "要到最多的要饭站 · 共": "Bowls that collected the most ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Most coins received (free to give) ·", + "← 回到刚才看的碗": "← Back to the bowl you were viewing", + "施主自己填的 X,未经验证": "X handle entered by the donor, unverified", + "次 · 施舍过": "tips · gave to", + "个乞丐": "beggars", + "榜上无人": "Nobody here yet", + "就是我": "me", + "还没有人上榜": "Nobody on the board yet", + // ---- 站点页 ---- + "在要饭 ·": "is begging ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ This bowl isn't listed by the guild yet, so it's not on the boards.", + "主站站长审核后会收录。": "The main-site owner will list it after review.", + "· 榜 #": "· Rank #", + "升%s要 %s": "→ %s at %s", + "满级": "Max level", + "饱食度": "Fullness", + "今天还没吃饭": "Nothing to eat today", + "今天有人投币了": "Someone tipped today", + "今天丢过了": "Already tossed today", + "丢个钢镚(免费)": "Toss a coin (free)", + "💸 投币施舍": "💸 Tip", + "还没摆碗,暂不能投币": "No bowl set up yet, can't tip", + "去配置": "Set it up", + "钢镚": "Coins", + "· 今日": "· today", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 coin =", + "碗里已有": "In the bowl", + "施主": "Donors", + "人": "", + "今日": "Today", + "🕹️ 投币施舍": "🕹️ Insert coin", + "玩家名(上榜用,可留空)": "Player name (for the board, optional)", + "匿名施主": "Anonymous", + "你的 X(可选,显示头像)": "Your X (optional, shows your avatar)", + "投多少": "Amount in", + "✏️ 自定义": "✏️ Custom", + "输入金额,最多两位小数": "Amount, up to 2 decimals", + "对乞丐喊话": "Say something to the beggar", + "例如:别买烟了,去吃饭": "e.g. Skip the cigarettes, buy food", + "投币 💸": "Tip 💸", + "投币": "Tip", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Scan with the Binance app or open it in one tap; once received it's written into the Book of Merit automatically.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Transfer directly to the owner via Binance Pay; the owner confirms and you're on the board.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Min %s, max %s. No links or contact info in messages.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "This beggar hasn't set up a bowl (no payment method yet), so they can't receive money.", + "去后台配置 →": "Set it up in the dashboard →", + "🏚 想自己要饭?": "🏚 Want to beg too?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "One tweet from your X account opens your own bowl: your own address, your own Book of Merit and donor board, money straight into your Binance account.", + "用 X 开通我的要饭站 →": "Open my bowl with X →", + "人气榜": "Popularity", + "功德簿": "Merit", + "施主榜": "Donors", + "乞丐榜": "Beggars", + "已屏蔽的施主": "Blocked donor", + "功德簿空空如也,第一枚硬币会刻在这里": "The Book of Merit is empty. The first coin gets written here.", + "HIGH SCORE · 给": "HIGH SCORE · top tippers for", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 first donor 💎 biggest tip 🔥 regular", + "丐帮排名 · 要到最多的要饭站": "Guild ranking · bowls that collected the most", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popularity · bowls with the most coins (coins are free)", + "次": "tips", + "榜上无人,第一个投币的就是首席施主": "Nobody here yet. The first tipper becomes the chief donor.", + "本站": "this bowl", + "叮!钢镚 +1": "Ding! Coin +1", + "没丢进去": "Missed the bowl", + "网络开小差了,再试一次": "Network hiccup, try again", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Invalid amount (up to 2 decimals)", + "最少施舍 %s %s": "Minimum tip is %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Maximum tip is %s %s. If you really have that much, split it up", + "支付网关开小差了:%s": "Payment gateway hiccup: %s", + "手速太快了": "Too fast", + "这个乞丐不在": "This beggar isn't here", + "请先打开要饭页再丢": "Open the bowl page first", + "服务器开小差了": "Server hiccup", + "手速太快了,歇一会儿": "Too fast, take a break", + "已提交,等站长确认": "Submitted, waiting for the owner to confirm", + "网关返回 %s": "Gateway returned %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "I forgot the password to my bowl on %s, posting to prove it's me 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "I set up a bowl on %s 🥣 Spare a coin, kind strangers~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "I've joined the Cyber Beggars Guild 🧎 Every cent counts, a free coin works too 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Quit my job, begging now. Bowl's right here, be kind 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Beggars guild is recruiting and I'm going first 🥣 Tip and get in the Book of Merit, or toss a free coin %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "That tweet doesn't contain the code %s. Check that you posted the right one", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s already has a bowl: %s. Forgot the password? Reset it with X on the login page.", + "@%s 已经开过站了": "@%s already has a bowl", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "The address %s is taken (@%s may already have a bowl; recover the password with X on the login page)", + "@%s 还没开过要饭站": "@%s doesn't have a bowl yet", + "解绑币安 Key 失败:%s": "Failed to unlink the Binance Key: %s", + "绑定失败:%s": "Linking failed: %s", + "解绑失败:%s": "Unlinking failed: %s", + "校验失败:%s": "Verification failed: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Password for /%s reset to %s (shown only once, pass it to the owner)", + "本站未配置支付网关": "No payment gateway configured", + "网关连不上,请稍后再试": "Can't reach the gateway, try again later", + "方法不允许": "Method not allowed", + "主站不存在": "Main site not found", + "页面不存在": "Page not found", + "赛博丐帮没有这条路。": "No such road in the Cyber Beggars Guild.", + "要么还没开张,要么已被丐帮除名。": "Either not open yet, or banned by the guild.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "This beggar hasn't set up a bowl (no payment method), can't receive money yet", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "X username can only contain letters, digits and underscores (with or without @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "No links or contact info in your name or message. Beggars don't take ads", + "没有这笔施舍": "Donation not found", + "站点不存在": "Bowl not found", + "请在发起施舍的那台设备上点「我已施舍」": "Tap \"I've paid\" on the device that started this donation", + "币安订单编号是 18 位数字,不填也行": "The Binance order ID is 18 digits (optional)", + "核对失败": "Check failed", + "这笔施舍不是网关模式": "This donation doesn't use the gateway", + "试得太频繁了,一分钟后再试": "Too many attempts, try again in a minute", + "请在发起施舍的那台设备上回填": "Submit the order ID from the device that started this donation", + "币安订单编号是 18 位数字": "The Binance order ID is 18 digits", + "本站未开放开站": "Opening bowls is disabled on this site", + "验证码已失效(或不是本浏览器生成的),请重新生成": "The code has expired (or was created in another browser). Generate a new one", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Invalid tweet link. It should look like https://x.com/yourname/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "That tweet is older than the code. Use a tweet posted after generating the code", + "验证已失效,请重新验证": "Verification expired, please verify again", + "口号和介绍里别放链接、联系方式": "No links or contact info in the slogan", + "口令至少 6 位": "Password must be at least 6 characters", + "两次口令不一致": "Passwords don't match", + "主站口令在服务器 config.env 里改,不走 X 找回": "The main site's password is set in config.env on the server, not via X", + "这个 X 今天重置得太频繁了,明天再来": "Too many resets for this X account today, come back tomorrow", + "口令至少 6 位,且两次一致": "Password must be at least 6 characters and match", + "口令已重置,其它设备上的登录已失效": "Password reset. Other devices have been logged out", + "X 用户名或口令不对": "Wrong X username or password", + "请先登录": "Please log in", + "登录状态已失效,请重新登录。": "Your session has expired, please log in again.", + "歇一会儿再来。": "Take a break and come back.", + "这个站点的错误口令太多,歇一会儿。": "Too many wrong passwords for this bowl. Take a break.", + "站点标题不能为空": "Bowl name can't be empty", + "资料里别放链接、联系方式": "No links or contact info in your profile", + "资料已保存": "Profile saved", + "主站的收款方式在服务器 config.env 里改": "The main site's payment method is set in config.env on the server", + "填一下币安 UID,不然钱没处去": "Enter your Binance UID, otherwise the money has nowhere to go", + "已切换为直接转账:施主转完自报,你在这里确认": "Switched to direct transfer: donors report their payment and you confirm here", + "本站不支持绑定": "Linking isn't available on this site", + "API Key 和 Secret 都要填": "Both API Key and Secret are required", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID is digits only (shown on your profile page in the app)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Linked! Binance verified the Key; donations will now be confirmed automatically", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Unlinked. You're in direct-transfer mode now, make sure your UID is filled in", + "校验通过:币安 Key 可用,到账会自动确认": "Verified: the Binance Key works, payments will be confirmed automatically", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "The main site's password is set in config.env (ADMIN_PASSWORD) on the server", + "口令已修改,其它设备上的登录已失效": "Password changed. Other devices have been logged out", + "这笔施舍当前不能确认/拒绝": "This donation can't be confirmed or rejected right now", + "只能回复自己站的施舍": "You can only reply to donations on your own bowl", + "回复里别放链接、联系方式": "No links or contact info in replies", + "未知操作": "Unknown action", + "无权操作": "Not allowed", + "没有这个站": "No such bowl", + "未配置支付网关": "No payment gateway configured", + "请求来源不对": "Bad request origin", + "请从本站页面操作。": "Please use the site's own pages.", + "页面渲染失败": "Failed to render page", + "稍后再试。": "Try again later.", + "地址已被占用": "Address already taken", + "这个 X 账号已经开过站了": "This X account already has a bowl", + "连不上 X 接口: %w": "Can't reach X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet not found (wrong link, or the tweet isn't public)", + "推文读不到(可能被删除或账号受保护)": "Can't read the tweet (deleted, or the account is protected)", + "头像地址不在允许的域名": "Avatar URL is not on an allowed domain", + "头像下载失败": "Avatar download failed", + "头像不是有效图片": "Avatar is not a valid image", + "金额格式不对": "Invalid amount", + "收款链接过长": "Receive link is too long", + "收款链接须为 https 链接": "Receive link must be an https link", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Receive link must be a Binance domain (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "X profile link should look like https://x.com/yourname", + "核对成功,已到账": "Verified, payment received", + "查到了这笔转账但金额不足,已按实付记账": "Transfer found but the amount is short; recorded as paid", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Transfer not found: check the order ID and the recipient account, then try again once Binance shows it", + "这笔转账已经被别的订单用过了": "This transfer was already used by another order", + "币种不对": "Wrong currency", + "这笔施舍当前状态不能回填": "This donation's status doesn't allow submitting an order ID", + "这个网络今天丢得够多了": "This network has tossed enough coins today", + "今天已经丢过了,明天再来": "Already tossed today, come back tomorrow", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "unpaid", + "待确认": "pending", + "已到账": "paid", + "已过期": "expired", + "已关闭": "closed", + "已拒绝": "rejected", + "空碗未入帮": "Empty bowl", + "一袋弟子": "1-Sack Disciple", + "二袋弟子": "2-Sack Disciple", + "三袋弟子": "3-Sack Disciple", + "四袋弟子": "4-Sack Disciple", + "五袋弟子": "5-Sack Disciple", + "六袋弟子": "6-Sack Disciple", + "七袋弟子": "7-Sack Disciple", + "八袋弟子": "8-Sack Disciple", + "九袋长老": "9-Sack Elder", + "帮主": "Guild Master", + "副帮主": "Deputy Master", + "传功长老": "Elder of Teachings", + "执法长老": "Elder of Law", + "掌棒龙头": "Staff Chief", + "掌钵龙头": "Bowl Chief", + "长老": "Elder", + "舵主": "Branch Chief", + "弟子": "Disciple", + "总舵": "Headquarters", + "投了个硬币": "tossed a coin", + "善心人": "kind soul", + "大善人": "great benefactor", + "活菩萨": "living saint", + "财神爷": "god of wealth", + "刚刚": "just now", + "%d 分钟前": "%d min ago", + "%d 小时前": "%d h ago", + "%d 天前": "%d d ago", + } +} diff --git a/i18n_es.go b/i18n_es.go new file mode 100644 index 0000000..bd66e7e --- /dev/null +++ b/i18n_es.go @@ -0,0 +1,490 @@ +package main + +// 西班牙语(中性拉美 / 国际)。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["es"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Mendigo Cyber", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Mendigo Cyber: una monedita, buena gente. Dona con Binance Pay y deja una frase en el Libro de Méritos; si no tienes dinero, lanza una moneda gratis; abre tu propio cuenco con un tuit en X.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Una monedita, buena gente. Dona y entra al Libro de Méritos; una moneda gratis también es amor.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Mendigo Cyber", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Una monedita, buena gente. Dona con Binance Pay y deja una frase en el Libro de Méritos.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(oculto: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Volver a la calle", + "回到刚才看的碗": "Volver al cuenco que estabas viendo", + "声音开关": "Activar/desactivar sonido", + "声音": "Sonido", + "排行榜": "Ranking", + "我的后台": "Mi panel", + "站长": "Dueño ", + "登录": "Entrar", + "我的站": "Mi cuenco", + "开通要饭站": "Empezar a mendigar", + "🙏 行行好,赏口饭吃": "🙏 Una monedita, buena gente", + "🪙 一毛也是爱": "🪙 Cada centavo cuenta", + "💸 投币就上榜": "💸 Dona y entra al ranking", + "📜 留一句话刻功德簿": "📜 Deja una frase en el Libro de Méritos", + "🏚 发条推就能开自己的要饭站": "🏚 Un tuit y tienes tu propio cuenco", + "👾 赛博丐帮,人人有碗": "👾 Gremio de Mendigos Cyber: un cuenco para cada quien", + "· 赛博丐帮,行行好": "· Gremio de Mendigos Cyber · Una monedita", + "作者": "Autor", + "收款由": "Pagos por", + "驱动 · 字体": "· Fuente", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Sonido: apagado", + "声音:开(点击静音)": "Sonido: encendido (clic para silenciar)", + "点一下开始播放": "Toca para iniciar la música", + "已复制": "Copiado", + "功德 +": "Mérito +", + "你的名号和留言已刻上功德簿": "Tu nombre y tu mensaje ya están en el Libro de Méritos", + "看看功德簿": "Ver el Libro de Méritos", + "分享卡片": "Tarjeta para compartir", + "已提交,等站长确认后上榜。本页会自动更新。": "Enviado. Entrarás al ranking cuando el dueño confirme. Esta página se actualiza sola.", + "这笔施舍已": "Esta donación ", + "过期": "expiró", + "下单失败": "no se pudo crear", + "被站长拒绝": "fue rechazada por el dueño", + "关闭": "fue cerrada", + ",请回到页面重新投币。": ". Vuelve a la página y dona de nuevo.", + "没成功,再试试": "No funcionó, inténtalo otra vez", + "网络开小差了": "La red se distrajo", + "分页": "Paginación", + "‹ 上一页": "‹ Anterior", + "下一页 ›": "Siguiente ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Acceso de dueño ·", + "🔑 站长登录": "🔑 Acceso de dueño", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Entra con tu usuario de X y la contraseña que pusiste al abrir tu cuenco. Dueño del sitio principal: deja el usuario vacío.", + "X 用户名": "Usuario de X", + "例如 qianyuwing(主站留空)": "p. ej. qianyuwing (vacío para el sitio principal)", + "口令": "Contraseña", + "忘了口令?": "¿Olvidaste la contraseña?", + "用 X 发推找回": "Recupérala con un tuit", + "。还没有要饭站?": ". ¿Aún no tienes cuenco?", + "用 X 开一个": "Abre uno con X", + // ---- 后台 ---- + "后台 ·": "Panel ·", + "🎉 开张大吉!你的要饭站": "🎉 ¡Negocio abierto! Tu cuenco", + "已上线": "ya está en línea", + "(待主站站长收录后进榜)": " (entrará al ranking cuando el dueño del sitio principal lo apruebe)", + "下一步:": "Siguiente paso: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "pon tu UID de Binance en \"Cobro\" aquí abajo (diez segundos); si no, nadie podrá pagarte.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Vuelve por %s (usuario de X %s + tu contraseña). ¿La olvidaste? Recupérala con otro tuit.", + "后台": "panel", + "· 碗里": "· En el cuenco", + "位施主 ·": "donantes ·", + "次 · 钢镚": "donaciones · monedas", + "待收录": "sin aprobar", + "🔑 改口令": "🔑 Contraseña", + "退出": "Salir", + "⏳ 待确认": "⏳ Pendientes", + "✏️ 资料": "✏️ Perfil", + "💰 收款方式": "💰 Cobro", + "📜 施舍记录": "📜 Donaciones", + "🏚 所有站点": "🏚 Todos los cuencos", + "🧹 留言巡查": "🧹 Mensajes", + "⏳ 待确认的施舍": "⏳ Donaciones por confirmar", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Revisa la transferencia en la app de Binance (monto y código de nota) y confirma para subirlos al ranking.", + "备注码": "Nota", + "· 币安订单": "· Orden de Binance", + "✓ 确认到账": "✓ Recibido", + "✗ 没收到": "✗ No recibido", + "站点标题": "Nombre del cuenco", + "(来自 X @": "(de X @", + ",锁定)": ", fijo)", + "头像 emoji": "Emoji de avatar", + "一句话口号": "Lema en una línea", + "绑定 X": "Vincular X", + "(主页链接或 @名字,留空不显示)": "(enlace del perfil o @nombre; vacío para ocultar)", + "https://x.com/你的名字": "https://x.com/tunombre", + "保存资料": "Guardar perfil", + "config.env 配置": "definido en config.env", + "已绑币安 Key · 自动确认": "Key de Binance vinculada · confirmación automática", + "直接转账 · UID": "Transferencia directa · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Aún no hay cuenco — toca para configurarlo", + "主站的收款方式在服务器 config.env 里配置。当前:": "El método de cobro del sitio principal se define en config.env en el servidor. Actual: ", + "BinancePayTool 网关自动确认(默认账号)": "Confirmación automática por la pasarela BinancePayTool (cuenta predeterminada)", + "直接转账": "transferencia directa", + "校验网关默认账号": "Verificar la cuenta predeterminada de la pasarela", + "✅ 已绑定币安账号(UID": "✅ Cuenta de Binance vinculada (UID", + "),施主付款后": "). Las donaciones se ", + "自动确认上榜": "confirman automáticamente", + "收银页会展示你的收款码 / 一键唤起。": " El panel de pago mostrará tu código QR / apertura con un toque.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Agrega un enlace de cobro para que los donantes puedan escanear o abrir la app con un toque.", + "重新校验 Key": "Volver a verificar la Key", + "解绑后改为直接转账(需你手动确认到账),确定?": "Al desvincular pasas a transferencia directa (confirmas cada pago a mano). ¿Continuar?", + "解绑": "Desvincular", + "换一个 Key / 更新收款链接": "Cambiar Key / actualizar enlace de cobro", + "当前是": "Modo actual: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Los donantes transfieren a tu UID en la app de Binance, tocan \"Ya doné\" y tú confirmas aquí.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Aún no hay cuenco: pon tu UID de Binance y ya puedes recibir dinero. Diez segundos.", + "方式一:填币安 UID(最简单)": "Opción 1: tu UID de Binance (lo más fácil)", + "币安 App → 点左上角头像,头像下面那串数字就是": "App de Binance → toca tu avatar arriba a la izquierda; el número debajo es tu", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (también es tu Pay ID). Los donantes lo verán al donar y te envían por la app de Binance en \"Pagar → Transferir\", sin comisiones.", + "币安 UID": "UID de Binance", + "例如 12345678": "p. ej. 12345678", + "收款链接": "Enlace de cobro", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(opcional. Con él los donantes pueden escanear o abrir la app de Binance con un toque; sin él transfieren por UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Cómo obtenerlo: en la página de cobro de Binance toca \"Guardar imagen\", lee el QR con cualquier app de escaneo y pega el enlace aquí.", + "保存": "Guardar", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Opción 2: vincular una API Key de Binance de solo lectura (confirmación automática)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Las donaciones se confirman solas, sin trabajo manual. La Key solo necesita \"Habilitar lectura\" y no puede mover fondos; este sitio nunca la guarda, la pasarela de pagos la almacena cifrada.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "en total · oculta mensajes de spam o bloquea al usuario (el registro se conserva) · responde", + "已屏蔽此人": "Usuario bloqueado", + "(已屏蔽:": "(oculto: ", + "🥣 站长:": "🥣 Dueño: ", + "恢复留言": "Mostrar mensaje", + "屏蔽留言": "Ocultar mensaje", + "恢复此人": "Desbloquear usuario", + "屏蔽此人": "Bloquear usuario", + "回一句…": "Responder…", + "回复": "Responder", + "还没有施舍记录": "Todavía no hay donaciones", + "🔑 修改口令": "🔑 Cambiar contraseña", + "新口令(至少 6 位)": "Nueva contraseña (mín. 6 caracteres)", + "再输一遍": "Repítela", + "改完后其它设备上的登录会失效。": "Se cerrará la sesión en los demás dispositivos.", + "确认修改": "Cambiar contraseña", + "🏚 所有要饭站": "🏚 Todos los cuencos", + "个 · 违规可除名 · 可帮站长重置口令": "en total · expulsa a quien rompa las reglas · restablece la contraseña de un dueño", + "已除名": "expulsado", + "未收录": "sin aprobar", + "已绑 Key 自动确认": "Key vinculada, confirmación automática", + "位施主 · 钢镚": "donantes · monedas", + "开张": "abierto", + "取消收录": "Quitar del ranking", + "收录上榜": "Aprobar", + "除名": "Expulsar", + "恢复": "Restaurar", + "重置 /%s 的口令?新口令只显示一次。": "¿Restablecer la contraseña de /%s? La nueva se muestra una sola vez.", + "重置口令": "Restablecer contraseña", + "还没有子站": "Todavía no hay cuencos", + "🧹 全站最新留言": "🧹 Últimos mensajes de todo el sitio", + "条 · 跨站点巡查广告": "en total · patrulla de spam en todos los cuencos", + "暂无留言": "Todavía no hay mensajes", + "币安 App → 账户 → API 管理 → 创建 API:": "App de Binance → Cuenta → Gestión de API → Crear API: ", + "只勾「允许读取」": "marca solo \"Habilitar lectura\"", + ",其它权限都不要,": ", nada más, ", + "不用设 IP 白名单": "sin lista blanca de IP", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (una Key de solo lectura no puede mover fondos). Solo se usa para leer tus cobros, se guarda cifrada y nunca se muestra.", + "(App 头像页可见)": "(visible en tu página de perfil en la app)", + "(选填,填了施主能扫码)": "(opcional; permite a los donantes escanear un QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Cómo obtener el enlace de cobro: en la página de cobro de Binance toca \"Guardar imagen\" y lee el QR con cualquier app de escaneo.", + "绑定并校验": "Vincular y verificar", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Recuperar contraseña con X", + "🔑 用 X 找回口令": "🔑 Recuperar contraseña con X", + "🏚 开通我的要饭站": "🏚 Abrir mi cuenco", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Publica un tuit con el código de verificación para demostrar que eres el dueño y pon una contraseña nueva.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "No hace falta donar antes. Un tuit desde tu cuenta de X abre tu cuenco: con el nombre y el avatar de tu X, un cuenco por cuenta. El tuit además saca tu cuenco a la calle.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Estás en el navegador interno de una app. Puede que X no se abra con un toque y que pierdas el progreso al volver.", + "建议点右上角「⋯」选「在浏览器中打开」": "Toca \"⋯\" arriba a la derecha y elige \"Abrir en el navegador\"", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (o copia el enlace en Safari / Chrome) antes de continuar.", + "复制本页链接": "Copiar el enlace de esta página", + "发一条推文,带上验证码": "Publica un tuit con el código", + "推文内容(可以随便改,只要保留验证码)": "Texto del tuit (edítalo a gusto, solo conserva el código)", + "换一条": "Otro", + "🐦 一键去 X 发推": "🐦 Publicar en X", + "复制文案": "Copiar texto", + "没拉起 X App?点这里用网页版发 →": "¿No se abrió la app de X? Publica desde la web →", + "验证码": "El código", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "no distingue mayúsculas y vale 24 horas. El texto incluye el enlace de tu cuenco, así el tuit también sirve de promoción.", + "把推文链接贴回来": "Pega aquí el enlace del tuit", + "推文链接": "Enlace del tuit", + "https://x.com/你的名字/status/1234567890": "https://x.com/tunombre/status/1234567890", + "验证": "Verificar", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Después de publicar, toca el botón de compartir del tuit → Copiar enlace.", + "还没开过站?": "¿Aún no tienes cuenco? ", + "去开一个": "Abre uno", + "已经开过站?": "¿Ya tienes cuenco? ", + "站长登录": "Acceso de dueño", + "🔑 设置新口令": "🔑 Nueva contraseña", + "保存并登录": "Guardar y entrar", + "✅ X 验证通过": "✅ X verificado", + "· 站名和头像来自 X(头像会定期同步)": "· el nombre y el avatar vienen de X (el avatar se sincroniza periódicamente)", + "站点地址": "Dirección del cuenco", + "(就是你的 X 用户名,不用填)": "(es tu usuario de X; no hay que rellenar nada)", + "行行好,赏口饭吃 🙏": "Una monedita, buena gente 🙏", + "登录口令": "Contraseña de acceso", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Luego entras con usuario de X + contraseña; si la olvidas, recupérala con otro tuit.", + "口令(至少 6 位)": "Contraseña (mín. 6 caracteres)", + "开张 🏚": "Abrir el negocio 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Después de abrir, vincula una Key de Binance o pon tu UID en el panel para recibir dinero. Eres responsable de tu contenido; los cuencos de spam son expulsados por el gremio.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Donar a %s", + "先回去看看": "Volver por ahora", + "给 %s 投币": "Donando a %s", + "金额要": "El monto debe ser ", + "一分不差": "exacto", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": la pasarela lo reconoce por esta terminación única y confirma en segundos", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Transfiere directo al dueño con Binance Pay y luego toca \"Ya doné\" abajo", + "打开币安 App 转账": "Abrir la app de Binance para pagar", + "唤起后手动输入金额": "En la app, escribe el monto", + ",备注填": ", nota", + "用另一台手机扫码": "Escanea con otro teléfono", + "收款二维码": "Código QR de pago", + "币安 App → 首页「扫一扫」→ 输入金额": "App de Binance → Escanear → escribe el monto", + "或手动转账": "O transfiere a mano", + "转账信息": "Datos de la transferencia", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "App de Binance → \"Pagar\" → \"Transferir\" → destinatario: el UID de abajo → monto", + "→ 备注填": "→ nota", + "→ 转完回来点「我已施舍」": "→ vuelve y toca \"Ya doné\"", + "收款方": "Destinatario", + "复制": "Copiar", + "金额": "Monto", + "备注": "Nota", + "等待到账…转完自动确认,本页会自动更新": "Esperando el pago… se confirma solo al enviarlo; esta página se actualiza sola", + "付了但一直没确认?": "¿Pagaste y no se confirma?", + "币安订单编号(18 位数字,转账详情里有)": "ID de orden de Binance (18 dígitos, en el detalle de la transferencia)", + "我付过了,帮我核对": "Ya pagué, revísalo por favor", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "ID de orden de Binance (opcional, 18 dígitos; acelera la confirmación)", + "我已施舍,等站长确认": "Ya doné, esperando al dueño", + "「我已施舍」要在发起施舍的那台设备上点。": "Toca \"Ya doné\" en el dispositivo donde iniciaste la donación.", + "打不开?": "¿No se abre? ", + "用网关收银页支付": "Pagar por la página de cobro de la pasarela", + "施舍进行中": "Donación en curso", + "🙏 谢谢施主": "🙏 Gracias, buena gente", + "你在 %s 的施主榜排第 %d 位": "En el ranking de donantes de %s estás en el puesto #%d", + "回到 %s 的碗": "Volver al cuenco de %s", + "复制链接分享": "Copiar enlace para compartir", + "🖼 分享卡片": "🖼 Tarjeta para compartir", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Genera una tarjeta pixel para X o tus amigos y dale un empujón al mendigo.", + "生成分享卡": "Crear tarjeta", + "分享卡": "Tarjeta", + "长按图片保存,或": "Mantén pulsada la imagen para guardarla, o ", + "下载": "descárgala", + "🏚 你也可以要饭": "🏚 Tú también puedes mendigar", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Un tuit desde tu cuenta de X abre tu propio cuenco; el dinero va directo a tu cuenta de Binance.", + "站长没有确认这笔施舍": "El dueño no confirmó esta donación", + "这笔施舍已过期": "Esta donación expiró", + "如果你确实转了,请联系站长核对。": "Si de verdad transferiste, contacta al dueño para revisarlo.", + "没付款不扣钱;想施舍请重新来一次。": "No se cobró nada; si quieres donar, empieza de nuevo.", + "再来一次": "Intentar de nuevo", + // ---- 排行榜 ---- + "排行榜 ·": "Ranking ·", + "🏆 施主榜": "🏆 Donantes", + "🥣 乞丐榜": "🥣 Mendigos", + "🪙 人气榜": "🪙 Popularidad", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · todos los cuencos juntos ·", + "位施主": "donantes", + "总榜": "Histórico", + "本周": "Esta semana", + "要到最多的要饭站 · 共": "Cuencos que más recaudaron ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Más monedas recibidas (gratis) ·", + "← 回到刚才看的碗": "← Volver al cuenco que estabas viendo", + "施主自己填的 X,未经验证": "X escrito por el donante, sin verificar", + "次 · 施舍过": "donaciones · dio a", + "个乞丐": "mendigos", + "榜上无人": "Aquí no hay nadie todavía", + "就是我": "yo", + "还没有人上榜": "Nadie en el ranking todavía", + // ---- 站点页 ---- + "在要饭 ·": "está mendigando ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ El gremio aún no aprobó este cuenco, así que no aparece en los rankings.", + "主站站长审核后会收录。": "El dueño del sitio principal lo aprobará tras revisarlo.", + "· 榜 #": "· Puesto #", + "升%s要 %s": "%s con %s EXP", + "满级": "Nivel máximo", + "饱食度": "Saciedad", + "今天还没吃饭": "Hoy no ha comido nada", + "今天有人投币了": "Hoy alguien donó", + "今天丢过了": "Ya lanzaste hoy", + "丢个钢镚(免费)": "Lanza una moneda (gratis)", + "💸 投币施舍": "💸 Donar", + "还没摆碗,暂不能投币": "Aún no hay cuenco, no se puede donar", + "去配置": "Configurar", + "钢镚": "Monedas", + "· 今日": "· hoy", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 moneda =", + "碗里已有": "En el cuenco", + "施主": "Donantes", + "人": "", + "今日": "Hoy", + "🕹️ 投币施舍": "🕹️ Inserta una moneda", + "玩家名(上榜用,可留空)": "Nombre de jugador (para el ranking, opcional)", + "匿名施主": "Anónimo", + "你的 X(可选,显示头像)": "Tu X (opcional, muestra tu avatar)", + "投多少": "Cuánto en", + "✏️ 自定义": "✏️ Otro monto", + "输入金额,最多两位小数": "Monto, hasta 2 decimales", + "对乞丐喊话": "Dile algo al mendigo", + "例如:别买烟了,去吃饭": "p. ej. Deja los cigarros y compra comida", + "投币 💸": "Donar 💸", + "投币": "Donar", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Escanea con la app de Binance o ábrela con un toque; al recibirse queda escrito en el Libro de Méritos automáticamente.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Transfiere directo al dueño por Binance Pay; el dueño confirma y entras al ranking.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Mín. %s, máx. %s. Sin enlaces ni datos de contacto en el mensaje.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Este mendigo aún no puso su cuenco (sin método de cobro), así que no puede recibir dinero.", + "去后台配置 →": "Configúralo en el panel →", + "🏚 想自己要饭?": "🏚 ¿Quieres mendigar tú también?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Un tuit desde tu cuenta de X abre tu propio cuenco: tu propia dirección, tu Libro de Méritos y tu ranking de donantes, con el dinero directo a tu cuenta de Binance.", + "用 X 开通我的要饭站 →": "Abrir mi cuenco con X →", + "人气榜": "Popularidad", + "功德簿": "Méritos", + "施主榜": "Donantes", + "乞丐榜": "Mendigos", + "已屏蔽的施主": "Donante bloqueado", + "功德簿空空如也,第一枚硬币会刻在这里": "El Libro de Méritos está vacío. La primera moneda se escribe aquí.", + "HIGH SCORE · 给": "HIGH SCORE · los que más donaron a", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 primer donante 💎 mayor donación 🔥 habitual", + "丐帮排名 · 要到最多的要饭站": "Ranking del gremio · cuencos que más recaudaron", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popularidad · cuencos con más monedas (las monedas son gratis)", + "次": "donaciones", + "榜上无人,第一个投币的就是首席施主": "Aquí no hay nadie todavía. El primero en donar será el donante principal.", + "本站": "este cuenco", + "叮!钢镚 +1": "¡Clin! Moneda +1", + "没丢进去": "No cayó en el cuenco", + "网络开小差了,再试一次": "La red se distrajo, inténtalo otra vez", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Monto no válido (hasta 2 decimales)", + "最少施舍 %s %s": "La donación mínima es %s %s", + "最多施舍 %s %s,真有这么多请分几次": "La donación máxima es %s %s. Si de verdad tienes tanto, divídelo en varias", + "支付网关开小差了:%s": "La pasarela de pago se distrajo: %s", + "手速太快了": "Demasiado rápido", + "这个乞丐不在": "Este mendigo no está", + "请先打开要饭页再丢": "Abre primero la página del cuenco", + "服务器开小差了": "El servidor se distrajo", + "手速太快了,歇一会儿": "Demasiado rápido, descansa un poco", + "已提交,等站长确认": "Enviado, esperando la confirmación del dueño", + "网关返回 %s": "La pasarela respondió %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Olvidé la contraseña de mi cuenco en %s, tuiteo para demostrar que soy yo 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Puse mi cuenco en %s 🥣 Una monedita, buena gente~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Me uní al Gremio de Mendigos Cyber 🧎 Cada centavo cuenta, una moneda gratis también vale 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Dejé el trabajo, ahora mendigo. Aquí está el cuenco, sean buenos 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "El gremio de mendigos recluta y yo voy primero 🥣 Dona y entra al Libro de Méritos, o lanza una moneda gratis %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Ese tuit no contiene el código %s. Revisa que publicaste el correcto", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s ya tiene un cuenco: %s. ¿Olvidaste la contraseña? Restablécela con X en la página de acceso.", + "@%s 已经开过站了": "@%s ya tiene un cuenco", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "La dirección %s ya está ocupada (@%s quizá ya tiene un cuenco; recupera la contraseña con X en la página de acceso)", + "@%s 还没开过要饭站": "@%s todavía no tiene cuenco", + "解绑币安 Key 失败:%s": "No se pudo desvincular la Key de Binance: %s", + "绑定失败:%s": "Error al vincular: %s", + "解绑失败:%s": "Error al desvincular: %s", + "校验失败:%s": "Error de verificación: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Contraseña de /%s restablecida a %s (se muestra solo esta vez, pásasela al dueño)", + "本站未配置支付网关": "No hay pasarela de pago configurada", + "网关连不上,请稍后再试": "No se puede conectar con la pasarela, inténtalo más tarde", + "方法不允许": "Método no permitido", + "主站不存在": "El sitio principal no existe", + "页面不存在": "Página no encontrada", + "赛博丐帮没有这条路。": "Ese camino no existe en el Gremio de Mendigos Cyber.", + "要么还没开张,要么已被丐帮除名。": "O aún no ha abierto, o el gremio lo expulsó.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Este mendigo aún no puso su cuenco (sin método de cobro), no puede recibir dinero por ahora", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "El usuario de X solo puede tener letras, números y guiones bajos (con o sin @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Sin enlaces ni datos de contacto en el nombre o el mensaje. Los mendigos no aceptan publicidad", + "没有这笔施舍": "Donación no encontrada", + "站点不存在": "Cuenco no encontrado", + "请在发起施舍的那台设备上点「我已施舍」": "Toca \"Ya doné\" en el dispositivo donde iniciaste la donación", + "币安订单编号是 18 位数字,不填也行": "El ID de orden de Binance tiene 18 dígitos (opcional)", + "核对失败": "Error al revisar", + "这笔施舍不是网关模式": "Esta donación no usa la pasarela", + "试得太频繁了,一分钟后再试": "Demasiados intentos, prueba en un minuto", + "请在发起施舍的那台设备上回填": "Envía el ID de orden desde el dispositivo donde iniciaste la donación", + "币安订单编号是 18 位数字": "El ID de orden de Binance tiene 18 dígitos", + "本站未开放开站": "Abrir cuencos está desactivado en este sitio", + "验证码已失效(或不是本浏览器生成的),请重新生成": "El código expiró (o se creó en otro navegador). Genera uno nuevo", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Enlace del tuit no válido. Debe verse como https://x.com/tunombre/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Ese tuit es anterior al código. Usa un tuit publicado después de generar el código", + "验证已失效,请重新验证": "La verificación expiró, vuelve a verificar", + "口号和介绍里别放链接、联系方式": "Sin enlaces ni datos de contacto en el lema", + "口令至少 6 位": "La contraseña debe tener al menos 6 caracteres", + "两次口令不一致": "Las contraseñas no coinciden", + "主站口令在服务器 config.env 里改,不走 X 找回": "La contraseña del sitio principal se define en config.env en el servidor, no se recupera con X", + "这个 X 今天重置得太频繁了,明天再来": "Demasiados restablecimientos para esta cuenta de X hoy, vuelve mañana", + "口令至少 6 位,且两次一致": "La contraseña debe tener al menos 6 caracteres y coincidir", + "口令已重置,其它设备上的登录已失效": "Contraseña restablecida. Se cerró la sesión en los demás dispositivos", + "X 用户名或口令不对": "Usuario de X o contraseña incorrectos", + "请先登录": "Inicia sesión primero", + "登录状态已失效,请重新登录。": "Tu sesión expiró, inicia sesión de nuevo.", + "歇一会儿再来。": "Descansa un poco y vuelve.", + "这个站点的错误口令太多,歇一会儿。": "Demasiadas contraseñas incorrectas para este cuenco. Descansa un poco.", + "站点标题不能为空": "El nombre del cuenco no puede estar vacío", + "资料里别放链接、联系方式": "Sin enlaces ni datos de contacto en el perfil", + "资料已保存": "Perfil guardado", + "主站的收款方式在服务器 config.env 里改": "El método de cobro del sitio principal se define en config.env en el servidor", + "填一下币安 UID,不然钱没处去": "Pon tu UID de Binance; si no, el dinero no tiene a dónde ir", + "已切换为直接转账:施主转完自报,你在这里确认": "Cambiado a transferencia directa: los donantes avisan su pago y tú confirmas aquí", + "本站不支持绑定": "La vinculación no está disponible en este sitio", + "API Key 和 Secret 都要填": "Hay que indicar tanto la API Key como el Secret", + "币安 UID 是纯数字(App 头像页可见)": "El UID de Binance es solo números (visible en tu página de perfil en la app)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "¡Vinculado! Binance verificó la Key; desde ahora las donaciones se confirman automáticamente", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Desvinculado. Ahora estás en modo transferencia directa, asegúrate de tener tu UID puesto", + "校验通过:币安 Key 可用,到账会自动确认": "Verificado: la Key de Binance funciona, los pagos se confirmarán automáticamente", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "La contraseña del sitio principal se define en config.env (ADMIN_PASSWORD) en el servidor", + "口令已修改,其它设备上的登录已失效": "Contraseña cambiada. Se cerró la sesión en los demás dispositivos", + "这笔施舍当前不能确认/拒绝": "Esta donación no se puede confirmar ni rechazar ahora", + "只能回复自己站的施舍": "Solo puedes responder a donaciones de tu propio cuenco", + "回复里别放链接、联系方式": "Sin enlaces ni datos de contacto en las respuestas", + "未知操作": "Acción desconocida", + "无权操作": "No permitido", + "没有这个站": "Ese cuenco no existe", + "未配置支付网关": "No hay pasarela de pago configurada", + "请求来源不对": "Origen de la solicitud incorrecto", + "请从本站页面操作。": "Usa las páginas del propio sitio.", + "页面渲染失败": "No se pudo mostrar la página", + "稍后再试。": "Inténtalo más tarde.", + "地址已被占用": "Dirección ya ocupada", + "这个 X 账号已经开过站了": "Esta cuenta de X ya tiene un cuenco", + "连不上 X 接口: %w": "No se puede conectar con X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tuit no encontrado (enlace incorrecto o el tuit no es público)", + "推文读不到(可能被删除或账号受保护)": "No se puede leer el tuit (borrado, o la cuenta está protegida)", + "头像地址不在允许的域名": "La URL del avatar no está en un dominio permitido", + "头像下载失败": "No se pudo descargar el avatar", + "头像不是有效图片": "El avatar no es una imagen válida", + "金额格式不对": "Monto no válido", + "收款链接过长": "El enlace de cobro es demasiado largo", + "收款链接须为 https 链接": "El enlace de cobro debe ser https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "El enlace de cobro debe ser un dominio de Binance (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "El enlace del perfil de X debe verse como https://x.com/tunombre", + "核对成功,已到账": "Verificado, pago recibido", + "查到了这笔转账但金额不足,已按实付记账": "Transferencia encontrada pero el monto es menor; se registró lo pagado", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Transferencia no encontrada: revisa el ID de orden y la cuenta destino, y vuelve a intentar cuando Binance la muestre", + "这笔转账已经被别的订单用过了": "Esta transferencia ya se usó en otra orden", + "币种不对": "Moneda incorrecta", + "这笔施舍当前状态不能回填": "El estado de esta donación no permite enviar un ID de orden", + "这个网络今天丢得够多了": "Esta red ya lanzó suficientes monedas hoy", + "今天已经丢过了,明天再来": "Ya lanzaste hoy, vuelve mañana", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "sin pagar", + "待确认": "pendiente", + "已到账": "pagado", + "已过期": "expirado", + "已关闭": "cerrado", + "已拒绝": "rechazado", + "空碗未入帮": "Cuenco vacío", + "一袋弟子": "Discípulo de 1 Saco", + "二袋弟子": "Discípulo de 2 Sacos", + "三袋弟子": "Discípulo de 3 Sacos", + "四袋弟子": "Discípulo de 4 Sacos", + "五袋弟子": "Discípulo de 5 Sacos", + "六袋弟子": "Discípulo de 6 Sacos", + "七袋弟子": "Discípulo de 7 Sacos", + "八袋弟子": "Discípulo de 8 Sacos", + "九袋长老": "Anciano de 9 Sacos", + "帮主": "Maestro del Gremio", + "副帮主": "Maestro Adjunto", + "传功长老": "Anciano de Enseñanzas", + "执法长老": "Anciano de la Ley", + "掌棒龙头": "Jefe del Bastón", + "掌钵龙头": "Jefe del Cuenco", + "长老": "Anciano", + "舵主": "Jefe de Rama", + "弟子": "Discípulo", + "总舵": "Sede Central", + "投了个硬币": "lanzó una moneda", + "善心人": "alma bondadosa", + "大善人": "gran benefactor", + "活菩萨": "santo viviente", + "财神爷": "dios de la riqueza", + "刚刚": "justo ahora", + "%d 分钟前": "hace %d min", + "%d 小时前": "hace %d h", + "%d 天前": "hace %d d", + } +} diff --git a/i18n_fr.go b/i18n_fr.go new file mode 100644 index 0000000..e4c34f8 --- /dev/null +++ b/i18n_fr.go @@ -0,0 +1,490 @@ +package main + +// 法语:key 是中文原文,占位符 %s/%d 顺序须与中文一致。查不到回落英文。 +func init() { + translations["fr"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Cyber Mendiant", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Cyber Mendiant : une petite pièce, brave âme. Donne avec Binance Pay et laisse un mot dans le Livre des Mérites ; fauché ? lance un jeton gratuit ; un tweet sur X et tu ouvres ton propre bol.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Une petite pièce, brave âme. Un don et tu entres au Livre des Mérites ; un jeton gratuit, c'est de l'amour aussi.", + "%s:%s · 赛博要饭,行行好": "%s : %s · Cyber Mendiant", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Une petite pièce, brave âme. Donne avec Binance Pay et laisse un mot dans le Livre des Mérites.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(masqué : %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Retour à la rue", + "回到刚才看的碗": "Retour au bol que tu regardais", + "声音开关": "Bouton son", + "声音": "Son", + "排行榜": "Classement", + "我的后台": "Mon tableau de bord", + "站长": "Proprio ", + "登录": "Connexion", + "我的站": "Mon bol", + "开通要饭站": "Ouvrir un bol", + "🙏 行行好,赏口饭吃": "🙏 Une petite pièce, brave âme", + "🪙 一毛也是爱": "🪙 Chaque centime compte", + "💸 投币就上榜": "💸 Un don et te voilà au classement", + "📜 留一句话刻功德簿": "📜 Laisse un mot dans le Livre des Mérites", + "🏚 发条推就能开自己的要饭站": "🏚 Un tweet suffit pour ouvrir ton propre bol", + "👾 赛博丐帮,人人有碗": "👾 Guilde des Cyber-Mendiants : un bol pour chacun", + "· 赛博丐帮,行行好": "· Guilde des Cyber-Mendiants · Une petite pièce", + "作者": "Auteur", + "收款由": "Paiements par", + "驱动 · 字体": "· Police", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Son : coupé", + "声音:开(点击静音)": "Son : activé (clic pour couper)", + "点一下开始播放": "Touche pour lancer la musique", + "已复制": "Copié", + "功德 +": "Mérite +", + "你的名号和留言已刻上功德簿": "Ton nom et ton mot sont gravés dans le Livre des Mérites", + "看看功德簿": "Voir le Livre des Mérites", + "分享卡片": "Carte à partager", + "已提交,等站长确认后上榜。本页会自动更新。": "Envoyé. Tu seras au classement dès que le proprio confirme. Cette page se met à jour toute seule.", + "这笔施舍已": "Ce don a ", + "过期": "expiré", + "下单失败": "échoué à la création", + "被站长拒绝": "été refusé par le proprio", + "关闭": "été clôturé", + ",请回到页面重新投币。": ". Retourne à la page pour redonner.", + "没成功,再试试": "Raté, réessaie", + "网络开小差了": "Le réseau fait des siennes", + "分页": "Pagination", + "‹ 上一页": "‹ Précédent", + "下一页 ›": "Suivant ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Connexion proprio ·", + "🔑 站长登录": "🔑 Connexion proprio", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Connecte-toi avec ton nom d'utilisateur X et le mot de passe choisi à l'ouverture du bol. Proprio du site principal : laisse le nom vide.", + "X 用户名": "Nom d'utilisateur X", + "例如 qianyuwing(主站留空)": "ex. qianyuwing (vide pour le site principal)", + "口令": "Mot de passe", + "忘了口令?": "Mot de passe oublié ?", + "用 X 发推找回": "Récupérer avec un tweet", + "。还没有要饭站?": ". Pas encore de bol ?", + "用 X 开一个": "Ouvre-en un avec X", + // ---- 后台 ---- + "后台 ·": "Tableau de bord ·", + "🎉 开张大吉!你的要饭站": "🎉 C'est ouvert ! Ton bol", + "已上线": "est en ligne", + "(待主站站长收录后进榜)": " (il entrera au classement une fois listé par le proprio du site principal)", + "下一步:": "Étape suivante : ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "renseigne ton UID Binance dans « Paiement » ci-dessous (dix secondes), sinon personne ne peut te payer.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Reviens par %s (nom X %s + ton mot de passe). Oublié ? Un autre tweet et c'est récupéré.", + "后台": "le tableau de bord", + "· 碗里": "· Dans le bol", + "位施主 ·": "donateurs ·", + "次 · 钢镚": "dons · jetons", + "待收录": "non listé", + "🔑 改口令": "🔑 Mot de passe", + "退出": "Déconnexion", + "⏳ 待确认": "⏳ En attente", + "✏️ 资料": "✏️ Profil", + "💰 收款方式": "💰 Paiement", + "📜 施舍记录": "📜 Dons", + "🏚 所有站点": "🏚 Tous les bols", + "🧹 留言巡查": "🧹 Messages", + "⏳ 待确认的施舍": "⏳ Dons en attente de confirmation", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Vérifie le virement dans l'app Binance (montant et code en mémo), puis confirme pour les mettre au classement.", + "备注码": "Mémo", + "· 币安订单": "· Commande Binance", + "✓ 确认到账": "✓ Reçu", + "✗ 没收到": "✗ Pas reçu", + "站点标题": "Nom du bol", + "(来自 X @": "(depuis X @", + ",锁定)": ", verrouillé)", + "头像 emoji": "Emoji d'avatar", + "一句话口号": "Slogan en une ligne", + "绑定 X": "Lier X", + "(主页链接或 @名字,留空不显示)": "(lien du profil ou @nom ; vide pour masquer)", + "https://x.com/你的名字": "https://x.com/tonnom", + "保存资料": "Enregistrer le profil", + "config.env 配置": "défini dans config.env", + "已绑币安 Key · 自动确认": "Key Binance liée · confirmation auto", + "直接转账 · UID": "Virement direct · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Pas encore de bol — touche pour configurer", + "主站的收款方式在服务器 config.env 里配置。当前:": "Le mode de paiement du site principal se règle dans config.env sur le serveur. Actuel : ", + "BinancePayTool 网关自动确认(默认账号)": "confirmation auto via la passerelle BinancePayTool (compte par défaut)", + "直接转账": "virement direct", + "校验网关默认账号": "Vérifier le compte par défaut de la passerelle", + "✅ 已绑定币安账号(UID": "✅ Compte Binance lié (UID", + "),施主付款后": "). Les dons sont ", + "自动确认上榜": "confirmés automatiquement", + "收银页会展示你的收款码 / 一键唤起。": " Le panneau de paiement affiche ton QR code / ouverture en un clic.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Ajoute un lien de réception pour que les donateurs puissent scanner ou ouvrir l'app en un clic.", + "重新校验 Key": "Revérifier la Key", + "解绑后改为直接转账(需你手动确认到账),确定?": "Délier passe en virement direct (tu confirmes chaque paiement à la main). Continuer ?", + "解绑": "Délier", + "换一个 Key / 更新收款链接": "Changer de Key / mettre à jour le lien", + "当前是": "Mode actuel : ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Les donateurs virent sur ton UID dans l'app Binance, touchent « J'ai donné », et tu confirmes ici.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Pas encore de bol : entre ton UID Binance et tu peux recevoir de l'argent. Dix secondes.", + "方式一:填币安 UID(最简单)": "Option 1 : ton UID Binance (le plus simple)", + "币安 App → 点左上角头像,头像下面那串数字就是": "App Binance → touche ton avatar en haut à gauche ; le numéro en dessous est ton", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (aussi ton Pay ID). Les donateurs le voient en donnant et l'utilisent dans l'app Binance « Pay → Transfert », sans frais.", + "币安 UID": "UID Binance", + "例如 12345678": "ex. 12345678", + "收款链接": "Lien de réception", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(facultatif. Avec, les donateurs peuvent scanner ou ouvrir l'app Binance en un clic ; sans, ils virent par UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Pour l'obtenir : sur la page de réception Binance, touche « Enregistrer l'image », lis le QR avec n'importe quel scanner, et colle le lien ici.", + "保存": "Enregistrer", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Option 2 : lier une API Key Binance en lecture seule (confirmation auto)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Les dons sont confirmés automatiquement. La Key n'a besoin que de « Activer la lecture » et ne peut pas déplacer de fonds ; ce site ne la garde jamais, la passerelle de paiement la stocke chiffrée.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "au total · masque les messages spam ou bloque la personne (données conservées) · réponds", + "已屏蔽此人": "Personne bloquée", + "(已屏蔽:": "(masqué : ", + "🥣 站长:": "🥣 Proprio : ", + "恢复留言": "Réafficher le message", + "屏蔽留言": "Masquer le message", + "恢复此人": "Débloquer la personne", + "屏蔽此人": "Bloquer la personne", + "回一句…": "Répondre…", + "回复": "Répondre", + "还没有施舍记录": "Aucun don pour l'instant", + "🔑 修改口令": "🔑 Changer le mot de passe", + "新口令(至少 6 位)": "Nouveau mot de passe (6 caractères min.)", + "再输一遍": "Répète-le", + "改完后其它设备上的登录会失效。": "Les autres appareils seront déconnectés.", + "确认修改": "Changer le mot de passe", + "🏚 所有要饭站": "🏚 Tous les bols", + "个 · 违规可除名 · 可帮站长重置口令": "au total · bannis les tricheurs · réinitialise le mot de passe d'un proprio", + "已除名": "banni", + "未收录": "non listé", + "已绑 Key 自动确认": "Key liée, confirmation auto", + "位施主 · 钢镚": "donateurs · jetons", + "开张": "ouvert", + "取消收录": "Délister", + "收录上榜": "Lister", + "除名": "Bannir", + "恢复": "Rétablir", + "重置 /%s 的口令?新口令只显示一次。": "Réinitialiser le mot de passe de /%s ? Le nouveau ne s'affiche qu'une fois.", + "重置口令": "Réinitialiser le mot de passe", + "还没有子站": "Aucun bol pour l'instant", + "🧹 全站最新留言": "🧹 Derniers messages sur tout le site", + "条 · 跨站点巡查广告": "au total · patrouille anti-spam sur tous les bols", + "暂无留言": "Aucun message pour l'instant", + "币安 App → 账户 → API 管理 → 创建 API:": "App Binance → Compte → Gestion API → Créer une API : ", + "只勾「允许读取」": "coche uniquement « Activer la lecture »", + ",其它权限都不要,": ", rien d'autre, ", + "不用设 IP 白名单": "pas besoin de liste blanche d'IP", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (une Key en lecture seule ne peut pas déplacer de fonds). Elle sert uniquement à lire tes virements entrants, stockée chiffrée, jamais affichée.", + "(App 头像页可见)": "(visible sur ta page de profil dans l'app)", + "(选填,填了施主能扫码)": "(facultatif ; permet aux donateurs de scanner un QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Pour obtenir le lien : sur la page de réception Binance, touche « Enregistrer l'image » et lis le QR avec n'importe quel scanner.", + "绑定并校验": "Lier et vérifier", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Récupérer le mot de passe avec X", + "🔑 用 X 找回口令": "🔑 Récupérer le mot de passe avec X", + "🏚 开通我的要饭站": "🏚 Ouvrir mon bol", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Poste un tweet avec le code de vérification pour prouver que tu es le proprio, puis choisis un nouveau mot de passe.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Pas besoin de donner d'abord. Un tweet depuis ton compte X ouvre ton bol : nommé d'après ton pseudo X, avec ton avatar X, un bol par compte. Le tweet met aussi ton bol dans la rue.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Tu es dans un navigateur intégré à une app. Le tweet en un clic peut ne pas ouvrir X, et tu risques de perdre ta place en revenant.", + "建议点右上角「⋯」选「在浏览器中打开」": "Touche « ⋯ » en haut à droite et choisis « Ouvrir dans le navigateur »", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (ou copie le lien dans Safari / Chrome) avant de continuer.", + "复制本页链接": "Copier le lien de cette page", + "发一条推文,带上验证码": "Poste un tweet contenant le code", + "推文内容(可以随便改,只要保留验证码)": "Texte du tweet (modifie-le librement, garde juste le code)", + "换一条": "Un autre", + "🐦 一键去 X 发推": "🐦 Poster sur X", + "复制文案": "Copier le texte", + "没拉起 X App?点这里用网页版发 →": "L'app X ne s'est pas ouverte ? Poste via le web →", + "验证码": "Code", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": " : majuscules ou minuscules, peu importe, valable 24 h. Le texte contient le lien de ton bol, le tweet fait aussi de la pub.", + "把推文链接贴回来": "Colle le lien du tweet ici", + "推文链接": "Lien du tweet", + "https://x.com/你的名字/status/1234567890": "https://x.com/tonnom/status/1234567890", + "验证": "Vérifier", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Une fois posté, touche le bouton partager du tweet → Copier le lien.", + "还没开过站?": "Pas encore de bol ? ", + "去开一个": "Ouvre-en un", + "已经开过站?": "Déjà un bol ? ", + "站长登录": "Connexion proprio", + "🔑 设置新口令": "🔑 Nouveau mot de passe", + "保存并登录": "Enregistrer et se connecter", + "✅ X 验证通过": "✅ X vérifié", + "· 站名和头像来自 X(头像会定期同步)": "· nom et avatar viennent de X (l'avatar se synchronise régulièrement)", + "站点地址": "Adresse du bol", + "(就是你的 X 用户名,不用填)": "(ton nom d'utilisateur X ; rien à remplir)", + "行行好,赏口饭吃 🙏": "Une petite pièce, brave âme 🙏", + "登录口令": "Mot de passe de connexion", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Connecte-toi ensuite avec nom X + mot de passe ; oublié ? Un autre tweet et c'est récupéré.", + "口令(至少 6 位)": "Mot de passe (6 caractères min.)", + "开张 🏚": "C'est ouvert 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Une fois ouvert, lie une Key Binance ou entre ton UID dans le tableau de bord pour recevoir de l'argent. Tu es responsable de ton contenu ; les bols spam sont bannis par la guilde.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Donner à %s", + "先回去看看": "Retourner voir", + "给 %s 投币": "Don à %s", + "金额要": "Le montant doit être ", + "一分不差": "exact", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": " : la passerelle reconnaît le paiement grâce à cette terminaison unique et confirme en quelques secondes", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Vire directement au proprio avec Binance Pay, puis touche « J'ai donné » ci-dessous", + "打开币安 App 转账": "Ouvrir l'app Binance pour payer", + "唤起后手动输入金额": "Dans l'app, entre le montant", + ",备注填": ", mémo", + "用另一台手机扫码": "Scanner avec un autre téléphone", + "收款二维码": "QR code de paiement", + "币安 App → 首页「扫一扫」→ 输入金额": "App Binance → Scanner → entre le montant", + "或手动转账": "Ou virer manuellement", + "转账信息": "Détails du virement", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "App Binance → « Pay » → « Transfert » → destinataire : l'UID ci-dessous → montant", + "→ 备注填": "→ mémo", + "→ 转完回来点「我已施舍」": "→ reviens et touche « J'ai donné »", + "收款方": "Destinataire", + "复制": "Copier", + "金额": "Montant", + "备注": "Mémo", + "等待到账…转完自动确认,本页会自动更新": "En attente du paiement… confirmation automatique une fois envoyé ; cette page se met à jour toute seule", + "付了但一直没确认?": "Payé mais toujours pas confirmé ?", + "币安订单编号(18 位数字,转账详情里有)": "N° de commande Binance (18 chiffres, dans les détails du virement)", + "我付过了,帮我核对": "J'ai payé, vérifiez", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "N° de commande Binance (facultatif, 18 chiffres ; accélère la confirmation)", + "我已施舍,等站长确认": "J'ai donné, en attente du proprio", + "「我已施舍」要在发起施舍的那台设备上点。": "Touche « J'ai donné » sur l'appareil qui a lancé ce don.", + "打不开?": "Ça ne s'ouvre pas ? ", + "用网关收银页支付": "Payer via la page de la passerelle", + "施舍进行中": "Don en cours", + "🙏 谢谢施主": "🙏 Merci, généreux donateur", + "你在 %s 的施主榜排第 %d 位": "Au classement des donateurs de %s, tu es n° %d", + "回到 %s 的碗": "Retour au bol de %s", + "复制链接分享": "Copier le lien pour partager", + "🖼 分享卡片": "🖼 Carte à partager", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Génère une carte pixel à partager sur X ou avec tes amis, et fais de la pub au mendiant.", + "生成分享卡": "Créer la carte", + "分享卡": "Carte à partager", + "长按图片保存,或": "Appui long pour enregistrer, ou ", + "下载": "télécharger", + "🏚 你也可以要饭": "🏚 Toi aussi, tu peux mendier", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Un tweet depuis ton compte X ouvre ton propre bol ; l'argent va directement sur ton compte Binance.", + "站长没有确认这笔施舍": "Le proprio n'a pas confirmé ce don", + "这笔施舍已过期": "Ce don a expiré", + "如果你确实转了,请联系站长核对。": "Si tu as vraiment viré, contacte le proprio pour vérifier.", + "没付款不扣钱;想施舍请重新来一次。": "Rien n'a été débité ; recommence si tu veux donner.", + "再来一次": "Réessayer", + // ---- 排行榜 ---- + "排行榜 ·": "Classement ·", + "🏆 施主榜": "🏆 Donateurs", + "🥣 乞丐榜": "🥣 Mendiants", + "🪙 人气榜": "🪙 Popularité", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · tous les bols réunis ·", + "位施主": "donateurs", + "总榜": "Général", + "本周": "Cette semaine", + "要到最多的要饭站 · 共": "Les bols qui ont récolté le plus ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Le plus de jetons reçus (gratuits) ·", + "← 回到刚才看的碗": "← Retour au bol que tu regardais", + "施主自己填的 X,未经验证": "Compte X saisi par le donateur, non vérifié", + "次 · 施舍过": "dons · a donné à", + "个乞丐": "mendiants", + "榜上无人": "Personne ici pour l'instant", + "就是我": "moi", + "还没有人上榜": "Personne au classement pour l'instant", + // ---- 站点页 ---- + "在要饭 ·": "mendie ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Ce bol n'est pas encore listé par la guilde, donc pas au classement.", + "主站站长审核后会收录。": "Le proprio du site principal le listera après vérification.", + "· 榜 #": "· Rang #", + "升%s要 %s": "%s à %s EXP", + "满级": "Niveau max", + "饱食度": "Satiété", + "今天还没吃饭": "Rien à manger aujourd'hui", + "今天有人投币了": "Quelqu'un a donné aujourd'hui", + "今天丢过了": "Déjà lancé aujourd'hui", + "丢个钢镚(免费)": "Lancer un jeton (gratuit)", + "💸 投币施舍": "💸 Donner", + "还没摆碗,暂不能投币": "Pas encore de bol, impossible de donner", + "去配置": "Configurer", + "钢镚": "Jetons", + "· 今日": "· aujourd'hui", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 jeton =", + "碗里已有": "Dans le bol", + "施主": "Donateurs", + "人": "", + "今日": "Aujourd'hui", + "🕹️ 投币施舍": "🕹️ Insérer une pièce", + "玩家名(上榜用,可留空)": "Nom de joueur (pour le classement, facultatif)", + "匿名施主": "Anonyme", + "你的 X(可选,显示头像)": "Ton X (facultatif, affiche ton avatar)", + "投多少": "Montant en", + "✏️ 自定义": "✏️ Libre", + "输入金额,最多两位小数": "Montant, 2 décimales max.", + "对乞丐喊话": "Un mot pour le mendiant", + "例如:别买烟了,去吃饭": "ex. Laisse tomber les clopes, va manger", + "投币 💸": "Donner 💸", + "投币": "Donner", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Scanne avec l'app Binance ou ouvre-la en un clic ; une fois reçu, c'est gravé automatiquement dans le Livre des Mérites.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Vire directement au proprio via Binance Pay ; il confirme et te voilà au classement.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Min %s, max %s. Pas de liens ni de contacts dans le message.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Ce mendiant n'a pas encore posé son bol (pas de mode de paiement), il ne peut pas recevoir d'argent.", + "去后台配置 →": "Configurer dans le tableau de bord →", + "🏚 想自己要饭?": "🏚 Envie de mendier aussi ?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Un tweet depuis ton compte X ouvre ton propre bol : ta propre adresse, ton Livre des Mérites et ton classement de donateurs, l'argent directement sur ton compte Binance.", + "用 X 开通我的要饭站 →": "Ouvrir mon bol avec X →", + "人气榜": "Popularité", + "功德簿": "Mérites", + "施主榜": "Donateurs", + "乞丐榜": "Mendiants", + "已屏蔽的施主": "Donateur bloqué", + "功德簿空空如也,第一枚硬币会刻在这里": "Le Livre des Mérites est vide. La première pièce sera gravée ici.", + "HIGH SCORE · 给": "HIGH SCORE · meilleurs donateurs de", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 premier donateur 💎 plus gros don 🔥 habitué", + "丐帮排名 · 要到最多的要饭站": "Classement de la guilde · les bols qui ont récolté le plus", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popularité · les bols avec le plus de jetons (les jetons sont gratuits)", + "次": "dons", + "榜上无人,第一个投币的就是首席施主": "Personne ici pour l'instant. Le premier donateur devient donateur en chef.", + "本站": "ce bol", + "叮!钢镚 +1": "Ding ! Jeton +1", + "没丢进去": "Raté le bol", + "网络开小差了,再试一次": "Le réseau fait des siennes, réessaie", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Montant invalide (2 décimales max.)", + "最少施舍 %s %s": "Don minimum : %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Don maximum : %s %s. Si tu as vraiment autant, fais-le en plusieurs fois", + "支付网关开小差了:%s": "La passerelle de paiement fait des siennes : %s", + "手速太快了": "Trop rapide", + "这个乞丐不在": "Ce mendiant n'est pas là", + "请先打开要饭页再丢": "Ouvre d'abord la page du bol", + "服务器开小差了": "Le serveur fait des siennes", + "手速太快了,歇一会儿": "Trop rapide, fais une pause", + "已提交,等站长确认": "Envoyé, en attente de confirmation du proprio", + "网关返回 %s": "La passerelle a répondu %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "J'ai oublié le mot de passe de mon bol sur %s, je tweete pour prouver que c'est bien moi 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "J'ai posé mon bol sur %s 🥣 Une petite pièce, braves gens~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "J'ai rejoint la Guilde des Cyber-Mendiants 🧎 Chaque centime compte, un jeton gratuit aussi 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "J'ai lâché le boulot, je mendie maintenant. Le bol est là, soyez généreux 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "La guilde des mendiants recrute et j'ouvre le bal 🥣 Un don et tu entres au Livre des Mérites, sinon lance un jeton gratuit %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Ce tweet ne contient pas le code %s. Vérifie que tu as posté le bon", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s a déjà un bol : %s. Mot de passe oublié ? Réinitialise-le avec X sur la page de connexion.", + "@%s 已经开过站了": "@%s a déjà un bol", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "L'adresse %s est prise (@%s a peut-être déjà un bol ; récupère le mot de passe avec X sur la page de connexion)", + "@%s 还没开过要饭站": "@%s n'a pas encore de bol", + "解绑币安 Key 失败:%s": "Impossible de délier la Key Binance : %s", + "绑定失败:%s": "Liaison échouée : %s", + "解绑失败:%s": "Déliaison échouée : %s", + "校验失败:%s": "Vérification échouée : %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Mot de passe de /%s réinitialisé : %s (affiché une seule fois, transmets-le au proprio)", + "本站未配置支付网关": "Aucune passerelle de paiement configurée", + "网关连不上,请稍后再试": "Passerelle injoignable, réessaie plus tard", + "方法不允许": "Méthode non autorisée", + "主站不存在": "Site principal introuvable", + "页面不存在": "Page introuvable", + "赛博丐帮没有这条路。": "Cette route n'existe pas dans la Guilde des Cyber-Mendiants.", + "要么还没开张,要么已被丐帮除名。": "Soit pas encore ouvert, soit banni par la guilde.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Ce mendiant n'a pas encore posé son bol (pas de mode de paiement), il ne peut pas encore recevoir d'argent", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "Le nom d'utilisateur X ne peut contenir que des lettres, chiffres et tirets bas (avec ou sans @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Pas de liens ni de contacts dans ton nom ou ton message. Les mendiants ne prennent pas de pub", + "没有这笔施舍": "Don introuvable", + "站点不存在": "Bol introuvable", + "请在发起施舍的那台设备上点「我已施舍」": "Touche « J'ai donné » sur l'appareil qui a lancé ce don", + "币安订单编号是 18 位数字,不填也行": "Le n° de commande Binance fait 18 chiffres (facultatif)", + "核对失败": "Vérification échouée", + "这笔施舍不是网关模式": "Ce don ne passe pas par la passerelle", + "试得太频繁了,一分钟后再试": "Trop de tentatives, réessaie dans une minute", + "请在发起施舍的那台设备上回填": "Renseigne le n° de commande depuis l'appareil qui a lancé ce don", + "币安订单编号是 18 位数字": "Le n° de commande Binance fait 18 chiffres", + "本站未开放开站": "L'ouverture de bols est désactivée sur ce site", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Le code a expiré (ou a été créé dans un autre navigateur). Génère-en un nouveau", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Lien de tweet invalide. Il doit ressembler à https://x.com/tonnom/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Ce tweet est plus ancien que le code. Utilise un tweet posté après la génération du code", + "验证已失效,请重新验证": "Vérification expirée, recommence", + "口号和介绍里别放链接、联系方式": "Pas de liens ni de contacts dans le slogan", + "口令至少 6 位": "Le mot de passe doit faire au moins 6 caractères", + "两次口令不一致": "Les mots de passe ne correspondent pas", + "主站口令在服务器 config.env 里改,不走 X 找回": "Le mot de passe du site principal se change dans config.env sur le serveur, pas via X", + "这个 X 今天重置得太频繁了,明天再来": "Trop de réinitialisations pour ce compte X aujourd'hui, reviens demain", + "口令至少 6 位,且两次一致": "Le mot de passe doit faire au moins 6 caractères et correspondre", + "口令已重置,其它设备上的登录已失效": "Mot de passe réinitialisé. Les autres appareils ont été déconnectés", + "X 用户名或口令不对": "Nom d'utilisateur X ou mot de passe incorrect", + "请先登录": "Connecte-toi d'abord", + "登录状态已失效,请重新登录。": "Ta session a expiré, reconnecte-toi.", + "歇一会儿再来。": "Fais une pause et reviens.", + "这个站点的错误口令太多,歇一会儿。": "Trop de mots de passe erronés pour ce bol. Fais une pause.", + "站点标题不能为空": "Le nom du bol ne peut pas être vide", + "资料里别放链接、联系方式": "Pas de liens ni de contacts dans ton profil", + "资料已保存": "Profil enregistré", + "主站的收款方式在服务器 config.env 里改": "Le mode de paiement du site principal se règle dans config.env sur le serveur", + "填一下币安 UID,不然钱没处去": "Entre ton UID Binance, sinon l'argent n'a nulle part où aller", + "已切换为直接转账:施主转完自报,你在这里确认": "Passé en virement direct : les donateurs signalent leur paiement et tu confirmes ici", + "本站不支持绑定": "La liaison n'est pas disponible sur ce site", + "API Key 和 Secret 都要填": "API Key et Secret sont tous deux requis", + "币安 UID 是纯数字(App 头像页可见)": "L'UID Binance ne contient que des chiffres (visible sur ta page de profil dans l'app)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Liée ! Binance a validé la Key ; les dons seront désormais confirmés automatiquement", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Déliée. Tu es en mode virement direct, vérifie que ton UID est bien renseigné", + "校验通过:币安 Key 可用,到账会自动确认": "Vérifié : la Key Binance fonctionne, les paiements seront confirmés automatiquement", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Le mot de passe du site principal se change dans config.env (ADMIN_PASSWORD) sur le serveur", + "口令已修改,其它设备上的登录已失效": "Mot de passe modifié. Les autres appareils ont été déconnectés", + "这笔施舍当前不能确认/拒绝": "Ce don ne peut pas être confirmé ou refusé pour le moment", + "只能回复自己站的施舍": "Tu ne peux répondre qu'aux dons de ton propre bol", + "回复里别放链接、联系方式": "Pas de liens ni de contacts dans les réponses", + "未知操作": "Action inconnue", + "无权操作": "Non autorisé", + "没有这个站": "Ce bol n'existe pas", + "未配置支付网关": "Aucune passerelle de paiement configurée", + "请求来源不对": "Origine de la requête incorrecte", + "请从本站页面操作。": "Utilise les pages du site.", + "页面渲染失败": "Échec du rendu de la page", + "稍后再试。": "Réessaie plus tard.", + "地址已被占用": "Adresse déjà prise", + "这个 X 账号已经开过站了": "Ce compte X a déjà un bol", + "连不上 X 接口: %w": "Impossible de joindre X : %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet introuvable (mauvais lien, ou tweet non public)", + "推文读不到(可能被删除或账号受保护)": "Impossible de lire le tweet (supprimé, ou compte protégé)", + "头像地址不在允许的域名": "L'URL de l'avatar n'est pas sur un domaine autorisé", + "头像下载失败": "Téléchargement de l'avatar échoué", + "头像不是有效图片": "L'avatar n'est pas une image valide", + "金额格式不对": "Montant invalide", + "收款链接过长": "Lien de réception trop long", + "收款链接须为 https 链接": "Le lien de réception doit être en https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Le lien de réception doit être un domaine Binance (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "Le lien de profil X doit ressembler à https://x.com/tonnom", + "核对成功,已到账": "Vérifié, paiement reçu", + "查到了这笔转账但金额不足,已按实付记账": "Virement trouvé mais montant insuffisant ; enregistré au montant réel", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Virement introuvable : vérifie le n° de commande et le compte destinataire, puis réessaie une fois que Binance l'affiche", + "这笔转账已经被别的订单用过了": "Ce virement a déjà été utilisé pour une autre commande", + "币种不对": "Mauvaise devise", + "这笔施舍当前状态不能回填": "L'état de ce don ne permet pas de renseigner un n° de commande", + "这个网络今天丢得够多了": "Ce réseau a assez lancé de jetons aujourd'hui", + "今天已经丢过了,明天再来": "Déjà lancé aujourd'hui, reviens demain", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "non payé", + "待确认": "en attente", + "已到账": "payé", + "已过期": "expiré", + "已关闭": "clôturé", + "已拒绝": "refusé", + "空碗未入帮": "Bol vide", + "一袋弟子": "Disciple à 1 sac", + "二袋弟子": "Disciple à 2 sacs", + "三袋弟子": "Disciple à 3 sacs", + "四袋弟子": "Disciple à 4 sacs", + "五袋弟子": "Disciple à 5 sacs", + "六袋弟子": "Disciple à 6 sacs", + "七袋弟子": "Disciple à 7 sacs", + "八袋弟子": "Disciple à 8 sacs", + "九袋长老": "Ancien à 9 sacs", + "帮主": "Maître de la guilde", + "副帮主": "Vice-maître", + "传功长老": "Ancien des enseignements", + "执法长老": "Ancien de la loi", + "掌棒龙头": "Gardien du bâton", + "掌钵龙头": "Gardien du bol", + "长老": "Ancien", + "舵主": "Chef de branche", + "弟子": "Disciple", + "总舵": "Quartier général", + "投了个硬币": "a lancé une pièce", + "善心人": "âme charitable", + "大善人": "grand bienfaiteur", + "活菩萨": "saint vivant", + "财神爷": "dieu de la fortune", + "刚刚": "à l'instant", + "%d 分钟前": "il y a %d min", + "%d 小时前": "il y a %d h", + "%d 天前": "il y a %d j", + } +} diff --git a/i18n_id.go b/i18n_id.go new file mode 100644 index 0000000..5b9ffc4 --- /dev/null +++ b/i18n_id.go @@ -0,0 +1,490 @@ +package main + +// 印尼语。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["id"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Pengemis Cyber", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Pengemis Cyber: kasihanilah, beri sesuap nasi. Sedekah lewat Binance Pay dan tinggalkan pesan di Buku Amal; bokek? lempar koin gratis; satu tweet di X langsung punya mangkuk sendiri.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Kasihanilah, beri sesuap nasi. Sedekah masuk Buku Amal; koin gratis pun tanda sayang.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Pengemis Cyber", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Kasihanilah, beri sesuap nasi. Sedekah lewat Binance Pay dan tinggalkan pesan di Buku Amal.", + "#赛博丐帮": "#PengemisCyber", + "(已屏蔽:%s)": "(disembunyikan: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Kembali ke jalanan", + "回到刚才看的碗": "Kembali ke mangkuk tadi", + "声音开关": "Tombol suara", + "声音": "Suara", + "排行榜": "Papan peringkat", + "我的后台": "Dasbor", + "站长": "Pemilik ", + "登录": "Masuk", + "我的站": "Mangkukku", + "开通要饭站": "Buka mangkuk", + "🙏 行行好,赏口饭吃": "🙏 Kasihanilah, beri sesuap nasi", + "🪙 一毛也是爱": "🪙 Seperak pun tanda sayang", + "💸 投币就上榜": "💸 Sedekah langsung masuk papan", + "📜 留一句话刻功德簿": "📜 Tinggalkan pesan di Buku Amal", + "🏚 发条推就能开自己的要饭站": "🏚 Satu tweet, mangkuk sendiri jadi", + "👾 赛博丐帮,人人有碗": "👾 Perguruan Pengemis Cyber: semua punya mangkuk", + "· 赛博丐帮,行行好": "· Perguruan Pengemis Cyber · Kasihanilah", + "作者": "Pembuat", + "收款由": "Pembayaran oleh", + "驱动 · 字体": "· Font", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Suara: mati", + "声音:开(点击静音)": "Suara: nyala (klik untuk bisukan)", + "点一下开始播放": "Ketuk untuk putar musik", + "已复制": "Tersalin", + "功德 +": "Amal +", + "你的名号和留言已刻上功德簿": "Nama dan pesanmu sudah terukir di Buku Amal", + "看看功德簿": "Lihat Buku Amal", + "分享卡片": "Kartu bagikan", + "已提交,等站长确认后上榜。本页会自动更新。": "Terkirim. Kamu masuk papan begitu pemilik mengonfirmasi. Halaman ini memperbarui diri otomatis.", + "这笔施舍已": "Sedekah ini sudah ", + "过期": "kedaluwarsa", + "下单失败": "gagal dibuat", + "被站长拒绝": "ditolak pemilik", + "关闭": "ditutup", + ",请回到页面重新投币。": ". Silakan kembali dan sedekah lagi.", + "没成功,再试试": "Belum berhasil, coba lagi", + "网络开小差了": "Jaringan lagi ngadat", + "分页": "Halaman", + "‹ 上一页": "‹ Sebelumnya", + "下一页 ›": "Berikutnya ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Masuk pemilik ·", + "🔑 站长登录": "🔑 Masuk pemilik", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Masuk dengan username X + kata sandi yang kamu buat saat membuka mangkuk. Pemilik situs utama: kosongkan username.", + "X 用户名": "Username X", + "例如 qianyuwing(主站留空)": "mis. qianyuwing (kosongkan untuk situs utama)", + "口令": "Kata sandi", + "忘了口令?": "Lupa kata sandi?", + "用 X 发推找回": "Pulihkan lewat tweet", + "。还没有要饭站?": ". Belum punya mangkuk?", + "用 X 开一个": "Buka satu dengan X", + // ---- 后台 ---- + "后台 ·": "Dasbor ·", + "🎉 开张大吉!你的要饭站": "🎉 Selamat buka lapak! Mangkukmu", + "已上线": "sudah tayang", + "(待主站站长收录后进榜)": " (masuk papan setelah pemilik situs utama menyetujuinya)", + "下一步:": "Berikutnya: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "isi UID Binance di bagian \"Pembayaran\" di bawah (sepuluh detik saja), kalau tidak, tak ada yang bisa mengirimimu uang.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Lain kali masuk lewat %s (username X %s + kata sandimu). Lupa? Pulihkan dengan tweet lagi.", + "后台": "dasbor", + "· 碗里": "· Isi mangkuk", + "位施主 ·": "dermawan ·", + "次 · 钢镚": "kali · koin", + "待收录": "belum disetujui", + "🔑 改口令": "🔑 Kata sandi", + "退出": "Keluar", + "⏳ 待确认": "⏳ Menunggu", + "✏️ 资料": "✏️ Profil", + "💰 收款方式": "💰 Pembayaran", + "📜 施舍记录": "📜 Sedekah", + "🏚 所有站点": "🏚 Semua mangkuk", + "🧹 留言巡查": "🧹 Pesan", + "⏳ 待确认的施舍": "⏳ Sedekah menunggu konfirmasi", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Cek transfer di aplikasi Binance (jumlah dan kode memo), lalu konfirmasi agar mereka masuk papan.", + "备注码": "Kode memo", + "· 币安订单": "· Order Binance", + "✓ 确认到账": "✓ Diterima", + "✗ 没收到": "✗ Belum diterima", + "站点标题": "Nama mangkuk", + "(来自 X @": "(dari X @", + ",锁定)": ", terkunci)", + "头像 emoji": "Emoji avatar", + "一句话口号": "Slogan satu baris", + "绑定 X": "Tautkan X", + "(主页链接或 @名字,留空不显示)": "(tautan profil atau @nama; kosongkan agar tidak tampil)", + "https://x.com/你的名字": "https://x.com/namamu", + "保存资料": "Simpan profil", + "config.env 配置": "diatur di config.env", + "已绑币安 Key · 自动确认": "Binance Key tertaut · konfirmasi otomatis", + "直接转账 · UID": "Transfer langsung · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Belum ada mangkuk — ketuk untuk atur", + "主站的收款方式在服务器 config.env 里配置。当前:": "Metode pembayaran situs utama diatur di config.env pada server. Saat ini: ", + "BinancePayTool 网关自动确认(默认账号)": "Gateway BinancePayTool konfirmasi otomatis (akun default)", + "直接转账": "transfer langsung", + "校验网关默认账号": "Verifikasi akun default gateway", + "✅ 已绑定币安账号(UID": "✅ Akun Binance tertaut (UID", + "),施主付款后": "). Sedekah akan ", + "自动确认上榜": "dikonfirmasi otomatis dan masuk papan", + "收银页会展示你的收款码 / 一键唤起。": " Panel pembayaran menampilkan kode QR-mu / buka aplikasi sekali ketuk.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Tambahkan tautan penerimaan agar dermawan bisa pindai QR / buka aplikasi sekali ketuk.", + "重新校验 Key": "Verifikasi ulang Key", + "解绑后改为直接转账(需你手动确认到账),确定?": "Melepas tautan akan beralih ke transfer langsung (kamu konfirmasi tiap pembayaran secara manual). Lanjut?", + "解绑": "Lepas tautan", + "换一个 Key / 更新收款链接": "Ganti Key / perbarui tautan penerimaan", + "当前是": "Mode saat ini: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Dermawan transfer ke UID-mu di aplikasi Binance, ketuk \"Sudah sedekah\", lalu kamu konfirmasi di sini agar mereka masuk papan.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Belum ada mangkuk: isi UID Binance dan kamu bisa terima uang. Sepuluh detik saja.", + "方式一:填币安 UID(最简单)": "Cara 1: isi UID Binance (paling gampang)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Aplikasi Binance → ketuk avatar di kiri atas, deretan angka di bawah avatar itulah", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (juga Pay ID-mu). Dermawan melihatnya saat sedekah, cukup masukkan di aplikasi Binance \"Pay → Transfer\" dan uang terkirim, tanpa biaya.", + "币安 UID": "UID Binance", + "例如 12345678": "mis. 12345678", + "收款链接": "Tautan penerimaan", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(opsional. Dengan ini dermawan bisa pindai QR / buka aplikasi Binance sekali ketuk; tanpa ini tetap bisa transfer lewat UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Cara dapat: di halaman terima uang aplikasi Binance ketuk \"Simpan gambar\", baca QR-nya dengan aplikasi pemindai apa saja, lalu tempel tautannya di sini.", + "保存": "Simpan", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Cara 2: tautkan API Key Binance baca-saja (konfirmasi otomatis)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Sedekah dikonfirmasi otomatis, kamu tak perlu cek manual. Key cukup izin \"Enable Reading\" dan tak bisa memindahkan dana; situs ini tak menyimpan Key, hanya gateway pembayaran yang menyimpannya terenkripsi.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "total · pesan iklan bisa disembunyikan atau orangnya diblokir (catatan tetap ada) · bisa dibalas", + "已屏蔽此人": "Pengguna diblokir", + "(已屏蔽:": "(disembunyikan: ", + "🥣 站长:": "🥣 Pemilik: ", + "恢复留言": "Tampilkan pesan", + "屏蔽留言": "Sembunyikan pesan", + "恢复此人": "Buka blokir", + "屏蔽此人": "Blokir orang ini", + "回一句…": "Balas…", + "回复": "Balas", + "还没有施舍记录": "Belum ada sedekah", + "🔑 修改口令": "🔑 Ganti kata sandi", + "新口令(至少 6 位)": "Kata sandi baru (min. 6 karakter)", + "再输一遍": "Ulangi lagi", + "改完后其它设备上的登录会失效。": "Perangkat lain akan otomatis keluar.", + "确认修改": "Ganti kata sandi", + "🏚 所有要饭站": "🏚 Semua mangkuk", + "个 · 违规可除名 · 可帮站长重置口令": "total · pelanggar bisa diusir · bisa reset kata sandi pemilik", + "已除名": "diusir", + "未收录": "belum disetujui", + "已绑 Key 自动确认": "Key tertaut, konfirmasi otomatis", + "位施主 · 钢镚": "dermawan · koin", + "开张": "dibuka", + "取消收录": "Cabut dari papan", + "收录上榜": "Masukkan ke papan", + "除名": "Usir", + "恢复": "Pulihkan", + "重置 /%s 的口令?新口令只显示一次。": "Reset kata sandi /%s? Kata sandi baru hanya ditampilkan sekali.", + "重置口令": "Reset kata sandi", + "还没有子站": "Belum ada mangkuk", + "🧹 全站最新留言": "🧹 Pesan terbaru seluruh situs", + "条 · 跨站点巡查广告": "total · patroli iklan lintas mangkuk", + "暂无留言": "Belum ada pesan", + "币安 App → 账户 → API 管理 → 创建 API:": "Aplikasi Binance → Akun → Manajemen API → Buat API: ", + "只勾「允许读取」": "centang hanya \"Enable Reading\"", + ",其它权限都不要,": ", jangan yang lain, ", + "不用设 IP 白名单": "tak perlu whitelist IP", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (Key baca-saja tak bisa memindahkan dana). Key hanya dipakai membaca riwayat uang masukmu, disimpan terenkripsi di server, tak pernah ditampilkan.", + "(App 头像页可见)": "(terlihat di halaman profil aplikasi)", + "(选填,填了施主能扫码)": "(opsional; dermawan bisa pindai QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Cara dapat tautan penerimaan: di halaman terima uang aplikasi Binance ketuk \"Simpan gambar\" lalu baca QR-nya dengan aplikasi pemindai apa saja.", + "绑定并校验": "Tautkan dan verifikasi", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Pulihkan kata sandi dengan X", + "🔑 用 X 找回口令": "🔑 Pulihkan kata sandi dengan X", + "🏚 开通我的要饭站": "🏚 Buka mangkukku", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Posting tweet berisi kode verifikasi untuk membuktikan kamu pemiliknya, lalu buat kata sandi baru.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Tak perlu sedekah dulu. Satu tweet dari akun X-mu langsung membuka mangkuk: namanya dari nama tampilan X, avatarnya dari X, satu akun X satu mangkuk. Tweet itu sekalian menaruh mangkukmu di jalanan.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Kamu sedang di browser dalam aplikasi. Tweet sekali ketuk mungkin tak membuka X, dan saat kembali progresmu bisa hilang.", + "建议点右上角「⋯」选「在浏览器中打开」": "Ketuk \"⋯\" di kanan atas lalu pilih \"Buka di browser\"", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (atau salin tautannya ke Safari / Chrome) sebelum lanjut.", + "复制本页链接": "Salin tautan halaman ini", + "发一条推文,带上验证码": "Posting tweet yang memuat kodenya", + "推文内容(可以随便改,只要保留验证码)": "Isi tweet (bebas diubah, asal kodenya tetap ada)", + "换一条": "Ganti kalimat", + "🐦 一键去 X 发推": "🐦 Posting di X", + "复制文案": "Salin teks", + "没拉起 X App?点这里用网页版发 →": "Aplikasi X tak terbuka? Posting lewat web →", + "验证码": "Kode", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "tidak peka huruf besar-kecil, berlaku 24 jam. Teksnya sudah memuat tautan mangkukmu, jadi tweet-nya sekalian promosi.", + "把推文链接贴回来": "Tempel tautan tweet-nya di sini", + "推文链接": "Tautan tweet", + "https://x.com/你的名字/status/1234567890": "https://x.com/namamu/status/1234567890", + "验证": "Verifikasi", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Setelah posting, ketuk tombol bagikan di tweet → Salin tautan.", + "还没开过站?": "Belum punya mangkuk? ", + "去开一个": "Buka satu", + "已经开过站?": "Sudah punya mangkuk? ", + "站长登录": "Masuk pemilik", + "🔑 设置新口令": "🔑 Buat kata sandi baru", + "保存并登录": "Simpan dan masuk", + "✅ X 验证通过": "✅ X terverifikasi", + "· 站名和头像来自 X(头像会定期同步)": "· nama dan avatar diambil dari X (avatar disinkronkan berkala)", + "站点地址": "Alamat mangkuk", + "(就是你的 X 用户名,不用填)": "(yaitu username X-mu, tak perlu diisi)", + "行行好,赏口饭吃 🙏": "Kasihanilah, beri sesuap nasi 🙏", + "登录口令": "Kata sandi masuk", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Nanti masuk dengan username X + kata sandi; lupa? Pulihkan dengan tweet lagi.", + "口令(至少 6 位)": "Kata sandi (min. 6 karakter)", + "开张 🏚": "Buka lapak 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Setelah buka, tautkan Binance Key atau isi UID di dasbor untuk terima uang. Isi situs tanggung jawabmu sendiri; mangkuk iklan diusir oleh perguruan.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Sedekah untuk %s", + "先回去看看": "Kembali dulu", + "给 %s 投币": "Sedekah untuk %s", + "金额要": "Jumlahnya harus ", + "一分不差": "persis", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": gateway mencocokkan lewat angka ekor unik ini, beberapa detik setelah transfer langsung terkonfirmasi", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Transfer langsung ke pemilik lewat Binance Pay, lalu ketuk \"Sudah sedekah\" di bawah", + "打开币安 App 转账": "Buka aplikasi Binance untuk transfer", + "唤起后手动输入金额": "Di aplikasi, masukkan jumlahnya", + ",备注填": ", memo", + "用另一台手机扫码": "Pindai dengan ponsel lain", + "收款二维码": "Kode QR pembayaran", + "币安 App → 首页「扫一扫」→ 输入金额": "Aplikasi Binance → Pindai → masukkan jumlah", + "或手动转账": "Atau transfer manual", + "转账信息": "Detail transfer", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Aplikasi Binance → \"Pay\" → \"Transfer\" → penerima: UID di bawah → jumlah", + "→ 备注填": "→ memo", + "→ 转完回来点「我已施舍」": "→ setelah transfer kembali dan ketuk \"Sudah sedekah\"", + "收款方": "Penerima", + "复制": "Salin", + "金额": "Jumlah", + "备注": "Memo", + "等待到账…转完自动确认,本页会自动更新": "Menunggu pembayaran… terkonfirmasi otomatis setelah terkirim; halaman ini memperbarui diri", + "付了但一直没确认?": "Sudah bayar tapi belum terkonfirmasi?", + "币安订单编号(18 位数字,转账详情里有)": "ID order Binance (18 digit, ada di detail transfer)", + "我付过了,帮我核对": "Sudah bayar, tolong cek", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "ID order Binance (opsional, 18 digit; mempercepat konfirmasi pemilik)", + "我已施舍,等站长确认": "Sudah sedekah, menunggu pemilik", + "「我已施舍」要在发起施舍的那台设备上点。": "Ketuk \"Sudah sedekah\" di perangkat yang memulai sedekah ini.", + "打不开?": "Tak bisa dibuka? ", + "用网关收银页支付": "Bayar lewat halaman kasir gateway", + "施舍进行中": "Sedekah sedang berjalan", + "🙏 谢谢施主": "🙏 Terima kasih, dermawan", + "你在 %s 的施主榜排第 %d 位": "Di papan dermawan %s kamu peringkat #%d", + "回到 %s 的碗": "Kembali ke mangkuk %s", + "复制链接分享": "Salin tautan untuk dibagikan", + "🖼 分享卡片": "🖼 Kartu bagikan", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Buat kartu piksel untuk dibagikan ke X atau teman-teman, sekalian bantu si pengemis promosi.", + "生成分享卡": "Buat kartu", + "分享卡": "Kartu bagikan", + "长按图片保存,或": "Tekan lama gambar untuk menyimpan, atau ", + "下载": "unduh", + "🏚 你也可以要饭": "🏚 Kamu juga bisa mengemis", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Satu tweet dari akun X-mu langsung membuka mangkuk sendiri; uangnya masuk langsung ke akun Binance-mu.", + "站长没有确认这笔施舍": "Pemilik tidak mengonfirmasi sedekah ini", + "这笔施舍已过期": "Sedekah ini sudah kedaluwarsa", + "如果你确实转了,请联系站长核对。": "Kalau kamu memang sudah transfer, hubungi pemilik untuk dicek.", + "没付款不扣钱;想施舍请重新来一次。": "Belum bayar berarti tak ada yang dipotong; mau sedekah, ulangi dari awal.", + "再来一次": "Coba lagi", + // ---- 排行榜 ---- + "排行榜 ·": "Papan peringkat ·", + "🏆 施主榜": "🏆 Dermawan", + "🥣 乞丐榜": "🥣 Pengemis", + "🪙 人气榜": "🪙 Popularitas", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · semua mangkuk digabung ·", + "位施主": "dermawan", + "总榜": "Sepanjang masa", + "本周": "Minggu ini", + "要到最多的要饭站 · 共": "Mangkuk yang paling banyak dapat ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Paling banyak koin (gratis) ·", + "← 回到刚才看的碗": "← Kembali ke mangkuk tadi", + "施主自己填的 X,未经验证": "X diisi sendiri oleh dermawan, belum diverifikasi", + "次 · 施舍过": "kali · pernah sedekah ke", + "个乞丐": "pengemis", + "榜上无人": "Belum ada siapa-siapa", + "就是我": "aku", + "还没有人上榜": "Belum ada yang masuk papan", + // ---- 站点页 ---- + "在要饭 ·": "sedang mengemis ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Mangkuk ini belum disetujui perguruan, jadi belum masuk papan.", + "主站站长审核后会收录。": "Pemilik situs utama akan menyetujuinya setelah ditinjau.", + "· 榜 #": "· Peringkat #", + "升%s要 %s": "→ %s butuh %s", + "满级": "Level maks", + "饱食度": "Kekenyangan", + "今天还没吃饭": "Hari ini belum makan", + "今天有人投币了": "Hari ini ada yang sedekah", + "今天丢过了": "Hari ini sudah lempar", + "丢个钢镚(免费)": "Lempar koin (gratis)", + "💸 投币施舍": "💸 Sedekah", + "还没摆碗,暂不能投币": "Belum ada mangkuk, belum bisa sedekah", + "去配置": "Atur sekarang", + "钢镚": "Koin", + "· 今日": "· hari ini", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 koin =", + "碗里已有": "Isi mangkuk", + "施主": "Dermawan", + "人": "", + "今日": "Hari ini", + "🕹️ 投币施舍": "🕹️ Masukkan koin", + "玩家名(上榜用,可留空)": "Nama pemain (untuk papan, boleh kosong)", + "匿名施主": "Dermawan anonim", + "你的 X(可选,显示头像)": "X-mu (opsional, untuk tampilkan avatar)", + "投多少": "Berapa", + "✏️ 自定义": "✏️ Bebas", + "输入金额,最多两位小数": "Masukkan jumlah, maks. 2 desimal", + "对乞丐喊话": "Bilang sesuatu ke pengemis", + "例如:别买烟了,去吃饭": "mis. Jangan beli rokok, beli makan", + "投币 💸": "Sedekah 💸", + "投币": "Sedekah", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Pindai dengan aplikasi Binance atau buka sekali ketuk; begitu diterima langsung terukir di Buku Amal.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Transfer langsung ke pemilik lewat Binance Pay; setelah pemilik mengonfirmasi, kamu masuk papan.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Min. %s, maks. %s. Pesan tak boleh berisi tautan atau kontak.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Pengemis ini belum menaruh mangkuk (belum atur pembayaran), jadi belum bisa terima uang.", + "去后台配置 →": "Atur di dasbor →", + "🏚 想自己要饭?": "🏚 Mau ikut mengemis?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Satu tweet dari akun X-mu langsung membuka mangkuk sendiri: alamat sendiri, mangkuk sendiri, Buku Amal dan papan dermawan sendiri, uang langsung masuk akun Binance-mu.", + "用 X 开通我的要饭站 →": "Buka mangkukku dengan X →", + "人气榜": "Popularitas", + "功德簿": "Buku Amal", + "施主榜": "Dermawan", + "乞丐榜": "Pengemis", + "已屏蔽的施主": "Dermawan diblokir", + "功德簿空空如也,第一枚硬币会刻在这里": "Buku Amal masih kosong. Koin pertama akan terukir di sini", + "HIGH SCORE · 给": "HIGH SCORE · penyumbang terbesar untuk", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 dermawan pertama 💎 sedekah terbesar 🔥 langganan", + "丐帮排名 · 要到最多的要饭站": "Peringkat perguruan · mangkuk yang paling banyak dapat", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popularitas · mangkuk dengan koin terbanyak (koin gratis, tak perlu bayar)", + "次": "kali", + "榜上无人,第一个投币的就是首席施主": "Belum ada siapa-siapa. Penyumbang pertama jadi dermawan utama", + "本站": "mangkuk ini", + "叮!钢镚 +1": "Ting! Koin +1", + "没丢进去": "Meleset dari mangkuk", + "网络开小差了,再试一次": "Jaringan lagi ngadat, coba lagi", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Jumlah tidak valid (maks. 2 desimal)", + "最少施舍 %s %s": "Sedekah minimal %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Sedekah maksimal %s %s. Kalau memang sebanyak itu, bagi jadi beberapa kali", + "支付网关开小差了:%s": "Gateway pembayaran lagi ngadat: %s", + "手速太快了": "Kecepatan", + "这个乞丐不在": "Pengemisnya tidak ada di sini", + "请先打开要饭页再丢": "Buka halaman mangkuknya dulu baru lempar", + "服务器开小差了": "Server lagi ngadat", + "手速太快了,歇一会儿": "Kecepatan, istirahat dulu", + "已提交,等站长确认": "Terkirim, menunggu konfirmasi pemilik", + "网关返回 %s": "Gateway membalas %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Aku lupa kata sandi mangkukku di %s, tweet ini bukti kalau ini aku 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Aku naruh mangkuk di %s 🥣 Kasihanilah, beri sesuap nasi~ %s #PengemisCyber %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Aku resmi gabung Perguruan Pengemis Cyber 🧎 Seperak pun tanda sayang, lempar koin gratis juga boleh 🪙 %s #PengemisCyber %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Berhenti kerja, banting setir jadi pengemis. Mangkuknya di sini, para dermawan kasihanilah 🥣 %s #PengemisCyber %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Perguruan pengemis buka pendaftaran, aku yang mulai duluan 🥣 Sedekah masuk Buku Amal, lempar koin gratis pun dihitung %s #PengemisCyber %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Tweet itu tidak memuat kode %s. Cek lagi apakah yang diposting sudah benar", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s sudah punya mangkuk: %s. Lupa kata sandi? Reset dengan X di halaman masuk.", + "@%s 已经开过站了": "@%s sudah punya mangkuk", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "Alamat %s sudah dipakai (@%s mungkin sudah punya mangkuk; lupa kata sandi? pulihkan dengan X di halaman masuk)", + "@%s 还没开过要饭站": "@%s belum punya mangkuk", + "解绑币安 Key 失败:%s": "Gagal melepas Binance Key: %s", + "绑定失败:%s": "Gagal menautkan: %s", + "解绑失败:%s": "Gagal melepas tautan: %s", + "校验失败:%s": "Verifikasi gagal: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Kata sandi /%s direset menjadi %s (hanya ditampilkan sekali, sampaikan ke pemiliknya)", + "本站未配置支付网关": "Gateway pembayaran belum diatur di situs ini", + "网关连不上,请稍后再试": "Gateway tidak bisa dihubungi, coba lagi nanti", + "方法不允许": "Metode tidak diizinkan", + "主站不存在": "Situs utama tidak ditemukan", + "页面不存在": "Halaman tidak ditemukan", + "赛博丐帮没有这条路。": "Tidak ada jalan ini di Perguruan Pengemis Cyber.", + "要么还没开张,要么已被丐帮除名。": "Belum dibuka, atau sudah diusir perguruan.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Pengemis ini belum menaruh mangkuk (belum atur pembayaran), belum bisa terima uang", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "Username X hanya boleh huruf, angka, dan garis bawah (dengan atau tanpa @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Jangan taruh tautan atau kontak di nama dan pesan. Pengemis tidak terima iklan", + "没有这笔施舍": "Sedekah tidak ditemukan", + "站点不存在": "Mangkuk tidak ditemukan", + "请在发起施舍的那台设备上点「我已施舍」": "Ketuk \"Sudah sedekah\" di perangkat yang memulai sedekah ini", + "币安订单编号是 18 位数字,不填也行": "ID order Binance terdiri dari 18 digit (opsional)", + "核对失败": "Pengecekan gagal", + "这笔施舍不是网关模式": "Sedekah ini tidak lewat gateway", + "试得太频繁了,一分钟后再试": "Terlalu sering mencoba, coba lagi semenit lagi", + "请在发起施舍的那台设备上回填": "Masukkan ID order dari perangkat yang memulai sedekah ini", + "币安订单编号是 18 位数字": "ID order Binance terdiri dari 18 digit", + "本站未开放开站": "Pembukaan mangkuk dimatikan di situs ini", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Kode sudah kedaluwarsa (atau dibuat di browser lain). Buat kode baru", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Tautan tweet tidak valid. Bentuknya seperti https://x.com/namamu/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Tweet itu lebih lama dari kodenya. Pakai tweet yang diposting setelah kode dibuat", + "验证已失效,请重新验证": "Verifikasi kedaluwarsa, silakan verifikasi ulang", + "口号和介绍里别放链接、联系方式": "Jangan taruh tautan atau kontak di slogan", + "口令至少 6 位": "Kata sandi minimal 6 karakter", + "两次口令不一致": "Kata sandi tidak cocok", + "主站口令在服务器 config.env 里改,不走 X 找回": "Kata sandi situs utama diatur di config.env pada server, bukan lewat X", + "这个 X 今天重置得太频繁了,明天再来": "Akun X ini terlalu sering reset hari ini, kembali besok", + "口令至少 6 位,且两次一致": "Kata sandi minimal 6 karakter dan harus cocok", + "口令已重置,其它设备上的登录已失效": "Kata sandi direset. Perangkat lain sudah dikeluarkan", + "X 用户名或口令不对": "Username X atau kata sandi salah", + "请先登录": "Silakan masuk dulu", + "登录状态已失效,请重新登录。": "Sesi kedaluwarsa, silakan masuk lagi.", + "歇一会儿再来。": "Istirahat dulu, nanti kembali.", + "这个站点的错误口令太多,歇一会儿。": "Terlalu banyak kata sandi salah untuk mangkuk ini. Istirahat dulu.", + "站点标题不能为空": "Nama mangkuk tidak boleh kosong", + "资料里别放链接、联系方式": "Jangan taruh tautan atau kontak di profil", + "资料已保存": "Profil tersimpan", + "主站的收款方式在服务器 config.env 里改": "Metode pembayaran situs utama diatur di config.env pada server", + "填一下币安 UID,不然钱没处去": "Isi UID Binance, kalau tidak uangnya tak tahu mau ke mana", + "已切换为直接转账:施主转完自报,你在这里确认": "Beralih ke transfer langsung: dermawan melapor sendiri, kamu konfirmasi di sini", + "本站不支持绑定": "Penautan tidak tersedia di situs ini", + "API Key 和 Secret 都要填": "API Key dan Secret keduanya wajib diisi", + "币安 UID 是纯数字(App 头像页可见)": "UID Binance hanya angka (terlihat di halaman profil aplikasi)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Tertaut! Binance memverifikasi Key-nya; mulai sekarang sedekah dikonfirmasi otomatis", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Tautan dilepas. Sekarang mode transfer langsung, pastikan UID-mu sudah diisi", + "校验通过:币安 Key 可用,到账会自动确认": "Terverifikasi: Binance Key berfungsi, pembayaran akan dikonfirmasi otomatis", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Kata sandi situs utama diatur di config.env (ADMIN_PASSWORD) pada server", + "口令已修改,其它设备上的登录已失效": "Kata sandi diganti. Perangkat lain sudah dikeluarkan", + "这笔施舍当前不能确认/拒绝": "Sedekah ini sedang tidak bisa dikonfirmasi/ditolak", + "只能回复自己站的施舍": "Hanya bisa membalas sedekah di mangkuk sendiri", + "回复里别放链接、联系方式": "Jangan taruh tautan atau kontak di balasan", + "未知操作": "Aksi tidak dikenal", + "无权操作": "Tidak diizinkan", + "没有这个站": "Mangkuk tidak ada", + "未配置支付网关": "Gateway pembayaran belum diatur", + "请求来源不对": "Asal permintaan tidak valid", + "请从本站页面操作。": "Gunakan halaman situs ini sendiri.", + "页面渲染失败": "Gagal merender halaman", + "稍后再试。": "Coba lagi nanti.", + "地址已被占用": "Alamat sudah dipakai", + "这个 X 账号已经开过站了": "Akun X ini sudah punya mangkuk", + "连不上 X 接口: %w": "Tidak bisa menghubungi X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet tidak ditemukan (tautan salah, atau tweet tidak publik)", + "推文读不到(可能被删除或账号受保护)": "Tweet tidak bisa dibaca (mungkin dihapus, atau akunnya terproteksi)", + "头像地址不在允许的域名": "URL avatar bukan dari domain yang diizinkan", + "头像下载失败": "Gagal mengunduh avatar", + "头像不是有效图片": "Avatar bukan gambar yang valid", + "金额格式不对": "Jumlah tidak valid", + "收款链接过长": "Tautan penerimaan terlalu panjang", + "收款链接须为 https 链接": "Tautan penerimaan harus https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Tautan penerimaan harus domain Binance (semacam app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "Tautan profil X bentuknya seperti https://x.com/namamu", + "核对成功,已到账": "Terverifikasi, pembayaran diterima", + "查到了这笔转账但金额不足,已按实付记账": "Transfer ditemukan tapi jumlahnya kurang; dicatat sesuai yang dibayar", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Transfer tidak ditemukan: cek ID order dan akun tujuannya, lalu coba lagi setelah masuk di Binance", + "这笔转账已经被别的订单用过了": "Transfer ini sudah dipakai order lain", + "币种不对": "Mata uang salah", + "这笔施舍当前状态不能回填": "Status sedekah ini tidak memungkinkan memasukkan ID order", + "这个网络今天丢得够多了": "Jaringan ini sudah cukup banyak lempar koin hari ini", + "今天已经丢过了,明天再来": "Hari ini sudah lempar, kembali besok", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "belum bayar", + "待确认": "menunggu", + "已到账": "diterima", + "已过期": "kedaluwarsa", + "已关闭": "ditutup", + "已拒绝": "ditolak", + "空碗未入帮": "Mangkuk kosong, belum masuk perguruan", + "一袋弟子": "Murid 1 Karung", + "二袋弟子": "Murid 2 Karung", + "三袋弟子": "Murid 3 Karung", + "四袋弟子": "Murid 4 Karung", + "五袋弟子": "Murid 5 Karung", + "六袋弟子": "Murid 6 Karung", + "七袋弟子": "Murid 7 Karung", + "八袋弟子": "Murid 8 Karung", + "九袋长老": "Tetua 9 Karung", + "帮主": "Ketua Perguruan", + "副帮主": "Wakil Ketua", + "传功长老": "Tetua Pewaris Ilmu", + "执法长老": "Tetua Penegak Hukum", + "掌棒龙头": "Kepala Tongkat", + "掌钵龙头": "Kepala Mangkuk", + "长老": "Tetua", + "舵主": "Kepala Cabang", + "弟子": "Murid", + "总舵": "Markas Besar", + "投了个硬币": "melempar sekeping koin", + "善心人": "orang baik", + "大善人": "dermawan besar", + "活菩萨": "malaikat hidup", + "财神爷": "dewa rezeki", + "刚刚": "baru saja", + "%d 分钟前": "%d mnt lalu", + "%d 小时前": "%d jam lalu", + "%d 天前": "%d hari lalu", + } +} diff --git a/i18n_ja.go b/i18n_ja.go new file mode 100644 index 0000000..863f4bc --- /dev/null +++ b/i18n_ja.go @@ -0,0 +1,490 @@ +package main + +// 日本語。key は中文原文(テンプレート/コードの T "…")、%s/%d の順序は中文と同じ。 +func init() { + translations["ja"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "サイバー物乞い", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "サイバー物乞い:お恵みを、一口だけでも。Binance Pay で投げ銭して功徳帳にひとこと残そう。お金がなくても無料コインを投げられる。X でツイート1本、自分の椀が持てる。", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "お恵みを、一口だけでも。投げ銭で功徳帳入り、無料コインだって愛。", + "%s:%s · 赛博要饭,行行好": "%s:%s · サイバー物乞い、お恵みを", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "お恵みを、一口だけでも。Binance Pay で投げ銭して功徳帳にひとこと残そう。", + "#赛博丐帮": "#サイバー丐幫", + "(已屏蔽:%s)": "(非表示:%s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "街に戻る", + "回到刚才看的碗": "さっき見ていた椀に戻る", + "声音开关": "サウンド切替", + "声音": "サウンド", + "排行榜": "ランキング", + "我的后台": "管理画面", + "站长": "オーナー", + "登录": "ログイン", + "我的站": "自分の椀", + "开通要饭站": "物乞いを始める", + "🙏 行行好,赏口饭吃": "🙏 お恵みを、一口だけでも", + "🪙 一毛也是爱": "🪙 一円だって愛", + "💸 投币就上榜": "💸 投げ銭でランキング入り", + "📜 留一句话刻功德簿": "📜 ひとこと残して功徳帳に刻む", + "🏚 发条推就能开自己的要饭站": "🏚 ツイート1本で自分の椀が持てる", + "👾 赛博丐帮,人人有碗": "👾 サイバー丐幫、誰にでも椀がある", + "· 赛博丐帮,行行好": "· サイバー丐幫 · お恵みを", + "作者": "作者", + "收款由": "決済は", + "驱动 · 字体": "提供 · フォント", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "サウンド:オフ", + "声音:开(点击静音)": "サウンド:オン(クリックでミュート)", + "点一下开始播放": "タップで音楽スタート", + "已复制": "コピーしました", + "功德 +": "功徳 +", + "你的名号和留言已刻上功德簿": "あなたの名前とメッセージを功徳帳に刻みました", + "看看功德簿": "功徳帳を見る", + "分享卡片": "シェアカード", + "已提交,等站长确认后上榜。本页会自动更新。": "送信しました。オーナーの確認後にランキングに載ります。このページは自動更新されます。", + "这笔施舍已": "この施しは", + "过期": "期限切れになりました", + "下单失败": "作成に失敗しました", + "被站长拒绝": "オーナーに拒否されました", + "关闭": "閉じられました", + ",请回到页面重新投币。": "。ページに戻ってもう一度投げ銭してください。", + "没成功,再试试": "失敗しました、もう一度", + "网络开小差了": "ネットワークが不調です", + "分页": "ページ送り", + "‹ 上一页": "‹ 前へ", + "下一页 ›": "次へ ›", + "页": "ページ", + // ---- 登录 ---- + "站长登录 ·": "オーナーログイン ·", + "🔑 站长登录": "🔑 オーナーログイン", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "「X ユーザー名 + 開店時に決めたパスワード」で管理画面にログイン。メインサイトのオーナーはユーザー名を空欄に。", + "X 用户名": "X ユーザー名", + "例如 qianyuwing(主站留空)": "例:qianyuwing(メインサイトは空欄)", + "口令": "パスワード", + "忘了口令?": "パスワードを忘れた?", + "用 X 发推找回": "X のツイートで再設定", + "。还没有要饭站?": "。まだ椀がない?", + "用 X 开一个": "X で開く", + // ---- 后台 ---- + "后台 ·": "管理画面 ·", + "🎉 开张大吉!你的要饭站": "🎉 開店おめでとう!あなたの椀", + "已上线": "が公開されました", + "(待主站站长收录后进榜)": "(メインサイトのオーナーが掲載を承認するとランキングに入ります)", + "下一步:": "次のステップ:", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "下の「受取方法」に Binance UID を入力してください(10秒で終わります)。入れないと誰もお金を送れません。", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "今後は %s から入ってください(X ユーザー名 %s + パスワード)。忘れたらもう一度ツイートで再設定できます。", + "后台": "管理画面", + "· 碗里": "· 椀の中", + "位施主 ·": "人の施主 ·", + "次 · 钢镚": "回 · コイン", + "待收录": "掲載待ち", + "🔑 改口令": "🔑 パスワード", + "退出": "ログアウト", + "⏳ 待确认": "⏳ 確認待ち", + "✏️ 资料": "✏️ プロフィール", + "💰 收款方式": "💰 受取方法", + "📜 施舍记录": "📜 施しの記録", + "🏚 所有站点": "🏚 全ての椀", + "🧹 留言巡查": "🧹 メッセージ巡回", + "⏳ 待确认的施舍": "⏳ 確認待ちの施し", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Binance アプリで入金(金額とメモコード)を確認してから承認すると、ランキングに載ります。", + "备注码": "メモコード", + "· 币安订单": "· Binance 注文", + "✓ 确认到账": "✓ 入金確認", + "✗ 没收到": "✗ 未着", + "站点标题": "椀の名前", + "(来自 X @": "(X @", + ",锁定)": " から取得、変更不可)", + "头像 emoji": "アバター絵文字", + "一句话口号": "ひとことスローガン", + "绑定 X": "X を連携", + "(主页链接或 @名字,留空不显示)": "(プロフィール URL か @名前。空欄なら非表示)", + "https://x.com/你的名字": "https://x.com/あなたの名前", + "保存资料": "プロフィールを保存", + "config.env 配置": "config.env で設定", + "已绑币安 Key · 自动确认": "Binance Key 連携済み · 自動確認", + "直接转账 · UID": "直接送金 · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ まだ椀がありません。タップして設定", + "主站的收款方式在服务器 config.env 里配置。当前:": "メインサイトの受取方法はサーバーの config.env で設定します。現在:", + "BinancePayTool 网关自动确认(默认账号)": "BinancePayTool ゲートウェイで自動確認(デフォルトアカウント)", + "直接转账": "直接送金", + "校验网关默认账号": "ゲートウェイのデフォルトアカウントを検証", + "✅ 已绑定币安账号(UID": "✅ Binance アカウント連携済み(UID", + "),施主付款后": ")。施主の支払い後は", + "自动确认上榜": "自動で確認してランキングに載ります", + "收银页会展示你的收款码 / 一键唤起。": " 支払い画面にあなたの受取 QR / ワンタップ起動が表示されます。", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " 受取リンクを追加すると、施主が QR スキャン / ワンタップで送れるようになります。", + "重新校验 Key": "Key を再検証", + "解绑后改为直接转账(需你手动确认到账),确定?": "解除すると直接送金モードになります(入金は手動確認)。よろしいですか?", + "解绑": "解除", + "换一个 Key / 更新收款链接": "Key を変更 / 受取リンクを更新", + "当前是": "現在は", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": "モードです。施主は Binance アプリであなたの UID 宛に送金して「施しました」をタップ、あなたが管理画面で確認するとランキングに載ります。", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ まだ椀がありません。Binance UID を入れるだけで受け取れます。10秒で終わります。", + "方式一:填币安 UID(最简单)": "方法1:Binance UID を入力(いちばん簡単)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Binance アプリ → 左上のアバターをタップ。その下の数字があなたの", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": "(Pay ID でもあります)。施主は投げ銭時にこれを見て、Binance アプリの「ペイ → 送金」で入力すれば手数料ゼロで送れます。", + "币安 UID": "Binance UID", + "例如 12345678": "例:12345678", + "收款链接": "受取リンク", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(任意。あると施主が QR スキャン / ワンタップで Binance アプリを起動できます。なくても UID 宛に送金できます)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "取得方法:Binance アプリの受取画面で「画像を保存」し、任意の QR リーダー(カメラや写真アプリでも可)で画像内のリンクを読み取ってここに貼り付けます。", + "保存": "保存", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "方法2:読み取り専用の Binance API Key を連携(入金を自動確認)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "施主の支払い後に自動でランキングに載り、手動確認は不要です。Key は「読み取りを有効化」の権限だけで、資金は動かせません。このサイトは Key を保存せず、決済ゲートウェイが暗号化して保管します。", + "共": "全", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "件 · スパムはメッセージ非表示か本人ブロック(記録は残ります)· 返信可", + "已屏蔽此人": "ブロック済み", + "(已屏蔽:": "(非表示:", + "🥣 站长:": "🥣 オーナー:", + "恢复留言": "メッセージを再表示", + "屏蔽留言": "メッセージを非表示", + "恢复此人": "ブロック解除", + "屏蔽此人": "この人をブロック", + "回一句…": "返信する…", + "回复": "返信", + "还没有施舍记录": "まだ施しの記録はありません", + "🔑 修改口令": "🔑 パスワード変更", + "新口令(至少 6 位)": "新しいパスワード(6文字以上)", + "再输一遍": "もう一度入力", + "改完后其它设备上的登录会失效。": "変更すると他の端末はログアウトされます。", + "确认修改": "変更する", + "🏚 所有要饭站": "🏚 全ての椀", + "个 · 违规可除名 · 可帮站长重置口令": "件 · 違反は除名可 · オーナーのパスワード再設定可", + "已除名": "除名済み", + "未收录": "未掲載", + "已绑 Key 自动确认": "Key 連携 · 自動確認", + "位施主 · 钢镚": "人の施主 · コイン", + "开张": "に開店", + "取消收录": "掲載取消", + "收录上榜": "掲載する", + "除名": "除名", + "恢复": "復帰", + "重置 /%s 的口令?新口令只显示一次。": "/%s のパスワードを再設定しますか?新しいパスワードは一度だけ表示されます。", + "重置口令": "パスワード再設定", + "还没有子站": "まだ椀はありません", + "🧹 全站最新留言": "🧹 全サイトの最新メッセージ", + "条 · 跨站点巡查广告": "件 · 全ての椀を横断してスパム巡回", + "暂无留言": "メッセージはまだありません", + "币安 App → 账户 → API 管理 → 创建 API:": "Binance アプリ → アカウント → API 管理 → API 作成:", + "只勾「允许读取」": "「読み取りを有効化」だけにチェック", + ",其它权限都不要,": "、他の権限は付けず、", + "不用设 IP 白名单": "IP ホワイトリストも不要", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": "(読み取り専用 Key では資金は動かせません)。Key は入金履歴の読み取りだけに使い、サーバー側で暗号化保存し、表示されることはありません。", + "(App 头像页可见)": "(アプリのプロフィール画面で確認できます)", + "(选填,填了施主能扫码)": "(任意。あると施主が QR スキャンできます)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "受取リンクの取得方法:Binance アプリの受取画面で「画像を保存」し、任意の QR リーダーで画像内のリンクを読み取ります。", + "绑定并校验": "連携して検証", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "X でパスワード再設定", + "🔑 用 X 找回口令": "🔑 X でパスワード再設定", + "🏚 开通我的要饭站": "🏚 自分の椀を開く", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "コード入りのツイートを投稿して本人確認すれば、パスワードを再設定できます。", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "施しは不要。X アカウントでツイート1本で開けます。椀の名前は X の表示名、アバターは X のアイコン、1アカウントにつき椀は1つ。ツイートがそのまま街での呼び込みになります。", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 アプリ内ブラウザで開いています。ワンタップ投稿で X が起動しなかったり、戻ってきたときに状態が消えることがあります。", + "建议点右上角「⋯」选「在浏览器中打开」": "右上の「⋯」から「ブラウザで開く」を選ぶ", + "(或复制链接到 Safari / Chrome 打开)再操作。": "(またはリンクをコピーして Safari / Chrome で開く)ことをおすすめします。", + "复制本页链接": "このページのリンクをコピー", + "发一条推文,带上验证码": "コード入りのツイートを投稿", + "推文内容(可以随便改,只要保留验证码)": "ツイート本文(自由に編集可。コードだけは残してください)", + "换一条": "別の文にする", + "🐦 一键去 X 发推": "🐦 X で投稿", + "复制文案": "本文をコピー", + "没拉起 X App?点这里用网页版发 →": "X アプリが開かない?ここからウェブ版で投稿 →", + "验证码": "コード", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "は大文字小文字を区別せず、24時間有効です。本文にはあなたの椀のリンクが入っているので、投稿がそのまま宣伝になります。", + "把推文链接贴回来": "ツイートのリンクを貼り付け", + "推文链接": "ツイートのリンク", + "https://x.com/你的名字/status/1234567890": "https://x.com/あなたの名前/status/1234567890", + "验证": "検証", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "投稿後、ツイートの共有ボタン → 「リンクをコピー」でOKです。", + "还没开过站?": "まだ椀がない?", + "去开一个": "開きに行く", + "已经开过站?": "もう椀を持っている?", + "站长登录": "オーナーログイン", + "🔑 设置新口令": "🔑 新しいパスワードを設定", + "保存并登录": "保存してログイン", + "✅ X 验证通过": "✅ X 認証済み", + "· 站名和头像来自 X(头像会定期同步)": "· 名前とアバターは X から取得(アバターは定期的に同期)", + "站点地址": "椀のアドレス", + "(就是你的 X 用户名,不用填)": "(X ユーザー名がそのまま使われます。入力不要)", + "行行好,赏口饭吃 🙏": "お恵みを、一口だけでも 🙏", + "登录口令": "ログインパスワード", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "今後は「X ユーザー名 + パスワード」で管理画面にログイン。忘れたらもう一度ツイートで再設定できます。", + "口令(至少 6 位)": "パスワード(6文字以上)", + "开张 🏚": "開店する 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "開店後、管理画面で Binance Key を連携するか UID を入力すれば受け取れます。内容は自己責任、スパムの椀は丐幫から除名されます。", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "%s に施す", + "先回去看看": "いったん戻る", + "给 %s 投币": "%s に投げ銭", + "金额要": "金額は", + "一分不差": "ぴったり", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": "に。ゲートウェイはこの固有の端数で自動照合し、送金後数秒で着金します", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Binance Pay でオーナーに直接送金し、送ったら下の「施しました」をタップ", + "打开币安 App 转账": "Binance アプリで送金", + "唤起后手动输入金额": "アプリで金額を入力:", + ",备注填": "、メモは", + "用另一台手机扫码": "別のスマホでスキャン", + "收款二维码": "受取 QR コード", + "币安 App → 首页「扫一扫」→ 输入金额": "Binance アプリ → 「スキャン」→ 金額を入力:", + "或手动转账": "または手動で送金", + "转账信息": "送金情報", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Binance アプリ → 下の「ペイ」→「送金」→ 受取人に下の UID を入力 → 金額は", + "→ 备注填": "→ メモは", + "→ 转完回来点「我已施舍」": "→ 送ったら戻って「施しました」をタップ", + "收款方": "受取人", + "复制": "コピー", + "金额": "金額", + "备注": "メモ", + "等待到账…转完自动确认,本页会自动更新": "入金待ち…送金後に自動確認、このページは自動更新されます", + "付了但一直没确认?": "払ったのに確認されない?", + "币安订单编号(18 位数字,转账详情里有)": "Binance 注文番号(18桁の数字、送金詳細に記載)", + "我付过了,帮我核对": "支払い済み、照合して", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Binance 注文番号(任意、18桁の数字。入れるとオーナーの確認が早くなります)", + "我已施舍,等站长确认": "施しました、オーナーの確認待ち", + "「我已施舍」要在发起施舍的那台设备上点。": "「施しました」は施しを始めた端末でタップしてください。", + "打不开?": "開けない?", + "用网关收银页支付": "ゲートウェイの決済ページで支払う", + "施舍进行中": "施し進行中", + "🙏 谢谢施主": "🙏 施主さま、ありがとう", + "你在 %s 的施主榜排第 %d 位": "あなたは %s の施主ランキングで %d 位です", + "回到 %s 的碗": "%s の椀に戻る", + "复制链接分享": "リンクをコピーしてシェア", + "🖼 分享卡片": "🖼 シェアカード", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "ピクセル風のシェア画像を作って X や友だちに送り、物乞いの宣伝も手伝ってあげよう。", + "生成分享卡": "シェアカードを作る", + "分享卡": "シェアカード", + "长按图片保存,或": "画像を長押しして保存、または", + "下载": "ダウンロード", + "🏚 你也可以要饭": "🏚 あなたも物乞いできる", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "X アカウントでツイート1本、自分の椀が持てます。もらったお金はそのままあなたの Binance アカウントへ。", + "站长没有确认这笔施舍": "オーナーはこの施しを確認しませんでした", + "这笔施舍已过期": "この施しは期限切れです", + "如果你确实转了,请联系站长核对。": "本当に送金した場合は、オーナーに連絡して確認してもらってください。", + "没付款不扣钱;想施舍请重新来一次。": "未払いなら請求はありません。施したい場合はもう一度どうぞ。", + "再来一次": "もう一度", + // ---- 排行榜 ---- + "排行榜 ·": "ランキング ·", + "🏆 施主榜": "🏆 施主", + "🥣 乞丐榜": "🥣 物乞い", + "🪙 人气榜": "🪙 人気", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · 全ての椀の合計 · 全", + "位施主": "人の施主", + "总榜": "総合", + "本周": "今週", + "要到最多的要饭站 · 共": "いちばん集めた椀 · 全", + "个": "件", + "收到钢镚最多(免费投)· 共": "コインをいちばん集めた(無料)· 全", + "← 回到刚才看的碗": "← さっき見ていた椀に戻る", + "施主自己填的 X,未经验证": "施主が自己申告した X、未検証", + "次 · 施舍过": "回 · 施した相手", + "个乞丐": "人", + "榜上无人": "まだ誰もいません", + "就是我": "自分", + "还没有人上榜": "まだ誰もランクインしていません", + // ---- 站点页 ---- + "在要饭 ·": "が物乞い中 ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ この椀はまだ丐幫に掲載されておらず、ランキングには入りません。", + "主站站长审核后会收录。": "メインサイトのオーナーが審査後に掲載します。", + "· 榜 #": "· 順位 #", + "升%s要 %s": "%s は EXP %s から", + "满级": "最大レベル", + "饱食度": "満腹度", + "今天还没吃饭": "今日はまだ何も食べていない", + "今天有人投币了": "今日は投げ銭あり", + "今天丢过了": "今日はもう投げた", + "丢个钢镚(免费)": "コインを投げる(無料)", + "💸 投币施舍": "💸 投げ銭", + "还没摆碗,暂不能投币": "まだ椀がないので投げ銭できません", + "去配置": "設定する", + "钢镚": "コイン", + "· 今日": "· 今日", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · コイン1枚 =", + "碗里已有": "椀の中", + "施主": "施主", + "人": "人", + "今日": "今日", + "🕹️ 投币施舍": "🕹️ コインを入れる", + "玩家名(上榜用,可留空)": "プレイヤー名(ランキング用、空欄可)", + "匿名施主": "匿名の施主", + "你的 X(可选,显示头像)": "あなたの X(任意、アバター表示用)", + "投多少": "いくら投げる", + "✏️ 自定义": "✏️ 自由入力", + "输入金额,最多两位小数": "金額を入力(小数点以下2桁まで)", + "对乞丐喊话": "物乞いにひとこと", + "例如:别买烟了,去吃饭": "例:タバコはやめて、ご飯を食べな", + "投币 💸": "投げ銭 💸", + "投币": "投げ銭", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Binance アプリで QR スキャン / ワンタップ支払い。着金すると自動で功徳帳に刻まれます。", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Binance Pay でオーナーに直接送金。送信後、オーナーが確認するとランキングに載ります。", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "最小 %s、最大 %s。メッセージにリンクや連絡先は入れられません。", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "この物乞いはまだ椀を出していません(受取方法が未設定)。今はお金を受け取れません。", + "去后台配置 →": "管理画面で設定 →", + "🏚 想自己要饭?": "🏚 自分も物乞いしたい?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "X アカウントでツイート1本、自分の椀が持てます。専用アドレス、自分の椀、功徳帳と施主ランキング付き。お金はそのままあなたの Binance アカウントへ。", + "用 X 开通我的要饭站 →": "X で自分の椀を開く →", + "人气榜": "人気", + "功德簿": "功徳帳", + "施主榜": "施主", + "乞丐榜": "物乞い", + "已屏蔽的施主": "ブロック済みの施主", + "功德簿空空如也,第一枚硬币会刻在这里": "功徳帳はまだ空っぽ。最初のコインがここに刻まれます", + "HIGH SCORE · 给": "HIGH SCORE ·", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "に最も投げ銭した人 · 🏁 最初の施主 💎 最高額 🔥 常連", + "丐帮排名 · 要到最多的要饭站": "丐幫ランキング · いちばん集めた椀", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "人気ランキング · コインをいちばん集めた椀(コインは無料)", + "次": "回", + "榜上无人,第一个投币的就是首席施主": "まだ誰もいません。最初に投げた人が筆頭施主になります", + "本站": "この椀", + "叮!钢镚 +1": "チャリン!コイン +1", + "没丢进去": "椀に入らなかった", + "网络开小差了,再试一次": "ネットワークが不調です、もう一度", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "金額の形式が正しくありません(小数点以下2桁まで)", + "最少施舍 %s %s": "最小 %s %s", + "最多施舍 %s %s,真有这么多请分几次": "最大 %s %s。本当にそんなにあるなら何回かに分けてください", + "支付网关开小差了:%s": "決済ゲートウェイが不調です:%s", + "手速太快了": "速すぎます", + "这个乞丐不在": "この物乞いはいません", + "请先打开要饭页再丢": "先に椀のページを開いてください", + "服务器开小差了": "サーバーが不調です", + "手速太快了,歇一会儿": "速すぎます、少し休んで", + "已提交,等站长确认": "送信しました、オーナーの確認待ち", + "网关返回 %s": "ゲートウェイの応答:%s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "「%s」で物乞い中の椀のパスワードを忘れたので、本人証明のツイート 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "「%s」に椀を置きました 🥣 お恵みを、一口だけでも〜 %s #サイバー丐幫 %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "サイバー丐幫に入門、本日より物乞い開業 🧎 一円だって愛、無料コインでもOK 🪙 %s #サイバー丐幫 %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "仕事を辞めて物乞いに転職。椀はここ、善き人よお恵みを 🥣 %s #サイバー丐幫 %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "丐幫メンバー募集中、まず自分から物乞い 🥣 投げ銭した人は功徳帳入り、無料コインでも可 %s #サイバー丐幫 %s", + "这条推文里没有验证码 %s,请检查是否发对了": "このツイートにコード %s が含まれていません。正しいツイートか確認してください", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s はすでに椀を持っています:%s。パスワードを忘れたらログインページから X で再設定できます。", + "@%s 已经开过站了": "@%s はすでに椀を持っています", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "アドレス %s は使用中です(@%s がすでに椀を持っているかも。パスワードを忘れたらログインページから X で再設定)", + "@%s 还没开过要饭站": "@%s はまだ椀を持っていません", + "解绑币安 Key 失败:%s": "Binance Key の解除に失敗:%s", + "绑定失败:%s": "連携に失敗:%s", + "解绑失败:%s": "解除に失敗:%s", + "校验失败:%s": "検証に失敗:%s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "/%s のパスワードを %s に再設定しました(一度だけ表示。オーナーに伝えてください)", + "本站未配置支付网关": "決済ゲートウェイが未設定です", + "网关连不上,请稍后再试": "ゲートウェイに接続できません。後でもう一度", + "方法不允许": "許可されていないメソッドです", + "主站不存在": "メインサイトが見つかりません", + "页面不存在": "ページが見つかりません", + "赛博丐帮没有这条路。": "サイバー丐幫にこんな道はありません。", + "要么还没开张,要么已被丐帮除名。": "まだ開店していないか、丐幫から除名されています。", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "この物乞いはまだ椀を出していません(受取方法が未設定)。今はお金を受け取れません", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "X ユーザー名は英数字とアンダースコアのみ(@ はなくても可)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "名前やメッセージにリンクや連絡先は入れないでください。物乞いは広告お断り", + "没有这笔施舍": "その施しは見つかりません", + "站点不存在": "椀が見つかりません", + "请在发起施舍的那台设备上点「我已施舍」": "施しを始めた端末で「施しました」をタップしてください", + "币安订单编号是 18 位数字,不填也行": "Binance 注文番号は18桁の数字です(任意)", + "核对失败": "照合に失敗", + "这笔施舍不是网关模式": "この施しはゲートウェイモードではありません", + "试得太频繁了,一分钟后再试": "試行が多すぎます。1分後にもう一度", + "请在发起施舍的那台设备上回填": "施しを始めた端末から注文番号を送信してください", + "币安订单编号是 18 位数字": "Binance 注文番号は18桁の数字です", + "本站未开放开站": "このサイトでは椀の新規開設を受け付けていません", + "验证码已失效(或不是本浏览器生成的),请重新生成": "コードが無効です(期限切れか、別のブラウザで生成されたもの)。再生成してください", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "ツイートのリンクが正しくありません。https://x.com/あなたの名前/status/1234567890 の形式で", + "这条推文比验证码还早,请用生成验证码之后发的推文": "このツイートはコード生成より前のものです。コード生成後に投稿したツイートを使ってください", + "验证已失效,请重新验证": "認証の期限が切れました。もう一度認証してください", + "口号和介绍里别放链接、联系方式": "スローガンにリンクや連絡先は入れないでください", + "口令至少 6 位": "パスワードは6文字以上", + "两次口令不一致": "パスワードが一致しません", + "主站口令在服务器 config.env 里改,不走 X 找回": "メインサイトのパスワードはサーバーの config.env で変更します。X での再設定は使えません", + "这个 X 今天重置得太频繁了,明天再来": "この X アカウントは今日の再設定回数が上限です。明日また", + "口令至少 6 位,且两次一致": "パスワードは6文字以上で、2回とも同じにしてください", + "口令已重置,其它设备上的登录已失效": "パスワードを再設定しました。他の端末はログアウトされました", + "X 用户名或口令不对": "X ユーザー名かパスワードが違います", + "请先登录": "ログインしてください", + "登录状态已失效,请重新登录。": "セッションが切れました。もう一度ログインしてください。", + "歇一会儿再来。": "少し休んでからまた来てください。", + "这个站点的错误口令太多,歇一会儿。": "この椀へのパスワード誤りが多すぎます。少し休んでください。", + "站点标题不能为空": "椀の名前は空にできません", + "资料里别放链接、联系方式": "プロフィールにリンクや連絡先は入れないでください", + "资料已保存": "プロフィールを保存しました", + "主站的收款方式在服务器 config.env 里改": "メインサイトの受取方法はサーバーの config.env で変更します", + "填一下币安 UID,不然钱没处去": "Binance UID を入力してください。ないとお金の行き先がありません", + "已切换为直接转账:施主转完自报,你在这里确认": "直接送金に切り替えました。施主が送金を自己申告し、あなたがここで確認します", + "本站不支持绑定": "このサイトでは連携できません", + "API Key 和 Secret 都要填": "API Key と Secret の両方が必要です", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID は数字のみです(アプリのプロフィール画面で確認できます)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "連携完了!Binance の検証に通りました。今後の施しは自動で確認されランキングに載ります", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "解除しました。現在は直接送金モードです。UID を忘れずに入力してください", + "校验通过:币安 Key 可用,到账会自动确认": "検証OK:Binance Key は有効です。入金は自動確認されます", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "メインサイトのパスワードはサーバーの config.env(ADMIN_PASSWORD)で変更します", + "口令已修改,其它设备上的登录已失效": "パスワードを変更しました。他の端末はログアウトされました", + "这笔施舍当前不能确认/拒绝": "この施しは今は承認/拒否できません", + "只能回复自己站的施舍": "返信できるのは自分の椀への施しだけです", + "回复里别放链接、联系方式": "返信にリンクや連絡先は入れないでください", + "未知操作": "不明な操作です", + "无权操作": "権限がありません", + "没有这个站": "その椀はありません", + "未配置支付网关": "決済ゲートウェイが未設定です", + "请求来源不对": "リクエスト元が正しくありません", + "请从本站页面操作。": "このサイトのページから操作してください。", + "页面渲染失败": "ページの描画に失敗しました", + "稍后再试。": "後でもう一度お試しください。", + "地址已被占用": "アドレスは使用中です", + "这个 X 账号已经开过站了": "この X アカウントはすでに椀を持っています", + "连不上 X 接口: %w": "X に接続できません: %w", + "找不到这条推文(链接不对,或推文不公开)": "ツイートが見つかりません(リンク違いか、非公開)", + "推文读不到(可能被删除或账号受保护)": "ツイートを読めません(削除済みか、鍵アカウント)", + "头像地址不在允许的域名": "アバターの URL が許可ドメイン外です", + "头像下载失败": "アバターのダウンロードに失敗しました", + "头像不是有效图片": "アバターが有効な画像ではありません", + "金额格式不对": "金額の形式が正しくありません", + "收款链接过长": "受取リンクが長すぎます", + "收款链接须为 https 链接": "受取リンクは https で始まる必要があります", + "收款链接必须是币安域名(app.binance.com/… 之类)": "受取リンクは Binance のドメイン(app.binance.com/… など)である必要があります", + "X 主页链接应形如 https://x.com/你的名字": "X プロフィールのリンクは https://x.com/あなたの名前 の形式で", + "核对成功,已到账": "照合OK、入金済みです", + "查到了这笔转账但金额不足,已按实付记账": "送金は見つかりましたが金額が不足しています。実際の額で記録しました", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "送金が見つかりません。注文番号と送金先アカウントを確認し、Binance で着金してからもう一度", + "这笔转账已经被别的订单用过了": "この送金はすでに別の注文で使われています", + "币种不对": "通貨が違います", + "这笔施舍当前状态不能回填": "この施しの状態では注文番号を送信できません", + "这个网络今天丢得够多了": "このネットワークからは今日はもう十分投げました", + "今天已经丢过了,明天再来": "今日はもう投げました。明日また", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "未払い", + "待确认": "確認待ち", + "已到账": "入金済み", + "已过期": "期限切れ", + "已关闭": "終了", + "已拒绝": "拒否", + "空碗未入帮": "空の椀・未入門", + "一袋弟子": "一袋弟子", + "二袋弟子": "二袋弟子", + "三袋弟子": "三袋弟子", + "四袋弟子": "四袋弟子", + "五袋弟子": "五袋弟子", + "六袋弟子": "六袋弟子", + "七袋弟子": "七袋弟子", + "八袋弟子": "八袋弟子", + "九袋长老": "九袋長老", + "帮主": "幫主", + "副帮主": "副幫主", + "传功长老": "伝功長老", + "执法长老": "執法長老", + "掌棒龙头": "掌棒竜頭", + "掌钵龙头": "掌鉢竜頭", + "长老": "長老", + "舵主": "舵主", + "弟子": "弟子", + "总舵": "総舵", + "投了个硬币": "コイン一枚", + "善心人": "善き人", + "大善人": "大旦那", + "活菩萨": "生き仏", + "财神爷": "福の神", + "刚刚": "たった今", + "%d 分钟前": "%d 分前", + "%d 小时前": "%d 時間前", + "%d 天前": "%d 日前", + } +} diff --git a/i18n_ko.go b/i18n_ko.go new file mode 100644 index 0000000..1c31b6b --- /dev/null +++ b/i18n_ko.go @@ -0,0 +1,490 @@ +package main + +// 한국어. key 는 중국어 원문(템플릿/코드의 T "…"), %s/%d 순서는 중국어와 동일. +func init() { + translations["ko"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "사이버 거지", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "사이버 거지: 한 푼만 적선해 주세요. Binance Pay로 적선하고 공덕부에 한마디 남기기. 돈이 없으면 무료 동전이라도. X에 트윗 한 번이면 내 그릇도 열 수 있어요.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "한 푼만 적선해 주세요. 적선하면 공덕부에 이름이 오르고, 무료 동전도 사랑이에요.", + "%s:%s · 赛博要饭,行行好": "%s: %s · 사이버 거지, 한 푼만 적선해 주세요", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "한 푼만 적선해 주세요. Binance Pay로 적선하고 공덕부에 한마디 남기기.", + "#赛博丐帮": "#사이버개방", + "(已屏蔽:%s)": "(숨김: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "거리로 돌아가기", + "回到刚才看的碗": "아까 보던 그릇으로", + "声音开关": "소리 켜기/끄기", + "声音": "소리", + "排行榜": "랭킹", + "我的后台": "내 관리실", + "站长": "주인 ", + "登录": "로그인", + "我的站": "내 그릇", + "开通要饭站": "동냥 시작하기", + "🙏 行行好,赏口饭吃": "🙏 한 푼만 적선해 주세요", + "🪙 一毛也是爱": "🪙 한 푼도 사랑이에요", + "💸 投币就上榜": "💸 적선하면 랭킹 등록", + "📜 留一句话刻功德簿": "📜 공덕부에 한마디 새기기", + "🏚 发条推就能开自己的要饭站": "🏚 트윗 한 번이면 내 그릇이 생겨요", + "👾 赛博丐帮,人人有碗": "👾 사이버 개방, 누구나 그릇 하나쯤은", + "· 赛博丐帮,行行好": "· 사이버 개방 · 한 푼만 적선해 주세요", + "作者": "만든 사람", + "收款由": "결제는", + "驱动 · 字体": "제공 · 폰트", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "소리: 꺼짐", + "声音:开(点击静音)": "소리: 켜짐 (클릭하면 음소거)", + "点一下开始播放": "탭해서 음악 켜기", + "已复制": "복사됨", + "功德 +": "공덕 +", + "你的名号和留言已刻上功德簿": "당신의 이름과 한마디가 공덕부에 새겨졌어요", + "看看功德簿": "공덕부 보기", + "分享卡片": "공유 카드", + "已提交,等站长确认后上榜。本页会自动更新。": "제출했어요. 주인이 확인하면 랭킹에 올라갑니다. 이 페이지는 자동으로 갱신돼요.", + "这笔施舍已": "이 적선은 ", + "过期": "만료되었어요", + "下单失败": "주문 생성에 실패했어요", + "被站长拒绝": "주인에게 거절되었어요", + "关闭": "닫혔어요", + ",请回到页面重新投币。": ". 페이지로 돌아가 다시 적선해 주세요.", + "没成功,再试试": "실패했어요, 다시 해보세요", + "网络开小差了": "네트워크가 잠깐 딴짓 중", + "分页": "페이지 이동", + "‹ 上一页": "‹ 이전", + "下一页 ›": "다음 ›", + "页": "페이지", + // ---- 登录 ---- + "站长登录 ·": "주인 로그인 ·", + "🔑 站长登录": "🔑 주인 로그인", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "「X 사용자명 + 그릇을 열 때 정한 비밀번호」로 관리실에 로그인하세요. 메인 사이트 주인은 사용자명을 비워 두세요.", + "X 用户名": "X 사용자명", + "例如 qianyuwing(主站留空)": "예: qianyuwing (메인 사이트는 비워 두기)", + "口令": "비밀번호", + "忘了口令?": "비밀번호를 잊으셨나요?", + "用 X 发推找回": "X 트윗으로 찾기", + "。还没有要饭站?": ". 아직 그릇이 없나요?", + "用 X 开一个": "X로 하나 열기", + // ---- 后台 ---- + "后台 ·": "관리실 ·", + "🎉 开张大吉!你的要饭站": "🎉 개업 축하! 당신의 그릇", + "已上线": "이 열렸어요", + "(待主站站长收录后进榜)": " (메인 사이트 주인이 등록하면 랭킹에 들어가요)", + "下一步:": "다음 단계: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "아래 「수금 방법」에 Binance UID를 입력하세요 (10초면 끝). 안 하면 아무도 돈을 보낼 수 없어요.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "다음부터는 %s 로 들어오세요 (X 사용자명 %s + 비밀번호). 잊어버리면 트윗으로 다시 찾을 수 있어요.", + "后台": "관리실", + "· 碗里": "· 그릇 안", + "位施主 ·": "명의 시주 ·", + "次 · 钢镚": "회 · 동전", + "待收录": "등록 대기", + "🔑 改口令": "🔑 비밀번호", + "退出": "로그아웃", + "⏳ 待确认": "⏳ 확인 대기", + "✏️ 资料": "✏️ 프로필", + "💰 收款方式": "💰 수금 방법", + "📜 施舍记录": "📜 적선 기록", + "🏚 所有站点": "🏚 모든 그릇", + "🧹 留言巡查": "🧹 한마디 순찰", + "⏳ 待确认的施舍": "⏳ 확인 대기 중인 적선", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Binance 앱에서 입금(금액과 메모 코드)을 확인한 뒤 승인하면 랭킹에 올라가요.", + "备注码": "메모 코드", + "· 币安订单": "· Binance 주문", + "✓ 确认到账": "✓ 입금 확인", + "✗ 没收到": "✗ 못 받음", + "站点标题": "그릇 이름", + "(来自 X @": "(X @", + ",锁定)": " 에서 가져옴, 잠김)", + "头像 emoji": "아바타 이모지", + "一句话口号": "한 줄 슬로건", + "绑定 X": "X 연결", + "(主页链接或 @名字,留空不显示)": "(프로필 링크 또는 @이름, 비우면 표시 안 함)", + "https://x.com/你的名字": "https://x.com/내이름", + "保存资料": "프로필 저장", + "config.env 配置": "config.env 에서 설정", + "已绑币安 Key · 自动确认": "Binance Key 연결됨 · 자동 확인", + "直接转账 · UID": "직접 송금 · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ 아직 그릇이 없어요, 눌러서 설정", + "主站的收款方式在服务器 config.env 里配置。当前:": "메인 사이트의 수금 방법은 서버의 config.env 에서 설정해요. 현재: ", + "BinancePayTool 网关自动确认(默认账号)": "BinancePayTool 게이트웨이 자동 확인 (기본 계정)", + "直接转账": "직접 송금", + "校验网关默认账号": "게이트웨이 기본 계정 검증", + "✅ 已绑定币安账号(UID": "✅ Binance 계정 연결됨 (UID", + "),施主付款后": "). 시주가 결제하면 ", + "自动确认上榜": "자동으로 확인되어 랭킹에 올라가요", + "收银页会展示你的收款码 / 一键唤起。": " 결제 화면에 당신의 수금 QR / 원터치 열기가 표시돼요.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " 수금 링크를 추가하면 시주가 QR 스캔 / 원터치로 보낼 수 있어요.", + "重新校验 Key": "Key 다시 검증", + "解绑后改为直接转账(需你手动确认到账),确定?": "연결을 해제하면 직접 송금 모드가 돼요 (입금을 직접 확인해야 함). 계속할까요?", + "解绑": "연결 해제", + "换一个 Key / 更新收款链接": "Key 변경 / 수금 링크 갱신", + "当前是": "현재 ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": " 모드예요. 시주가 Binance 앱에서 당신의 UID로 송금하고 「적선했어요」를 누르면, 관리실에서 확인 후 랭킹에 올라가요.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ 아직 그릇이 없어요: Binance UID만 입력하면 돈을 받을 수 있어요. 10초면 끝.", + "方式一:填币安 UID(最简单)": "방법 1: Binance UID 입력 (가장 간단)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Binance 앱 → 왼쪽 위 아바타 탭, 그 아래 숫자가 바로 당신의", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (Pay ID이기도 해요). 시주는 적선할 때 이걸 보고 Binance 앱 「페이 → 송금」에 입력하면 수수료 없이 보낼 수 있어요.", + "币安 UID": "Binance UID", + "例如 12345678": "예: 12345678", + "收款链接": "수금 링크", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(선택. 있으면 시주가 QR 스캔 / 원터치로 Binance 앱을 열 수 있고, 없어도 UID로 송금할 수 있어요)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "얻는 법: Binance 앱 수금 화면에서 「이미지 저장」 후, 아무 QR 인식 앱(카메라, 사진 앱도 가능)으로 이미지 속 링크를 읽어 여기에 붙여 넣으세요.", + "保存": "저장", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "방법 2: 읽기 전용 Binance API Key 연결 (입금 자동 확인)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "시주가 결제하면 자동으로 랭킹에 올라가고, 직접 확인할 필요가 없어요. Key는 「읽기 활성화」 권한만 있으면 되고 자금은 옮길 수 없어요. 이 사이트는 Key를 저장하지 않고 결제 게이트웨이가 암호화해 보관해요.", + "共": "총", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "건 · 광고는 한마디 숨기기 또는 사용자 차단 (기록은 유지) · 답글 가능", + "已屏蔽此人": "차단된 사용자", + "(已屏蔽:": "(숨김: ", + "🥣 站长:": "🥣 주인: ", + "恢复留言": "한마디 다시 표시", + "屏蔽留言": "한마디 숨기기", + "恢复此人": "차단 해제", + "屏蔽此人": "이 사람 차단", + "回一句…": "답글 달기…", + "回复": "답글", + "还没有施舍记录": "아직 적선 기록이 없어요", + "🔑 修改口令": "🔑 비밀번호 변경", + "新口令(至少 6 位)": "새 비밀번호 (6자 이상)", + "再输一遍": "한 번 더 입력", + "改完后其它设备上的登录会失效。": "변경하면 다른 기기에서는 로그아웃돼요.", + "确认修改": "변경하기", + "🏚 所有要饭站": "🏚 모든 그릇", + "个 · 违规可除名 · 可帮站长重置口令": "개 · 규칙 위반 시 제명 · 주인의 비밀번호 재설정 가능", + "已除名": "제명됨", + "未收录": "미등록", + "已绑 Key 自动确认": "Key 연결, 자동 확인", + "位施主 · 钢镚": "명의 시주 · 동전", + "开张": " 개업", + "取消收录": "등록 취소", + "收录上榜": "등록하기", + "除名": "제명", + "恢复": "복구", + "重置 /%s 的口令?新口令只显示一次。": "/%s 의 비밀번호를 재설정할까요? 새 비밀번호는 한 번만 표시돼요.", + "重置口令": "비밀번호 재설정", + "还没有子站": "아직 그릇이 없어요", + "🧹 全站最新留言": "🧹 전체 최신 한마디", + "条 · 跨站点巡查广告": "건 · 모든 그릇의 광고 순찰", + "暂无留言": "아직 한마디가 없어요", + "币安 App → 账户 → API 管理 → 创建 API:": "Binance 앱 → 계정 → API 관리 → API 생성: ", + "只勾「允许读取」": "「읽기 활성화」만 체크", + ",其它权限都不要,": ", 다른 권한은 주지 말고, ", + "不用设 IP 白名单": "IP 화이트리스트도 필요 없어요", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (읽기 전용 Key로는 자금을 옮길 수 없어요). Key는 입금 내역을 읽는 데만 쓰이고, 서버에 암호화 저장되며 절대 표시되지 않아요.", + "(App 头像页可见)": "(앱 프로필 화면에서 볼 수 있어요)", + "(选填,填了施主能扫码)": "(선택, 있으면 시주가 QR을 스캔할 수 있어요)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "수금 링크 얻는 법: Binance 앱 수금 화면에서 「이미지 저장」 후, 아무 QR 인식 앱으로 이미지 속 링크를 읽으세요.", + "绑定并校验": "연결하고 검증", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "X로 비밀번호 찾기", + "🔑 用 X 找回口令": "🔑 X로 비밀번호 찾기", + "🏚 开通我的要饭站": "🏚 내 그릇 열기", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "인증 코드가 담긴 트윗을 올려 본인임을 증명하면 비밀번호를 재설정할 수 있어요.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "먼저 적선할 필요 없어요. X 계정으로 트윗 한 번이면 열려요. 그릇 이름은 X 표시 이름, 아바타는 X 프로필 사진, X 계정 하나에 그릇 하나. 트윗이 곧 거리에 그릇을 내놓는 홍보가 돼요.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 지금 앱 내장 브라우저예요. 원터치 트윗이 X를 못 열거나, 돌아왔을 때 상태가 사라질 수 있어요.", + "建议点右上角「⋯」选「在浏览器中打开」": "오른쪽 위 「⋯」에서 「브라우저에서 열기」를 선택", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (또는 링크를 복사해 Safari / Chrome에서 열기)한 뒤 진행하세요.", + "复制本页链接": "이 페이지 링크 복사", + "发一条推文,带上验证码": "인증 코드를 담아 트윗 올리기", + "推文内容(可以随便改,只要保留验证码)": "트윗 내용 (자유롭게 수정 가능, 코드만 남겨 두세요)", + "换一条": "다른 문구", + "🐦 一键去 X 发推": "🐦 X에서 트윗하기", + "复制文案": "문구 복사", + "没拉起 X App?点这里用网页版发 →": "X 앱이 안 열리나요? 여기서 웹으로 올리기 →", + "验证码": "인증 코드", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "는 대소문자 구분 없이 24시간 유효해요. 문구에 그릇 링크가 들어 있어서 트윗이 곧 홍보가 돼요.", + "把推文链接贴回来": "트윗 링크를 여기에 붙여 넣기", + "推文链接": "트윗 링크", + "https://x.com/你的名字/status/1234567890": "https://x.com/내이름/status/1234567890", + "验证": "인증", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "트윗을 올린 뒤 공유 버튼 → 「링크 복사」를 누르면 돼요.", + "还没开过站?": "아직 그릇이 없나요? ", + "去开一个": "하나 열기", + "已经开过站?": "이미 그릇이 있나요? ", + "站长登录": "주인 로그인", + "🔑 设置新口令": "🔑 새 비밀번호 설정", + "保存并登录": "저장하고 로그인", + "✅ X 验证通过": "✅ X 인증 완료", + "· 站名和头像来自 X(头像会定期同步)": "· 이름과 아바타는 X에서 가져와요 (아바타는 주기적으로 동기화)", + "站点地址": "그릇 주소", + "(就是你的 X 用户名,不用填)": "(X 사용자명 그대로예요, 입력 필요 없음)", + "行行好,赏口饭吃 🙏": "한 푼만 적선해 주세요 🙏", + "登录口令": "로그인 비밀번호", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "다음부터 「X 사용자명 + 비밀번호」로 관리실에 로그인해요. 잊으면 트윗으로 다시 찾을 수 있어요.", + "口令(至少 6 位)": "비밀번호 (6자 이상)", + "开张 🏚": "개업 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "개업 후 관리실에서 Binance Key를 연결하거나 UID를 입력하면 돈을 받을 수 있어요. 내용은 본인 책임이며, 광고 그릇은 개방에서 제명돼요.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "%s 에게 적선", + "先回去看看": "일단 돌아가기", + "给 %s 投币": "%s 에게 적선 중", + "金额要": "금액은 ", + "一分不差": "정확히", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": " 맞춰 주세요. 게이트웨이가 이 고유한 끝자리로 자동 대조해서 송금 후 몇 초 안에 확인돼요", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Binance Pay로 주인에게 직접 송금하고, 보낸 뒤 아래 「적선했어요」를 누르세요", + "打开币安 App 转账": "Binance 앱에서 송금", + "唤起后手动输入金额": "앱에서 금액 입력:", + ",备注填": ", 메모는", + "用另一台手机扫码": "다른 폰으로 스캔", + "收款二维码": "수금 QR 코드", + "币安 App → 首页「扫一扫」→ 输入金额": "Binance 앱 → 「스캔」 → 금액 입력:", + "或手动转账": "또는 직접 송금", + "转账信息": "송금 정보", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Binance 앱 → 하단 「페이」 → 「송금」 → 받는 사람에 아래 UID 입력 → 금액은", + "→ 备注填": "→ 메모는", + "→ 转完回来点「我已施舍」": "→ 보낸 뒤 돌아와서 「적선했어요」 누르기", + "收款方": "받는 사람", + "复制": "복사", + "金额": "금액", + "备注": "메모", + "等待到账…转完自动确认,本页会自动更新": "입금 대기 중… 보내면 자동 확인되고, 이 페이지는 자동으로 갱신돼요", + "付了但一直没确认?": "보냈는데 확인이 안 되나요?", + "币安订单编号(18 位数字,转账详情里有)": "Binance 주문 번호 (18자리 숫자, 송금 상세에 있어요)", + "我付过了,帮我核对": "보냈어요, 확인해 주세요", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Binance 주문 번호 (선택, 18자리 숫자. 입력하면 주인이 더 빨리 확인해요)", + "我已施舍,等站长确认": "적선했어요, 주인 확인 대기", + "「我已施舍」要在发起施舍的那台设备上点。": "「적선했어요」는 적선을 시작한 기기에서 눌러 주세요.", + "打不开?": "안 열리나요? ", + "用网关收银页支付": "게이트웨이 결제 페이지로 결제", + "施舍进行中": "적선 진행 중", + "🙏 谢谢施主": "🙏 시주님, 고맙습니다", + "你在 %s 的施主榜排第 %d 位": "당신은 %s 의 시주 랭킹 %d 위예요", + "回到 %s 的碗": "%s 의 그릇으로 돌아가기", + "复制链接分享": "링크 복사해서 공유", + "🖼 分享卡片": "🖼 공유 카드", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "픽셀 공유 이미지를 만들어 X나 친구들에게 보내고, 거지 홍보도 한 번 해 주세요.", + "生成分享卡": "공유 카드 만들기", + "分享卡": "공유 카드", + "长按图片保存,或": "이미지를 길게 눌러 저장하거나, ", + "下载": "다운로드", + "🏚 你也可以要饭": "🏚 당신도 동냥할 수 있어요", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "X 계정으로 트윗 한 번이면 내 그릇이 열리고, 받은 돈은 바로 당신의 Binance 계정으로 들어가요.", + "站长没有确认这笔施舍": "주인이 이 적선을 확인하지 않았어요", + "这笔施舍已过期": "이 적선은 만료되었어요", + "如果你确实转了,请联系站长核对。": "정말 보냈다면 주인에게 연락해 확인해 주세요.", + "没付款不扣钱;想施舍请重新来一次。": "결제하지 않았다면 돈이 빠지지 않아요. 적선하려면 다시 시작해 주세요.", + "再来一次": "다시 하기", + // ---- 排行榜 ---- + "排行榜 ·": "랭킹 ·", + "🏆 施主榜": "🏆 시주", + "🥣 乞丐榜": "🥣 거지", + "🪙 人气榜": "🪙 인기", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · 모든 그릇 합산 · 총", + "位施主": "명의 시주", + "总榜": "전체", + "本周": "이번 주", + "要到最多的要饭站 · 共": "가장 많이 받은 그릇 · 총", + "个": "개", + "收到钢镚最多(免费投)· 共": "동전을 가장 많이 받은 그릇 (무료) · 총", + "← 回到刚才看的碗": "← 아까 보던 그릇으로", + "施主自己填的 X,未经验证": "시주가 직접 적은 X, 미인증", + "次 · 施舍过": "회 · 적선한 거지", + "个乞丐": "명", + "榜上无人": "아직 아무도 없어요", + "就是我": "나", + "还没有人上榜": "아직 랭킹에 아무도 없어요", + // ---- 站点页 ---- + "在要饭 ·": "동냥 중 ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ 이 그릇은 아직 개방에 등록되지 않아 랭킹에 들어가지 않아요.", + "主站站长审核后会收录。": "메인 사이트 주인이 심사 후 등록해요.", + "· 榜 #": "· 순위 #", + "升%s要 %s": "%s 승급까지 EXP %s", + "满级": "만렙", + "饱食度": "포만감", + "今天还没吃饭": "오늘 아직 못 먹었어요", + "今天有人投币了": "오늘 누가 적선했어요", + "今天丢过了": "오늘은 이미 던졌어요", + "丢个钢镚(免费)": "동전 던지기 (무료)", + "💸 投币施舍": "💸 적선하기", + "还没摆碗,暂不能投币": "아직 그릇이 없어서 적선할 수 없어요", + "去配置": "설정하러 가기", + "钢镚": "동전", + "· 今日": "· 오늘", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 동전 1개 =", + "碗里已有": "그릇 안", + "施主": "시주", + "人": "명", + "今日": "오늘", + "🕹️ 投币施舍": "🕹️ 동전 넣기", + "玩家名(上榜用,可留空)": "플레이어 이름 (랭킹용, 비워도 됨)", + "匿名施主": "익명의 시주", + "你的 X(可选,显示头像)": "당신의 X (선택, 아바타 표시)", + "投多少": "얼마나 넣을까", + "✏️ 自定义": "✏️ 직접 입력", + "输入金额,最多两位小数": "금액 입력, 소수점 둘째 자리까지", + "对乞丐喊话": "거지에게 한마디", + "例如:别买烟了,去吃饭": "예: 담배 사지 말고 밥 사 먹어", + "投币 💸": "적선 💸", + "投币": "적선", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Binance 앱으로 QR 스캔 / 원터치 결제. 입금되면 자동으로 공덕부에 새겨져요.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Binance Pay로 주인에게 직접 송금하고, 제출하면 주인이 확인 후 랭킹에 올려요.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "최소 %s, 최대 %s. 한마디에 링크나 연락처는 넣을 수 없어요.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "이 거지는 아직 그릇을 내놓지 않았어요 (수금 방법 미설정). 지금은 돈을 받을 수 없어요.", + "去后台配置 →": "관리실에서 설정 →", + "🏚 想自己要饭?": "🏚 나도 동냥하고 싶다면?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "X 계정으로 트윗 한 번이면 내 그릇이 열려요. 전용 주소, 내 그릇, 공덕부와 시주 랭킹까지. 돈은 바로 당신의 Binance 계정으로.", + "用 X 开通我的要饭站 →": "X로 내 그릇 열기 →", + "人气榜": "인기", + "功德簿": "공덕부", + "施主榜": "시주", + "乞丐榜": "거지", + "已屏蔽的施主": "차단된 시주", + "功德簿空空如也,第一枚硬币会刻在这里": "공덕부가 텅 비었어요. 첫 동전이 여기에 새겨져요", + "HIGH SCORE · 给": "HIGH SCORE ·", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "에게 가장 많이 적선한 사람 · 🏁 첫 시주 💎 최고 금액 🔥 단골", + "丐帮排名 · 要到最多的要饭站": "개방 랭킹 · 가장 많이 받은 그릇", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "인기 랭킹 · 동전을 가장 많이 받은 그릇 (동전은 무료)", + "次": "회", + "榜上无人,第一个投币的就是首席施主": "아직 아무도 없어요. 첫 번째로 적선하면 수석 시주가 돼요", + "本站": "이 그릇", + "叮!钢镚 +1": "땡! 동전 +1", + "没丢进去": "그릇에 안 들어갔어요", + "网络开小差了,再试一次": "네트워크가 잠깐 딴짓 중, 다시 해보세요", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "금액 형식이 잘못됐어요 (소수점 둘째 자리까지)", + "最少施舍 %s %s": "최소 적선은 %s %s", + "最多施舍 %s %s,真有这么多请分几次": "최대 적선은 %s %s. 정말 그만큼 있다면 나눠서 보내 주세요", + "支付网关开小差了:%s": "결제 게이트웨이가 잠깐 딴짓 중: %s", + "手速太快了": "너무 빨라요", + "这个乞丐不在": "이 거지는 여기 없어요", + "请先打开要饭页再丢": "먼저 그릇 페이지를 열어 주세요", + "服务器开小差了": "서버가 잠깐 딴짓 중", + "手速太快了,歇一会儿": "너무 빨라요, 잠깐 쉬어요", + "已提交,等站长确认": "제출했어요, 주인 확인 대기", + "网关返回 %s": "게이트웨이 응답: %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "「%s」에서 동냥 중인 내 그릇 비밀번호를 잊어서, 본인 인증 트윗 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "「%s」에 그릇 하나 내놨어요 🥣 한 푼만 적선해 주세요~ %s #사이버개방 %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "사이버 개방에 입문, 오늘부터 정식 거지 🧎 한 푼도 사랑, 무료 동전도 환영 🪙 %s #사이버개방 %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "회사 관두고 동냥으로 전직. 그릇은 여기, 착한 분들 한 푼만 🥣 %s #사이버개방 %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "개방 신입 모집, 제가 먼저 동냥 시작 🥣 적선하면 공덕부에 이름 등록, 무료 동전도 인정 %s #사이버개방 %s", + "这条推文里没有验证码 %s,请检查是否发对了": "이 트윗에 인증 코드 %s 가 없어요. 제대로 올렸는지 확인해 주세요", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s 는 이미 그릇이 있어요: %s. 비밀번호를 잊었다면 로그인 페이지에서 X로 재설정하세요.", + "@%s 已经开过站了": "@%s 는 이미 그릇이 있어요", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "주소 %s 는 이미 사용 중이에요 (@%s 가 이미 그릇을 열었을 수 있어요. 비밀번호를 잊었다면 로그인 페이지에서 X로 찾기)", + "@%s 还没开过要饭站": "@%s 는 아직 그릇이 없어요", + "解绑币安 Key 失败:%s": "Binance Key 연결 해제 실패: %s", + "绑定失败:%s": "연결 실패: %s", + "解绑失败:%s": "연결 해제 실패: %s", + "校验失败:%s": "검증 실패: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "/%s 의 비밀번호를 %s 로 재설정했어요 (한 번만 표시돼요, 주인에게 전해 주세요)", + "本站未配置支付网关": "결제 게이트웨이가 설정되지 않았어요", + "网关连不上,请稍后再试": "게이트웨이에 연결할 수 없어요, 잠시 후 다시 시도하세요", + "方法不允许": "허용되지 않는 메서드예요", + "主站不存在": "메인 사이트가 없어요", + "页面不存在": "페이지가 없어요", + "赛博丐帮没有这条路。": "사이버 개방에 이런 길은 없어요.", + "要么还没开张,要么已被丐帮除名。": "아직 개업하지 않았거나, 개방에서 제명됐어요.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "이 거지는 아직 그릇을 내놓지 않았어요 (수금 방법 미설정). 지금은 돈을 받을 수 없어요", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "X 사용자명은 영문, 숫자, 밑줄만 가능해요 (@ 는 빼도 돼요)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "이름과 한마디에 링크나 연락처는 넣지 마세요. 거지는 광고 안 받아요", + "没有这笔施舍": "그런 적선이 없어요", + "站点不存在": "그릇이 없어요", + "请在发起施舍的那台设备上点「我已施舍」": "적선을 시작한 기기에서 「적선했어요」를 눌러 주세요", + "币安订单编号是 18 位数字,不填也行": "Binance 주문 번호는 18자리 숫자예요 (선택)", + "核对失败": "확인 실패", + "这笔施舍不是网关模式": "이 적선은 게이트웨이 모드가 아니에요", + "试得太频繁了,一分钟后再试": "너무 자주 시도했어요, 1분 뒤 다시 해보세요", + "请在发起施舍的那台设备上回填": "적선을 시작한 기기에서 주문 번호를 입력해 주세요", + "币安订单编号是 18 位数字": "Binance 주문 번호는 18자리 숫자예요", + "本站未开放开站": "이 사이트는 그릇 개설을 받지 않아요", + "验证码已失效(或不是本浏览器生成的),请重新生成": "인증 코드가 만료됐어요 (또는 다른 브라우저에서 생성됨). 다시 생성해 주세요", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "트윗 링크가 잘못됐어요. https://x.com/내이름/status/1234567890 형식이어야 해요", + "这条推文比验证码还早,请用生成验证码之后发的推文": "이 트윗은 인증 코드보다 먼저 올라갔어요. 코드를 생성한 뒤 올린 트윗을 사용하세요", + "验证已失效,请重新验证": "인증이 만료됐어요, 다시 인증해 주세요", + "口号和介绍里别放链接、联系方式": "슬로건에 링크나 연락처는 넣지 마세요", + "口令至少 6 位": "비밀번호는 6자 이상이어야 해요", + "两次口令不一致": "비밀번호가 서로 달라요", + "主站口令在服务器 config.env 里改,不走 X 找回": "메인 사이트 비밀번호는 서버의 config.env 에서 바꿔요. X 찾기는 사용할 수 없어요", + "这个 X 今天重置得太频繁了,明天再来": "이 X 계정은 오늘 재설정을 너무 많이 했어요, 내일 다시 오세요", + "口令至少 6 位,且两次一致": "비밀번호는 6자 이상이고 두 번 똑같이 입력해야 해요", + "口令已重置,其它设备上的登录已失效": "비밀번호를 재설정했어요. 다른 기기에서는 로그아웃됐어요", + "X 用户名或口令不对": "X 사용자명 또는 비밀번호가 틀렸어요", + "请先登录": "먼저 로그인해 주세요", + "登录状态已失效,请重新登录。": "세션이 만료됐어요, 다시 로그인해 주세요.", + "歇一会儿再来。": "잠깐 쉬었다가 다시 오세요.", + "这个站点的错误口令太多,歇一会儿。": "이 그릇에 비밀번호 오류가 너무 많아요. 잠깐 쉬어요.", + "站点标题不能为空": "그릇 이름은 비울 수 없어요", + "资料里别放链接、联系方式": "프로필에 링크나 연락처는 넣지 마세요", + "资料已保存": "프로필을 저장했어요", + "主站的收款方式在服务器 config.env 里改": "메인 사이트의 수금 방법은 서버의 config.env 에서 바꿔요", + "填一下币安 UID,不然钱没处去": "Binance UID를 입력해 주세요. 없으면 돈이 갈 곳이 없어요", + "已切换为直接转账:施主转完自报,你在这里确认": "직접 송금으로 전환했어요. 시주가 송금 후 직접 알리면 여기서 확인해요", + "本站不支持绑定": "이 사이트는 연결을 지원하지 않아요", + "API Key 和 Secret 都要填": "API Key와 Secret 둘 다 입력해야 해요", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID는 숫자만이에요 (앱 프로필 화면에서 볼 수 있어요)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "연결 성공! Binance 검증을 통과했어요. 이제 적선은 자동으로 확인되어 랭킹에 올라가요", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "연결을 해제했어요. 지금은 직접 송금 모드예요. UID를 꼭 입력해 두세요", + "校验通过:币安 Key 可用,到账会自动确认": "검증 통과: Binance Key가 유효해요. 입금은 자동으로 확인돼요", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "메인 사이트 비밀번호는 서버의 config.env (ADMIN_PASSWORD) 에서 바꿔요", + "口令已修改,其它设备上的登录已失效": "비밀번호를 바꿨어요. 다른 기기에서는 로그아웃됐어요", + "这笔施舍当前不能确认/拒绝": "이 적선은 지금 승인/거절할 수 없어요", + "只能回复自己站的施舍": "내 그릇의 적선에만 답글을 달 수 있어요", + "回复里别放链接、联系方式": "답글에 링크나 연락처는 넣지 마세요", + "未知操作": "알 수 없는 작업이에요", + "无权操作": "권한이 없어요", + "没有这个站": "그런 그릇은 없어요", + "未配置支付网关": "결제 게이트웨이가 설정되지 않았어요", + "请求来源不对": "요청 출처가 잘못됐어요", + "请从本站页面操作。": "이 사이트 페이지에서 진행해 주세요.", + "页面渲染失败": "페이지 렌더링에 실패했어요", + "稍后再试。": "잠시 후 다시 시도하세요.", + "地址已被占用": "주소가 이미 사용 중이에요", + "这个 X 账号已经开过站了": "이 X 계정은 이미 그릇이 있어요", + "连不上 X 接口: %w": "X에 연결할 수 없어요: %w", + "找不到这条推文(链接不对,或推文不公开)": "트윗을 찾을 수 없어요 (링크가 잘못됐거나 비공개)", + "推文读不到(可能被删除或账号受保护)": "트윗을 읽을 수 없어요 (삭제됐거나 보호된 계정)", + "头像地址不在允许的域名": "아바타 주소가 허용된 도메인이 아니에요", + "头像下载失败": "아바타 다운로드에 실패했어요", + "头像不是有效图片": "아바타가 유효한 이미지가 아니에요", + "金额格式不对": "금액 형식이 잘못됐어요", + "收款链接过长": "수금 링크가 너무 길어요", + "收款链接须为 https 链接": "수금 링크는 https 링크여야 해요", + "收款链接必须是币安域名(app.binance.com/… 之类)": "수금 링크는 Binance 도메인이어야 해요 (app.binance.com/… 같은)", + "X 主页链接应形如 https://x.com/你的名字": "X 프로필 링크는 https://x.com/내이름 형식이어야 해요", + "核对成功,已到账": "확인 성공, 입금됐어요", + "查到了这笔转账但金额不足,已按实付记账": "송금은 찾았지만 금액이 부족해요. 실제 낸 금액으로 기록했어요", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "송금을 찾지 못했어요. 주문 번호와 받는 계정이 맞는지 확인하고, Binance에 입금된 뒤 다시 시도하세요", + "这笔转账已经被别的订单用过了": "이 송금은 이미 다른 주문에 사용됐어요", + "币种不对": "통화가 달라요", + "这笔施舍当前状态不能回填": "이 적선의 현재 상태에서는 주문 번호를 입력할 수 없어요", + "这个网络今天丢得够多了": "이 네트워크는 오늘 동전을 충분히 던졌어요", + "今天已经丢过了,明天再来": "오늘은 이미 던졌어요, 내일 다시 오세요", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "미결제", + "待确认": "확인 대기", + "已到账": "입금됨", + "已过期": "만료됨", + "已关闭": "닫힘", + "已拒绝": "거절됨", + "空碗未入帮": "빈 그릇 (미입문)", + "一袋弟子": "일결 제자", + "二袋弟子": "이결 제자", + "三袋弟子": "삼결 제자", + "四袋弟子": "사결 제자", + "五袋弟子": "오결 제자", + "六袋弟子": "육결 제자", + "七袋弟子": "칠결 제자", + "八袋弟子": "팔결 제자", + "九袋长老": "구결 장로", + "帮主": "방주", + "副帮主": "부방주", + "传功长老": "전공장로", + "执法长老": "집법장로", + "掌棒龙头": "장봉용두", + "掌钵龙头": "장발용두", + "长老": "장로", + "舵主": "타주", + "弟子": "제자", + "总舵": "총타", + "投了个硬币": "동전 하나 던진 분", + "善心人": "착한 분", + "大善人": "큰 은인", + "活菩萨": "살아있는 보살", + "财神爷": "재물신", + "刚刚": "방금", + "%d 分钟前": "%d분 전", + "%d 小时前": "%d시간 전", + "%d 天前": "%d일 전", + } +} diff --git a/i18n_pt.go b/i18n_pt.go new file mode 100644 index 0000000..76b917d --- /dev/null +++ b/i18n_pt.go @@ -0,0 +1,490 @@ +package main + +// 葡萄牙语(巴西)。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["pt"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Mendigo Cyber", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Mendigo Cyber: uma moedinha, gente boa. Doe com Binance Pay e deixe uma frase no Livro de Méritos; sem grana, jogue uma moeda grátis; abra sua própria tigela com um tweet no X.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Uma moedinha, gente boa. Doe e entre no Livro de Méritos; uma moeda grátis também é amor.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Mendigo Cyber", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Uma moedinha, gente boa. Doe com Binance Pay e deixe uma frase no Livro de Méritos.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(oculto: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Voltar pra rua", + "回到刚才看的碗": "Voltar pra tigela que você estava vendo", + "声音开关": "Ligar/desligar som", + "声音": "Som", + "排行榜": "Ranking", + "我的后台": "Meu painel", + "站长": "Dono ", + "登录": "Entrar", + "我的站": "Minha tigela", + "开通要饭站": "Começar a mendigar", + "🙏 行行好,赏口饭吃": "🙏 Uma moedinha, gente boa", + "🪙 一毛也是爱": "🪙 Cada centavo conta", + "💸 投币就上榜": "💸 Doe e entre no ranking", + "📜 留一句话刻功德簿": "📜 Deixe uma frase no Livro de Méritos", + "🏚 发条推就能开自己的要饭站": "🏚 Um tweet e você tem sua própria tigela", + "👾 赛博丐帮,人人有碗": "👾 Guilda dos Mendigos Cyber: uma tigela pra cada um", + "· 赛博丐帮,行行好": "· Guilda dos Mendigos Cyber · Uma moedinha", + "作者": "Autor", + "收款由": "Pagamentos por", + "驱动 · 字体": "· Fonte", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Som: desligado", + "声音:开(点击静音)": "Som: ligado (clique para silenciar)", + "点一下开始播放": "Toque para começar a música", + "已复制": "Copiado", + "功德 +": "Mérito +", + "你的名号和留言已刻上功德簿": "Seu nome e sua mensagem já estão no Livro de Méritos", + "看看功德簿": "Ver o Livro de Méritos", + "分享卡片": "Card para compartilhar", + "已提交,等站长确认后上榜。本页会自动更新。": "Enviado. Você entra no ranking assim que o dono confirmar. Esta página atualiza sozinha.", + "这笔施舍已": "Esta doação ", + "过期": "expirou", + "下单失败": "não pôde ser criada", + "被站长拒绝": "foi recusada pelo dono", + "关闭": "foi encerrada", + ",请回到页面重新投币。": ". Volte à página e doe de novo.", + "没成功,再试试": "Não deu certo, tenta de novo", + "网络开小差了": "A rede deu uma cochilada", + "分页": "Paginação", + "‹ 上一页": "‹ Anterior", + "下一页 ›": "Próxima ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Login do dono ·", + "🔑 站长登录": "🔑 Login do dono", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Entre com seu usuário do X e a senha que você definiu ao abrir a tigela. Dono do site principal: deixe o usuário em branco.", + "X 用户名": "Usuário do X", + "例如 qianyuwing(主站留空)": "ex.: qianyuwing (em branco para o site principal)", + "口令": "Senha", + "忘了口令?": "Esqueceu a senha?", + "用 X 发推找回": "Recupere com um tweet", + "。还没有要饭站?": ". Ainda não tem tigela?", + "用 X 开一个": "Abra uma com o X", + // ---- 后台 ---- + "后台 ·": "Painel ·", + "🎉 开张大吉!你的要饭站": "🎉 Negócio aberto! Sua tigela", + "已上线": "está no ar", + "(待主站站长收录后进榜)": " (entra nos rankings quando o dono do site principal aprovar)", + "下一步:": "Próximo passo: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "preencha seu UID da Binance em \"Recebimento\" aqui embaixo (dez segundos); senão ninguém consegue te pagar.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Volte por %s (usuário do X %s + sua senha). Esqueceu? Recupere com outro tweet.", + "后台": "painel", + "· 碗里": "· Na tigela", + "位施主 ·": "doadores ·", + "次 · 钢镚": "doações · moedas", + "待收录": "não aprovada", + "🔑 改口令": "🔑 Senha", + "退出": "Sair", + "⏳ 待确认": "⏳ Pendentes", + "✏️ 资料": "✏️ Perfil", + "💰 收款方式": "💰 Recebimento", + "📜 施舍记录": "📜 Doações", + "🏚 所有站点": "🏚 Todas as tigelas", + "🧹 留言巡查": "🧹 Mensagens", + "⏳ 待确认的施舍": "⏳ Doações aguardando confirmação", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Confira a transferência no app da Binance (valor e código da observação) e confirme para colocá-los no ranking.", + "备注码": "Observação", + "· 币安订单": "· Pedido Binance", + "✓ 确认到账": "✓ Recebido", + "✗ 没收到": "✗ Não recebido", + "站点标题": "Nome da tigela", + "(来自 X @": "(do X @", + ",锁定)": ", fixo)", + "头像 emoji": "Emoji do avatar", + "一句话口号": "Slogan em uma linha", + "绑定 X": "Vincular X", + "(主页链接或 @名字,留空不显示)": "(link do perfil ou @nome; em branco para ocultar)", + "https://x.com/你的名字": "https://x.com/seunome", + "保存资料": "Salvar perfil", + "config.env 配置": "definido em config.env", + "已绑币安 Key · 自动确认": "Key da Binance vinculada · confirmação automática", + "直接转账 · UID": "Transferência direta · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Ainda sem tigela — toque para configurar", + "主站的收款方式在服务器 config.env 里配置。当前:": "O método de recebimento do site principal é definido em config.env no servidor. Atual: ", + "BinancePayTool 网关自动确认(默认账号)": "Confirmação automática pelo gateway BinancePayTool (conta padrão)", + "直接转账": "transferência direta", + "校验网关默认账号": "Verificar conta padrão do gateway", + "✅ 已绑定币安账号(UID": "✅ Conta Binance vinculada (UID", + "),施主付款后": "). As doações são ", + "自动确认上榜": "confirmadas automaticamente", + "收银页会展示你的收款码 / 一键唤起。": " O painel de pagamento mostra seu QR code / abertura com um toque.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Adicione um link de recebimento para os doadores escanearem ou abrirem o app com um toque.", + "重新校验 Key": "Verificar a Key de novo", + "解绑后改为直接转账(需你手动确认到账),确定?": "Ao desvincular você passa para transferência direta (confirma cada pagamento na mão). Continuar?", + "解绑": "Desvincular", + "换一个 Key / 更新收款链接": "Trocar Key / atualizar link de recebimento", + "当前是": "Modo atual: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Os doadores transferem para seu UID no app da Binance, tocam em \"Já doei\" e você confirma aqui.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Ainda sem tigela: preencha seu UID da Binance e já pode receber. Dez segundos.", + "方式一:填币安 UID(最简单)": "Opção 1: seu UID da Binance (mais fácil)", + "币安 App → 点左上角头像,头像下面那串数字就是": "App da Binance → toque no seu avatar no canto superior esquerdo; o número embaixo dele é seu", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (também é seu Pay ID). Os doadores veem ele ao doar e enviam pelo app da Binance em \"Pagar → Transferir\", sem taxas.", + "币安 UID": "UID da Binance", + "例如 12345678": "ex.: 12345678", + "收款链接": "Link de recebimento", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(opcional. Com ele os doadores escaneiam ou abrem o app da Binance com um toque; sem ele transferem pelo UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Como pegar: na página de recebimento da Binance toque em \"Salvar imagem\", leia o QR com qualquer app de leitura e cole o link aqui.", + "保存": "Salvar", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Opção 2: vincular uma API Key da Binance somente leitura (confirmação automática)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "As doações são confirmadas sozinhas, sem trabalho manual. A Key só precisa de \"Permitir leitura\" e não consegue mover fundos; este site nunca a guarda, o gateway de pagamento a armazena criptografada.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "no total · oculte mensagens de spam ou bloqueie o usuário (o registro fica) · responda", + "已屏蔽此人": "Usuário bloqueado", + "(已屏蔽:": "(oculto: ", + "🥣 站长:": "🥣 Dono: ", + "恢复留言": "Mostrar mensagem", + "屏蔽留言": "Ocultar mensagem", + "恢复此人": "Desbloquear usuário", + "屏蔽此人": "Bloquear usuário", + "回一句…": "Responder…", + "回复": "Responder", + "还没有施舍记录": "Ainda não há doações", + "🔑 修改口令": "🔑 Trocar senha", + "新口令(至少 6 位)": "Nova senha (mín. 6 caracteres)", + "再输一遍": "Repita", + "改完后其它设备上的登录会失效。": "Os outros dispositivos serão desconectados.", + "确认修改": "Trocar senha", + "🏚 所有要饭站": "🏚 Todas as tigelas", + "个 · 违规可除名 · 可帮站长重置口令": "no total · expulse quem quebrar as regras · redefina a senha de um dono", + "已除名": "expulsa", + "未收录": "não aprovada", + "已绑 Key 自动确认": "Key vinculada, confirmação automática", + "位施主 · 钢镚": "doadores · moedas", + "开张": "aberta", + "取消收录": "Tirar do ranking", + "收录上榜": "Aprovar", + "除名": "Expulsar", + "恢复": "Restaurar", + "重置 /%s 的口令?新口令只显示一次。": "Redefinir a senha de /%s? A nova senha aparece só uma vez.", + "重置口令": "Redefinir senha", + "还没有子站": "Ainda não há tigelas", + "🧹 全站最新留言": "🧹 Últimas mensagens do site inteiro", + "条 · 跨站点巡查广告": "no total · patrulha de spam em todas as tigelas", + "暂无留言": "Ainda não há mensagens", + "币安 App → 账户 → API 管理 → 创建 API:": "App da Binance → Conta → Gerenciamento de API → Criar API: ", + "只勾「允许读取」": "marque só \"Permitir leitura\"", + ",其它权限都不要,": ", nada mais, ", + "不用设 IP 白名单": "sem precisar de lista de IPs", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (uma Key somente leitura não move fundos). Ela só serve para ler seus recebimentos, fica criptografada e nunca é exibida.", + "(App 头像页可见)": "(aparece na sua página de perfil no app)", + "(选填,填了施主能扫码)": "(opcional; permite que os doadores escaneiem um QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Como pegar o link de recebimento: na página de recebimento da Binance toque em \"Salvar imagem\" e leia o QR com qualquer app de leitura.", + "绑定并校验": "Vincular e verificar", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Recuperar senha com o X", + "🔑 用 X 找回口令": "🔑 Recuperar senha com o X", + "🏚 开通我的要饭站": "🏚 Abrir minha tigela", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Poste um tweet com o código de verificação para provar que é o dono e defina uma senha nova.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Não precisa doar antes. Um tweet da sua conta do X abre sua tigela: com o nome e o avatar do seu X, uma tigela por conta. O tweet ainda leva sua tigela pra rua.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Você está no navegador interno de um app. O X pode não abrir com um toque e você pode perder o progresso ao voltar.", + "建议点右上角「⋯」选「在浏览器中打开」": "Toque em \"⋯\" no canto superior direito e escolha \"Abrir no navegador\"", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (ou copie o link no Safari / Chrome) antes de continuar.", + "复制本页链接": "Copiar o link desta página", + "发一条推文,带上验证码": "Poste um tweet com o código", + "推文内容(可以随便改,只要保留验证码)": "Texto do tweet (edite à vontade, só mantenha o código)", + "换一条": "Outro", + "🐦 一键去 X 发推": "🐦 Postar no X", + "复制文案": "Copiar texto", + "没拉起 X App?点这里用网页版发 →": "O app do X não abriu? Poste pela web →", + "验证码": "O código", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "não diferencia maiúsculas e vale por 24 horas. O texto traz o link da sua tigela, então o tweet também serve de divulgação.", + "把推文链接贴回来": "Cole aqui o link do tweet", + "推文链接": "Link do tweet", + "https://x.com/你的名字/status/1234567890": "https://x.com/seunome/status/1234567890", + "验证": "Verificar", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Depois de postar, toque no botão de compartilhar do tweet → Copiar link.", + "还没开过站?": "Ainda não tem tigela? ", + "去开一个": "Abra uma", + "已经开过站?": "Já tem tigela? ", + "站长登录": "Login do dono", + "🔑 设置新口令": "🔑 Nova senha", + "保存并登录": "Salvar e entrar", + "✅ X 验证通过": "✅ X verificado", + "· 站名和头像来自 X(头像会定期同步)": "· nome e avatar vêm do X (o avatar sincroniza periodicamente)", + "站点地址": "Endereço da tigela", + "(就是你的 X 用户名,不用填)": "(é seu usuário do X; não precisa preencher)", + "行行好,赏口饭吃 🙏": "Uma moedinha, gente boa 🙏", + "登录口令": "Senha de login", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Depois entre com usuário do X + senha; se esquecer, recupere com outro tweet.", + "口令(至少 6 位)": "Senha (mín. 6 caracteres)", + "开张 🏚": "Abrir o negócio 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Depois de abrir, vincule uma Key da Binance ou informe seu UID no painel para receber. Você responde pelo seu conteúdo; tigelas de spam são expulsas pela guilda.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Doar para %s", + "先回去看看": "Voltar por enquanto", + "给 %s 投币": "Doando para %s", + "金额要": "O valor precisa ser ", + "一分不差": "exato", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": o gateway reconhece por esse final único e confirma em segundos", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Transfira direto para o dono com Binance Pay e depois toque em \"Já doei\" abaixo", + "打开币安 App 转账": "Abrir o app da Binance para pagar", + "唤起后手动输入金额": "No app, digite o valor", + ",备注填": ", observação", + "用另一台手机扫码": "Escaneie com outro celular", + "收款二维码": "QR code de pagamento", + "币安 App → 首页「扫一扫」→ 输入金额": "App da Binance → Escanear → digite o valor", + "或手动转账": "Ou transfira manualmente", + "转账信息": "Dados da transferência", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "App da Binance → \"Pagar\" → \"Transferir\" → destinatário: o UID abaixo → valor", + "→ 备注填": "→ observação", + "→ 转完回来点「我已施舍」": "→ volte e toque em \"Já doei\"", + "收款方": "Destinatário", + "复制": "Copiar", + "金额": "Valor", + "备注": "Observação", + "等待到账…转完自动确认,本页会自动更新": "Aguardando o pagamento… confirma sozinho após o envio; esta página atualiza sozinha", + "付了但一直没确认?": "Pagou e não confirmou?", + "币安订单编号(18 位数字,转账详情里有)": "ID do pedido Binance (18 dígitos, nos detalhes da transferência)", + "我付过了,帮我核对": "Já paguei, confere pra mim", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "ID do pedido Binance (opcional, 18 dígitos; acelera a confirmação)", + "我已施舍,等站长确认": "Já doei, aguardando o dono", + "「我已施舍」要在发起施舍的那台设备上点。": "Toque em \"Já doei\" no dispositivo em que você começou a doação.", + "打不开?": "Não abre? ", + "用网关收银页支付": "Pagar pela página de checkout do gateway", + "施舍进行中": "Doação em andamento", + "🙏 谢谢施主": "🙏 Obrigado, gente boa", + "你在 %s 的施主榜排第 %d 位": "No ranking de doadores de %s você está em #%d", + "回到 %s 的碗": "Voltar para a tigela de %s", + "复制链接分享": "Copiar link para compartilhar", + "🖼 分享卡片": "🖼 Card para compartilhar", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Gere um card pixelado para o X ou seus amigos e dê uma força pro mendigo.", + "生成分享卡": "Gerar card", + "分享卡": "Card", + "长按图片保存,或": "Segure a imagem para salvar, ou ", + "下载": "baixe", + "🏚 你也可以要饭": "🏚 Você também pode mendigar", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Um tweet da sua conta do X abre sua própria tigela; o dinheiro vai direto para sua conta Binance.", + "站长没有确认这笔施舍": "O dono não confirmou esta doação", + "这笔施舍已过期": "Esta doação expirou", + "如果你确实转了,请联系站长核对。": "Se você realmente transferiu, fale com o dono para conferir.", + "没付款不扣钱;想施舍请重新来一次。": "Nada foi cobrado; se quiser doar, comece de novo.", + "再来一次": "Tentar de novo", + // ---- 排行榜 ---- + "排行榜 ·": "Ranking ·", + "🏆 施主榜": "🏆 Doadores", + "🥣 乞丐榜": "🥣 Mendigos", + "🪙 人气榜": "🪙 Popularidade", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · todas as tigelas juntas ·", + "位施主": "doadores", + "总榜": "Geral", + "本周": "Esta semana", + "要到最多的要饭站 · 共": "Tigelas que mais arrecadaram ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Mais moedas recebidas (grátis) ·", + "← 回到刚才看的碗": "← Voltar pra tigela que você estava vendo", + "施主自己填的 X,未经验证": "X informado pelo doador, sem verificação", + "次 · 施舍过": "doações · doou para", + "个乞丐": "mendigos", + "榜上无人": "Ninguém aqui ainda", + "就是我": "eu", + "还没有人上榜": "Ninguém no ranking ainda", + // ---- 站点页 ---- + "在要饭 ·": "está mendigando ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ A guilda ainda não aprovou esta tigela, então ela não aparece nos rankings.", + "主站站长审核后会收录。": "O dono do site principal aprova depois de revisar.", + "· 榜 #": "· Posição #", + "升%s要 %s": "%s com %s EXP", + "满级": "Nível máximo", + "饱食度": "Saciedade", + "今天还没吃饭": "Hoje ainda não comeu nada", + "今天有人投币了": "Hoje alguém doou", + "今天丢过了": "Você já jogou hoje", + "丢个钢镚(免费)": "Jogue uma moeda (grátis)", + "💸 投币施舍": "💸 Doar", + "还没摆碗,暂不能投币": "Ainda sem tigela, não dá pra doar", + "去配置": "Configurar", + "钢镚": "Moedas", + "· 今日": "· hoje", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 moeda =", + "碗里已有": "Na tigela", + "施主": "Doadores", + "人": "", + "今日": "Hoje", + "🕹️ 投币施舍": "🕹️ Insira uma moeda", + "玩家名(上榜用,可留空)": "Nome do jogador (para o ranking, opcional)", + "匿名施主": "Anônimo", + "你的 X(可选,显示头像)": "Seu X (opcional, mostra seu avatar)", + "投多少": "Quanto em", + "✏️ 自定义": "✏️ Outro valor", + "输入金额,最多两位小数": "Valor, até 2 casas decimais", + "对乞丐喊话": "Diga algo ao mendigo", + "例如:别买烟了,去吃饭": "ex.: Larga o cigarro e compra comida", + "投币 💸": "Doar 💸", + "投币": "Doar", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Escaneie com o app da Binance ou abra com um toque; ao receber, entra no Livro de Méritos automaticamente.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Transfira direto para o dono via Binance Pay; o dono confirma e você entra no ranking.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Mín. %s, máx. %s. Sem links nem contatos na mensagem.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Este mendigo ainda não pôs a tigela (sem método de recebimento), então não consegue receber.", + "去后台配置 →": "Configure no painel →", + "🏚 想自己要饭?": "🏚 Quer mendigar também?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Um tweet da sua conta do X abre sua própria tigela: seu próprio endereço, seu Livro de Méritos e seu ranking de doadores, com o dinheiro indo direto pra sua conta Binance.", + "用 X 开通我的要饭站 →": "Abrir minha tigela com o X →", + "人气榜": "Popularidade", + "功德簿": "Méritos", + "施主榜": "Doadores", + "乞丐榜": "Mendigos", + "已屏蔽的施主": "Doador bloqueado", + "功德簿空空如也,第一枚硬币会刻在这里": "O Livro de Méritos está vazio. A primeira moeda fica gravada aqui.", + "HIGH SCORE · 给": "HIGH SCORE · quem mais doou para", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 primeiro doador 💎 maior doação 🔥 frequente", + "丐帮排名 · 要到最多的要饭站": "Ranking da guilda · tigelas que mais arrecadaram", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popularidade · tigelas com mais moedas (as moedas são grátis)", + "次": "doações", + "榜上无人,第一个投币的就是首席施主": "Ninguém aqui ainda. O primeiro a doar vira o doador-chefe.", + "本站": "esta tigela", + "叮!钢镚 +1": "Plim! Moeda +1", + "没丢进去": "Não caiu na tigela", + "网络开小差了,再试一次": "A rede deu uma cochilada, tenta de novo", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Valor inválido (até 2 casas decimais)", + "最少施舍 %s %s": "A doação mínima é %s %s", + "最多施舍 %s %s,真有这么多请分几次": "A doação máxima é %s %s. Se tem tudo isso mesmo, divida em várias", + "支付网关开小差了:%s": "O gateway de pagamento deu uma cochilada: %s", + "手速太快了": "Rápido demais", + "这个乞丐不在": "Este mendigo não está aqui", + "请先打开要饭页再丢": "Abra a página da tigela primeiro", + "服务器开小差了": "O servidor deu uma cochilada", + "手速太快了,歇一会儿": "Rápido demais, descansa um pouco", + "已提交,等站长确认": "Enviado, aguardando a confirmação do dono", + "网关返回 %s": "O gateway respondeu %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Esqueci a senha da minha tigela em %s, postando pra provar que sou eu 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Pus minha tigela em %s 🥣 Uma moedinha, gente boa~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Entrei pra Guilda dos Mendigos Cyber 🧎 Cada centavo conta, uma moeda grátis também vale 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Larguei o emprego, agora mendigo. A tigela tá aqui, sejam bonzinhos 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "A guilda dos mendigos tá recrutando e eu vou primeiro 🥣 Doe e entre no Livro de Méritos, ou jogue uma moeda grátis %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Esse tweet não contém o código %s. Confira se postou o certo", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s já tem uma tigela: %s. Esqueceu a senha? Redefina com o X na página de login.", + "@%s 已经开过站了": "@%s já tem uma tigela", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "O endereço %s já está em uso (@%s talvez já tenha uma tigela; recupere a senha com o X na página de login)", + "@%s 还没开过要饭站": "@%s ainda não tem tigela", + "解绑币安 Key 失败:%s": "Não foi possível desvincular a Key da Binance: %s", + "绑定失败:%s": "Falha ao vincular: %s", + "解绑失败:%s": "Falha ao desvincular: %s", + "校验失败:%s": "Falha na verificação: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Senha de /%s redefinida para %s (aparece só desta vez, repasse ao dono)", + "本站未配置支付网关": "Nenhum gateway de pagamento configurado", + "网关连不上,请稍后再试": "Não deu pra conectar ao gateway, tente mais tarde", + "方法不允许": "Método não permitido", + "主站不存在": "Site principal não encontrado", + "页面不存在": "Página não encontrada", + "赛博丐帮没有这条路。": "Esse caminho não existe na Guilda dos Mendigos Cyber.", + "要么还没开张,要么已被丐帮除名。": "Ou ainda não abriu, ou a guilda expulsou.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Este mendigo ainda não pôs a tigela (sem método de recebimento), não consegue receber por enquanto", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "O usuário do X só pode ter letras, números e sublinhado (com ou sem @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Sem links nem contatos no nome ou na mensagem. Mendigo não aceita propaganda", + "没有这笔施舍": "Doação não encontrada", + "站点不存在": "Tigela não encontrada", + "请在发起施舍的那台设备上点「我已施舍」": "Toque em \"Já doei\" no dispositivo em que você começou a doação", + "币安订单编号是 18 位数字,不填也行": "O ID do pedido Binance tem 18 dígitos (opcional)", + "核对失败": "Falha na conferência", + "这笔施舍不是网关模式": "Esta doação não usa o gateway", + "试得太频繁了,一分钟后再试": "Tentativas demais, tente de novo em um minuto", + "请在发起施舍的那台设备上回填": "Envie o ID do pedido pelo dispositivo em que você começou a doação", + "币安订单编号是 18 位数字": "O ID do pedido Binance tem 18 dígitos", + "本站未开放开站": "Abrir tigelas está desativado neste site", + "验证码已失效(或不是本浏览器生成的),请重新生成": "O código expirou (ou foi gerado em outro navegador). Gere um novo", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Link do tweet inválido. Deve ser algo como https://x.com/seunome/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Esse tweet é anterior ao código. Use um tweet postado depois de gerar o código", + "验证已失效,请重新验证": "A verificação expirou, verifique de novo", + "口号和介绍里别放链接、联系方式": "Sem links nem contatos no slogan", + "口令至少 6 位": "A senha precisa ter pelo menos 6 caracteres", + "两次口令不一致": "As senhas não conferem", + "主站口令在服务器 config.env 里改,不走 X 找回": "A senha do site principal é definida em config.env no servidor, não se recupera pelo X", + "这个 X 今天重置得太频繁了,明天再来": "Redefinições demais para esta conta do X hoje, volte amanhã", + "口令至少 6 位,且两次一致": "A senha precisa ter pelo menos 6 caracteres e conferir", + "口令已重置,其它设备上的登录已失效": "Senha redefinida. Os outros dispositivos foram desconectados", + "X 用户名或口令不对": "Usuário do X ou senha incorretos", + "请先登录": "Faça login primeiro", + "登录状态已失效,请重新登录。": "Sua sessão expirou, faça login de novo.", + "歇一会儿再来。": "Descansa um pouco e volta.", + "这个站点的错误口令太多,歇一会儿。": "Senhas erradas demais para esta tigela. Descansa um pouco.", + "站点标题不能为空": "O nome da tigela não pode ficar vazio", + "资料里别放链接、联系方式": "Sem links nem contatos no perfil", + "资料已保存": "Perfil salvo", + "主站的收款方式在服务器 config.env 里改": "O método de recebimento do site principal é definido em config.env no servidor", + "填一下币安 UID,不然钱没处去": "Preencha seu UID da Binance, senão o dinheiro não tem pra onde ir", + "已切换为直接转账:施主转完自报,你在这里确认": "Mudou para transferência direta: os doadores avisam o pagamento e você confirma aqui", + "本站不支持绑定": "Vinculação não disponível neste site", + "API Key 和 Secret 都要填": "É preciso informar a API Key e o Secret", + "币安 UID 是纯数字(App 头像页可见)": "O UID da Binance é só números (aparece na sua página de perfil no app)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Vinculado! A Binance verificou a Key; a partir de agora as doações são confirmadas automaticamente", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Desvinculado. Agora você está no modo transferência direta, confira se seu UID está preenchido", + "校验通过:币安 Key 可用,到账会自动确认": "Verificado: a Key da Binance funciona, os pagamentos serão confirmados automaticamente", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "A senha do site principal é definida em config.env (ADMIN_PASSWORD) no servidor", + "口令已修改,其它设备上的登录已失效": "Senha alterada. Os outros dispositivos foram desconectados", + "这笔施舍当前不能确认/拒绝": "Esta doação não pode ser confirmada nem recusada agora", + "只能回复自己站的施舍": "Você só pode responder a doações da sua própria tigela", + "回复里别放链接、联系方式": "Sem links nem contatos nas respostas", + "未知操作": "Ação desconhecida", + "无权操作": "Não permitido", + "没有这个站": "Essa tigela não existe", + "未配置支付网关": "Nenhum gateway de pagamento configurado", + "请求来源不对": "Origem da requisição incorreta", + "请从本站页面操作。": "Use as páginas do próprio site.", + "页面渲染失败": "Não foi possível exibir a página", + "稍后再试。": "Tente mais tarde.", + "地址已被占用": "Endereço já em uso", + "这个 X 账号已经开过站了": "Esta conta do X já tem uma tigela", + "连不上 X 接口: %w": "Não deu pra conectar ao X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet não encontrado (link errado, ou o tweet não é público)", + "推文读不到(可能被删除或账号受保护)": "Não deu pra ler o tweet (apagado, ou a conta é protegida)", + "头像地址不在允许的域名": "A URL do avatar não está em um domínio permitido", + "头像下载失败": "Falha ao baixar o avatar", + "头像不是有效图片": "O avatar não é uma imagem válida", + "金额格式不对": "Valor inválido", + "收款链接过长": "O link de recebimento é longo demais", + "收款链接须为 https 链接": "O link de recebimento precisa ser https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "O link de recebimento precisa ser um domínio da Binance (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "O link do perfil do X deve ser algo como https://x.com/seunome", + "核对成功,已到账": "Conferido, pagamento recebido", + "查到了这笔转账但金额不足,已按实付记账": "Transferência encontrada, mas o valor é menor; registrado o que foi pago", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Transferência não encontrada: confira o ID do pedido e a conta de destino, e tente de novo quando a Binance mostrar", + "这笔转账已经被别的订单用过了": "Esta transferência já foi usada em outro pedido", + "币种不对": "Moeda incorreta", + "这笔施舍当前状态不能回填": "O status desta doação não permite enviar um ID de pedido", + "这个网络今天丢得够多了": "Esta rede já jogou moedas demais hoje", + "今天已经丢过了,明天再来": "Você já jogou hoje, volte amanhã", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "não pago", + "待确认": "pendente", + "已到账": "pago", + "已过期": "expirado", + "已关闭": "encerrado", + "已拒绝": "recusado", + "空碗未入帮": "Tigela vazia", + "一袋弟子": "Discípulo de 1 Saco", + "二袋弟子": "Discípulo de 2 Sacos", + "三袋弟子": "Discípulo de 3 Sacos", + "四袋弟子": "Discípulo de 4 Sacos", + "五袋弟子": "Discípulo de 5 Sacos", + "六袋弟子": "Discípulo de 6 Sacos", + "七袋弟子": "Discípulo de 7 Sacos", + "八袋弟子": "Discípulo de 8 Sacos", + "九袋长老": "Ancião de 9 Sacos", + "帮主": "Mestre da Guilda", + "副帮主": "Vice-Mestre", + "传功长老": "Ancião dos Ensinamentos", + "执法长老": "Ancião da Lei", + "掌棒龙头": "Chefe do Bastão", + "掌钵龙头": "Chefe da Tigela", + "长老": "Ancião", + "舵主": "Chefe de Filial", + "弟子": "Discípulo", + "总舵": "Sede Central", + "投了个硬币": "jogou uma moeda", + "善心人": "alma bondosa", + "大善人": "grande benfeitor", + "活菩萨": "santo vivo", + "财神爷": "deus da riqueza", + "刚刚": "agora mesmo", + "%d 分钟前": "há %d min", + "%d 小时前": "há %d h", + "%d 天前": "há %d d", + } +} diff --git a/i18n_ru.go b/i18n_ru.go new file mode 100644 index 0000000..2b2a0d7 --- /dev/null +++ b/i18n_ru.go @@ -0,0 +1,490 @@ +package main + +// 俄语。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["ru"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Кибер-нищий", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Кибер-нищий: подайте монетку. Подайте через Binance Pay и оставьте строчку в Книге добрых дел; нет денег — киньте бесплатную монетку; один твит в X открывает вашу собственную миску.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Подайте монетку. Подаяние попадает в Книгу добрых дел; бесплатная монетка — тоже любовь.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Кибер-нищий", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Подайте монетку. Подайте через Binance Pay и оставьте строчку в Книге добрых дел.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(скрыто: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Назад на улицу", + "回到刚才看的碗": "Назад к миске, которую вы смотрели", + "声音开关": "Переключатель звука", + "声音": "Звук", + "排行榜": "Рейтинг", + "我的后台": "Панель", + "站长": "Хозяин ", + "登录": "Войти", + "我的站": "Моя миска", + "开通要饭站": "Открыть миску", + "🙏 行行好,赏口饭吃": "🙏 Подайте монетку, добрый человек", + "🪙 一毛也是爱": "🪙 Каждая копейка — любовь", + "💸 投币就上榜": "💸 Подай — и попади в рейтинг", + "📜 留一句话刻功德簿": "📜 Оставь строчку в Книге добрых дел", + "🏚 发条推就能开自己的要饭站": "🏚 Один твит — и у тебя своя миска", + "👾 赛博丐帮,人人有碗": "👾 Кибер-гильдия нищих: миска каждому", + "· 赛博丐帮,行行好": "· Кибер-гильдия нищих · Подайте монетку", + "作者": "Автор", + "收款由": "Платежи через", + "驱动 · 字体": "· Шрифт", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Звук: выкл", + "声音:开(点击静音)": "Звук: вкл (нажмите, чтобы выключить)", + "点一下开始播放": "Нажмите, чтобы включить музыку", + "已复制": "Скопировано", + "功德 +": "Карма +", + "你的名号和留言已刻上功德簿": "Ваше имя и послание вписаны в Книгу добрых дел", + "看看功德簿": "Открыть Книгу добрых дел", + "分享卡片": "Открытка", + "已提交,等站长确认后上榜。本页会自动更新。": "Отправлено. Попадёте в рейтинг, как только хозяин подтвердит. Страница обновится сама.", + "这笔施舍已": "Это подаяние ", + "过期": "истекло", + "下单失败": "не удалось создать", + "被站长拒绝": "отклонено хозяином", + "关闭": "закрыто", + ",请回到页面重新投币。": ". Вернитесь и подайте ещё раз.", + "没成功,再试试": "Не вышло, попробуйте ещё", + "网络开小差了": "Сеть заглючила", + "分页": "Страницы", + "‹ 上一页": "‹ Назад", + "下一页 ›": "Вперёд ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Вход для хозяина ·", + "🔑 站长登录": "🔑 Вход для хозяина", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Войдите в панель: имя пользователя X + пароль, заданный при открытии миски. Хозяин главного сайта: имя оставьте пустым.", + "X 用户名": "Имя пользователя X", + "例如 qianyuwing(主站留空)": "например qianyuwing (для главного сайта — пусто)", + "口令": "Пароль", + "忘了口令?": "Забыли пароль?", + "用 X 发推找回": "Восстановить через твит", + "。还没有要饭站?": ". Ещё нет миски?", + "用 X 开一个": "Открыть через X", + // ---- 后台 ---- + "后台 ·": "Панель ·", + "🎉 开张大吉!你的要饭站": "🎉 Поздравляем с открытием! Ваша миска", + "已上线": "в сети", + "(待主站站长收录后进榜)": " (попадёт в рейтинги после одобрения хозяином главного сайта)", + "下一步:": "Дальше: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "укажите Binance UID в разделе «Оплата» ниже (десять секунд), иначе никто не сможет вам заплатить.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Возвращайтесь через %s (имя X %s + ваш пароль). Забыли? Восстановите новым твитом.", + "后台": "панель", + "· 碗里": "· В миске", + "位施主 ·": "дарителей ·", + "次 · 钢镚": "подаяний · монеток", + "待收录": "не в списке", + "🔑 改口令": "🔑 Пароль", + "退出": "Выйти", + "⏳ 待确认": "⏳ Ожидают", + "✏️ 资料": "✏️ Профиль", + "💰 收款方式": "💰 Оплата", + "📜 施舍记录": "📜 Подаяния", + "🏚 所有站点": "🏚 Все миски", + "🧹 留言巡查": "🧹 Сообщения", + "⏳ 待确认的施舍": "⏳ Подаяния, ожидающие подтверждения", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Проверьте перевод в приложении Binance (сумма и код в примечании), затем подтвердите — и даритель попадёт в рейтинг.", + "备注码": "Код в примечании", + "· 币安订单": "· Ордер Binance", + "✓ 确认到账": "✓ Получено", + "✗ 没收到": "✗ Не получено", + "站点标题": "Название миски", + "(来自 X @": "(из X @", + ",锁定)": ", закреплено)", + "头像 emoji": "Эмодзи-аватар", + "一句话口号": "Слоган в одну строку", + "绑定 X": "Привязать X", + "(主页链接或 @名字,留空不显示)": "(ссылка на профиль или @имя; пусто — не показывать)", + "https://x.com/你的名字": "https://x.com/ваше_имя", + "保存资料": "Сохранить профиль", + "config.env 配置": "задано в config.env", + "已绑币安 Key · 自动确认": "Binance Key привязан · автоподтверждение", + "直接转账 · UID": "Прямой перевод · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Миска ещё не поставлена — нажмите, чтобы настроить", + "主站的收款方式在服务器 config.env 里配置。当前:": "Способ оплаты главного сайта задаётся в config.env на сервере. Сейчас: ", + "BinancePayTool 网关自动确认(默认账号)": "автоподтверждение через шлюз BinancePayTool (аккаунт по умолчанию)", + "直接转账": "прямой перевод", + "校验网关默认账号": "Проверить аккаунт шлюза по умолчанию", + "✅ 已绑定币安账号(UID": "✅ Аккаунт Binance привязан (UID", + "),施主付款后": "). Подаяния ", + "自动确认上榜": "подтверждаются автоматически", + "收银页会展示你的收款码 / 一键唤起。": " На странице оплаты будет ваш QR-код / открытие в одно касание.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Добавьте ссылку для получения, чтобы дарители могли отсканировать код или открыть приложение в одно касание.", + "重新校验 Key": "Проверить Key заново", + "解绑后改为直接转账(需你手动确认到账),确定?": "После отвязки — прямой перевод (каждый платёж подтверждаете вручную). Продолжить?", + "解绑": "Отвязать", + "换一个 Key / 更新收款链接": "Сменить Key / обновить ссылку", + "当前是": "Текущий режим: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Дарители переводят на ваш UID в приложении Binance, нажимают «Я заплатил», а вы подтверждаете здесь.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Миска ещё не поставлена: укажите Binance UID — и можно принимать деньги. Десять секунд.", + "方式一:填币安 UID(最简单)": "Способ 1: ваш Binance UID (проще всего)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Приложение Binance → аватар слева вверху; число под ним — это ваш", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (он же Pay ID). Дарители увидят его при подаянии и переведут через «Оплата → Перевод» в приложении Binance без комиссии.", + "币安 UID": "Binance UID", + "例如 12345678": "например 12345678", + "收款链接": "Ссылка для получения", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(необязательно. С ней дарители смогут отсканировать код или открыть Binance в одно касание; без неё переводят по UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Где взять: на странице получения в Binance нажмите «Сохранить изображение», прочитайте QR любым сканером и вставьте ссылку сюда.", + "保存": "Сохранить", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Способ 2: привязать Binance API Key только для чтения (автоподтверждение)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Подаяния подтверждаются автоматически. Ключу нужно только право «Enable Reading», вывести деньги им нельзя; сайт его не хранит — только платёжный шлюз, в зашифрованном виде.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "всего · спам можно скрыть или заблокировать автора (записи сохраняются) · можно ответить", + "已屏蔽此人": "Пользователь заблокирован", + "(已屏蔽:": "(скрыто: ", + "🥣 站长:": "🥣 Хозяин: ", + "恢复留言": "Показать сообщение", + "屏蔽留言": "Скрыть сообщение", + "恢复此人": "Разблокировать", + "屏蔽此人": "Заблокировать", + "回一句…": "Ответить…", + "回复": "Ответить", + "还没有施舍记录": "Подаяний пока нет", + "🔑 修改口令": "🔑 Сменить пароль", + "新口令(至少 6 位)": "Новый пароль (не менее 6 символов)", + "再输一遍": "Ещё раз", + "改完后其它设备上的登录会失效。": "Другие устройства будут разлогинены.", + "确认修改": "Сменить пароль", + "🏚 所有要饭站": "🏚 Все миски", + "个 · 违规可除名 · 可帮站长重置口令": "всего · нарушителей можно изгнать · можно сбросить пароль хозяина", + "已除名": "изгнан", + "未收录": "не в списке", + "已绑 Key 自动确认": "Key привязан, автоподтверждение", + "位施主 · 钢镚": "дарителей · монеток", + "开张": "открыт", + "取消收录": "Убрать из списка", + "收录上榜": "В список", + "除名": "Изгнать", + "恢复": "Вернуть", + "重置 /%s 的口令?新口令只显示一次。": "Сбросить пароль для /%s? Новый пароль показывается один раз.", + "重置口令": "Сбросить пароль", + "还没有子站": "Мисок пока нет", + "🧹 全站最新留言": "🧹 Последние сообщения со всего сайта", + "条 · 跨站点巡查广告": "всего · патруль спама по всем мискам", + "暂无留言": "Сообщений пока нет", + "币安 App → 账户 → API 管理 → 创建 API:": "Приложение Binance → Аккаунт → Управление API → Создать API: ", + "只勾「允许读取」": "отметьте только «Enable Reading»", + ",其它权限都不要,": ", больше ничего, ", + "不用设 IP 白名单": "белый список IP не нужен", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (ключ только для чтения не может вывести деньги). Он используется лишь для чтения входящих переводов, хранится в зашифрованном виде и никогда не показывается.", + "(App 头像页可见)": "(виден на странице профиля в приложении)", + "(选填,填了施主能扫码)": "(необязательно; позволяет дарителям сканировать QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Где взять ссылку: на странице получения в Binance нажмите «Сохранить изображение» и прочитайте QR любым сканером.", + "绑定并校验": "Привязать и проверить", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Восстановить пароль через X", + "🔑 用 X 找回口令": "🔑 Восстановить пароль через X", + "🏚 开通我的要饭站": "🏚 Открыть свою миску", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Опубликуйте твит с кодом, чтобы доказать, что вы хозяин, и задайте новый пароль.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Подаяние не требуется. Один твит с вашего аккаунта X открывает миску: название — ваше имя в X, аватар — из X, одна миска на аккаунт. Заодно твит выставит вашу миску на улицу.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Вы во встроенном браузере приложения. Твит в одно касание может не открыть X, а после возвращения прогресс может потеряться.", + "建议点右上角「⋯」选「在浏览器中打开」": "Нажмите «⋯» справа вверху и выберите «Открыть в браузере»", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (или скопируйте ссылку в Safari / Chrome), прежде чем продолжать.", + "复制本页链接": "Скопировать ссылку на страницу", + "发一条推文,带上验证码": "Опубликуйте твит с кодом", + "推文内容(可以随便改,只要保留验证码)": "Текст твита (меняйте как угодно, главное — оставьте код)", + "换一条": "Другой вариант", + "🐦 一键去 X 发推": "🐦 Написать в X", + "复制文案": "Скопировать текст", + "没拉起 X App?点这里用网页版发 →": "Приложение X не открылось? Опубликуйте через веб →", + "验证码": "Код", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "не зависит от регистра и действует 24 часа. В тексте есть ссылка на вашу миску, так что твит заодно служит рекламой.", + "把推文链接贴回来": "Вставьте ссылку на твит", + "推文链接": "Ссылка на твит", + "https://x.com/你的名字/status/1234567890": "https://x.com/ваше_имя/status/1234567890", + "验证": "Проверить", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "После публикации нажмите на твите «Поделиться → Скопировать ссылку».", + "还没开过站?": "Ещё нет миски? ", + "去开一个": "Открыть", + "已经开过站?": "Уже есть миска? ", + "站长登录": "Вход для хозяина", + "🔑 设置新口令": "🔑 Новый пароль", + "保存并登录": "Сохранить и войти", + "✅ X 验证通过": "✅ X подтверждён", + "· 站名和头像来自 X(头像会定期同步)": "· название и аватар берутся из X (аватар обновляется периодически)", + "站点地址": "Адрес миски", + "(就是你的 X 用户名,不用填)": "(это ваше имя в X, заполнять не нужно)", + "行行好,赏口饭吃 🙏": "Подайте монетку, добрый человек 🙏", + "登录口令": "Пароль для входа", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Потом входите по имени X + паролю; забыли — восстановите новым твитом.", + "口令(至少 6 位)": "Пароль (не менее 6 символов)", + "开张 🏚": "Открыться 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "После открытия привяжите Binance Key или укажите UID в панели, чтобы принимать деньги. За содержимое отвечаете вы; спам-миски гильдия изгоняет.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Подаяние для %s", + "先回去看看": "Пока вернуться", + "给 %s 投币": "Кидаем монету для %s", + "金额要": "Сумма должна быть ", + "一分不差": "точной", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": шлюз узнаёт платёж по уникальному хвосту и подтверждает за секунды", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Переведите хозяину напрямую через Binance Pay, затем нажмите «Я заплатил» ниже", + "打开币安 App 转账": "Открыть Binance для перевода", + "唤起后手动输入金额": "В приложении введите сумму", + ",备注填": ", примечание", + "用另一台手机扫码": "Сканируйте другим телефоном", + "收款二维码": "QR-код для оплаты", + "币安 App → 首页「扫一扫」→ 输入金额": "Приложение Binance → Сканировать → введите сумму", + "或手动转账": "Или переведите вручную", + "转账信息": "Данные перевода", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Приложение Binance → «Оплата» → «Перевод» → получатель: UID ниже → сумма", + "→ 备注填": "→ примечание", + "→ 转完回来点「我已施舍」": "→ вернитесь и нажмите «Я заплатил»", + "收款方": "Получатель", + "复制": "Копировать", + "金额": "Сумма", + "备注": "Примечание", + "等待到账…转完自动确认,本页会自动更新": "Ждём платёж… после перевода подтвердится само; страница обновится автоматически", + "付了但一直没确认?": "Заплатили, а подтверждения нет?", + "币安订单编号(18 位数字,转账详情里有)": "Номер ордера Binance (18 цифр, в деталях перевода)", + "我付过了,帮我核对": "Я заплатил, проверьте", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Номер ордера Binance (необязательно, 18 цифр; ускорит подтверждение)", + "我已施舍,等站长确认": "Я заплатил, жду хозяина", + "「我已施舍」要在发起施舍的那台设备上点。": "«Я заплатил» нужно нажать на устройстве, с которого начато подаяние.", + "打不开?": "Не открывается? ", + "用网关收银页支付": "Оплатить через страницу шлюза", + "施舍进行中": "Подаяние в процессе", + "🙏 谢谢施主": "🙏 Спасибо, добрый даритель", + "你在 %s 的施主榜排第 %d 位": "В рейтинге дарителей %s вы на %d-м месте", + "回到 %s 的碗": "Назад к миске %s", + "复制链接分享": "Скопировать ссылку", + "🖼 分享卡片": "🖼 Открытка", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Сделайте пиксельную открытку для X или друзей — и заодно прорекламируйте нищего.", + "生成分享卡": "Сделать открытку", + "分享卡": "Открытка", + "长按图片保存,或": "Удерживайте картинку, чтобы сохранить, или ", + "下载": "скачайте", + "🏚 你也可以要饭": "🏚 Вы тоже можете просить", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Один твит с вашего аккаунта X открывает вашу миску; деньги идут прямо на ваш аккаунт Binance.", + "站长没有确认这笔施舍": "Хозяин не подтвердил это подаяние", + "这笔施舍已过期": "Это подаяние истекло", + "如果你确实转了,请联系站长核对。": "Если вы действительно перевели, свяжитесь с хозяином для проверки.", + "没付款不扣钱;想施舍请重新来一次。": "Деньги не списаны; чтобы подать, начните заново.", + "再来一次": "Ещё раз", + // ---- 排行榜 ---- + "排行榜 ·": "Рейтинг ·", + "🏆 施主榜": "🏆 Дарители", + "🥣 乞丐榜": "🥣 Нищие", + "🪙 人气榜": "🪙 Популярность", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · все миски вместе ·", + "位施主": "дарителей", + "总榜": "За всё время", + "本周": "За неделю", + "要到最多的要饭站 · 共": "Миски, собравшие больше всех ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Больше всего монеток (бесплатных) ·", + "← 回到刚才看的碗": "← Назад к миске, которую вы смотрели", + "施主自己填的 X,未经验证": "X указан самим дарителем, не проверен", + "次 · 施舍过": "подаяний · подал", + "个乞丐": "нищим", + "榜上无人": "Пока никого", + "就是我": "это я", + "还没有人上榜": "В рейтинге пока никого", + // ---- 站点页 ---- + "在要饭 ·": "просит милостыню ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Эта миска ещё не внесена гильдией в список, поэтому не участвует в рейтингах.", + "主站站长审核后会收录。": "Хозяин главного сайта внесёт её после проверки.", + "· 榜 #": "· Место #", + "升%s要 %s": "%s — с %s EXP", + "满级": "Максимум", + "饱食度": "Сытость", + "今天还没吃饭": "Сегодня ещё не ел", + "今天有人投币了": "Сегодня кто-то подал", + "今天丢过了": "Сегодня уже кидали", + "丢个钢镚(免费)": "Кинуть монетку (бесплатно)", + "💸 投币施舍": "💸 Подать", + "还没摆碗,暂不能投币": "Миска не поставлена, подать нельзя", + "去配置": "Настроить", + "钢镚": "Монетки", + "· 今日": "· сегодня", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 монетка =", + "碗里已有": "В миске", + "施主": "Дарителей", + "人": "", + "今日": "Сегодня", + "🕹️ 投币施舍": "🕹️ Вставьте монету", + "玩家名(上榜用,可留空)": "Имя игрока (для рейтинга, необязательно)", + "匿名施主": "Аноним", + "你的 X(可选,显示头像)": "Ваш X (необязательно, покажет аватар)", + "投多少": "Сумма в", + "✏️ 自定义": "✏️ Своя", + "输入金额,最多两位小数": "Сумма, до 2 знаков после запятой", + "对乞丐喊话": "Скажите что-нибудь нищему", + "例如:别买烟了,去吃饭": "например: Хватит курить, купи поесть", + "投币 💸": "Подать 💸", + "投币": "Подать", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Отсканируйте в приложении Binance или откройте его в одно касание; после получения запись появится в Книге добрых дел автоматически.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Переведите хозяину напрямую через Binance Pay; хозяин подтвердит — и вы в рейтинге.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Мин. %s, макс. %s. Без ссылок и контактов в сообщении.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Этот нищий ещё не поставил миску (нет способа оплаты), деньги принимать не может.", + "去后台配置 →": "Настроить в панели →", + "🏚 想自己要饭?": "🏚 Тоже хотите просить?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Один твит с аккаунта X открывает вашу миску: свой адрес, своя Книга добрых дел и рейтинг дарителей, деньги прямо на ваш Binance.", + "用 X 开通我的要饭站 →": "Открыть миску через X →", + "人气榜": "Популярность", + "功德簿": "Добрые дела", + "施主榜": "Дарители", + "乞丐榜": "Нищие", + "已屏蔽的施主": "Заблокированный даритель", + "功德簿空空如也,第一枚硬币会刻在这里": "Книга добрых дел пуста. Первая монета будет вписана здесь.", + "HIGH SCORE · 给": "HIGH SCORE · щедрейшие дарители для", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 первый даритель 💎 самый крупный 🔥 завсегдатай", + "丐帮排名 · 要到最多的要饭站": "Рейтинг гильдии · миски, собравшие больше всех", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Популярность · миски с наибольшим числом монеток (монетки бесплатны)", + "次": "подаяний", + "榜上无人,第一个投币的就是首席施主": "Пока никого. Первый, кто подаст, станет главным дарителем.", + "本站": "эта миска", + "叮!钢镚 +1": "Дзынь! Монетка +1", + "没丢进去": "Мимо миски", + "网络开小差了,再试一次": "Сеть заглючила, попробуйте ещё раз", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Неверная сумма (до 2 знаков после запятой)", + "最少施舍 %s %s": "Минимальное подаяние — %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Максимальное подаяние — %s %s. Если у вас правда столько, разбейте на несколько", + "支付网关开小差了:%s": "Платёжный шлюз заглючил: %s", + "手速太快了": "Слишком быстро", + "这个乞丐不在": "Этого нищего здесь нет", + "请先打开要饭页再丢": "Сначала откройте страницу миски", + "服务器开小差了": "Сервер заглючил", + "手速太快了,歇一会儿": "Слишком быстро, передохните", + "已提交,等站长确认": "Отправлено, ждём подтверждения хозяина", + "网关返回 %s": "Шлюз ответил %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Забыл пароль от своей миски на %s, пишу твит, чтобы доказать, что это я 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Поставил миску на %s 🥣 Подайте монетку, добрые люди~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Вступил в Кибер-гильдию нищих 🧎 Каждая копейка — любовь, бесплатная монетка тоже сойдёт 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Бросил работу, теперь прошу милостыню. Миска здесь, добрые люди, не проходите мимо 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Гильдия нищих набирает новичков, я первый 🥣 Подал — попал в Книгу добрых дел, нет денег — кинь бесплатную монетку %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "В этом твите нет кода %s. Проверьте, тот ли твит вы отправили", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "У @%s уже есть миска: %s. Забыли пароль? Сбросьте через X на странице входа.", + "@%s 已经开过站了": "У @%s уже есть миска", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "Адрес %s занят (возможно, у @%s уже есть миска; пароль можно восстановить через X на странице входа)", + "@%s 还没开过要饭站": "У @%s ещё нет миски", + "解绑币安 Key 失败:%s": "Не удалось отвязать Binance Key: %s", + "绑定失败:%s": "Ошибка привязки: %s", + "解绑失败:%s": "Ошибка отвязки: %s", + "校验失败:%s": "Ошибка проверки: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Пароль для /%s сброшен на %s (показывается один раз, передайте хозяину)", + "本站未配置支付网关": "Платёжный шлюз не настроен", + "网关连不上,请稍后再试": "Шлюз недоступен, попробуйте позже", + "方法不允许": "Метод не разрешён", + "主站不存在": "Главный сайт не найден", + "页面不存在": "Страница не найдена", + "赛博丐帮没有这条路。": "В Кибер-гильдии нищих нет такой дороги.", + "要么还没开张,要么已被丐帮除名。": "Либо ещё не открылась, либо изгнана гильдией.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Этот нищий ещё не поставил миску (нет способа оплаты), деньги принимать пока не может", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "Имя X может содержать только буквы, цифры и подчёркивания (можно без @)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Без ссылок и контактов в имени и сообщении. Нищие рекламу не берут", + "没有这笔施舍": "Подаяние не найдено", + "站点不存在": "Миска не найдена", + "请在发起施舍的那台设备上点「我已施舍」": "Нажмите «Я заплатил» на устройстве, с которого начато подаяние", + "币安订单编号是 18 位数字,不填也行": "Номер ордера Binance — 18 цифр (необязательно)", + "核对失败": "Проверка не удалась", + "这笔施舍不是网关模式": "Это подаяние не через шлюз", + "试得太频繁了,一分钟后再试": "Слишком много попыток, повторите через минуту", + "请在发起施舍的那台设备上回填": "Введите номер ордера с устройства, с которого начато подаяние", + "币安订单编号是 18 位数字": "Номер ордера Binance — 18 цифр", + "本站未开放开站": "Открытие мисок на этом сайте отключено", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Код истёк (или был создан в другом браузере). Сгенерируйте новый", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Неверная ссылка на твит. Она должна выглядеть как https://x.com/ваше_имя/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Этот твит старше кода. Используйте твит, опубликованный после создания кода", + "验证已失效,请重新验证": "Проверка истекла, пройдите её заново", + "口号和介绍里别放链接、联系方式": "Без ссылок и контактов в слогане", + "口令至少 6 位": "Пароль не короче 6 символов", + "两次口令不一致": "Пароли не совпадают", + "主站口令在服务器 config.env 里改,不走 X 找回": "Пароль главного сайта задаётся в config.env на сервере, а не через X", + "这个 X 今天重置得太频繁了,明天再来": "Слишком много сбросов для этого аккаунта X сегодня, приходите завтра", + "口令至少 6 位,且两次一致": "Пароль не короче 6 символов и должен совпадать", + "口令已重置,其它设备上的登录已失效": "Пароль сброшен. Другие устройства разлогинены", + "X 用户名或口令不对": "Неверное имя X или пароль", + "请先登录": "Сначала войдите", + "登录状态已失效,请重新登录。": "Сессия истекла, войдите снова.", + "歇一会儿再来。": "Передохните и возвращайтесь.", + "这个站点的错误口令太多,歇一会儿。": "Слишком много неверных паролей для этой миски. Передохните.", + "站点标题不能为空": "Название миски не может быть пустым", + "资料里别放链接、联系方式": "Без ссылок и контактов в профиле", + "资料已保存": "Профиль сохранён", + "主站的收款方式在服务器 config.env 里改": "Способ оплаты главного сайта задаётся в config.env на сервере", + "填一下币安 UID,不然钱没处去": "Укажите Binance UID, иначе деньгам некуда идти", + "已切换为直接转账:施主转完自报,你在这里确认": "Переключено на прямой перевод: дарители сообщают о платеже, вы подтверждаете здесь", + "本站不支持绑定": "Привязка на этом сайте недоступна", + "API Key 和 Secret 都要填": "Нужны и API Key, и Secret", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID состоит только из цифр (виден на странице профиля в приложении)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Привязано! Binance подтвердил Key; подаяния теперь подтверждаются автоматически", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Отвязано. Теперь режим прямого перевода, не забудьте указать UID", + "校验通过:币安 Key 可用,到账会自动确认": "Проверено: Binance Key работает, платежи будут подтверждаться автоматически", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Пароль главного сайта задаётся в config.env (ADMIN_PASSWORD) на сервере", + "口令已修改,其它设备上的登录已失效": "Пароль изменён. Другие устройства разлогинены", + "这笔施舍当前不能确认/拒绝": "Это подаяние сейчас нельзя подтвердить или отклонить", + "只能回复自己站的施舍": "Отвечать можно только на подаяния своей миски", + "回复里别放链接、联系方式": "Без ссылок и контактов в ответах", + "未知操作": "Неизвестное действие", + "无权操作": "Нет доступа", + "没有这个站": "Нет такой миски", + "未配置支付网关": "Платёжный шлюз не настроен", + "请求来源不对": "Неверный источник запроса", + "请从本站页面操作。": "Пользуйтесь страницами самого сайта.", + "页面渲染失败": "Не удалось отрисовать страницу", + "稍后再试。": "Попробуйте позже.", + "地址已被占用": "Адрес уже занят", + "这个 X 账号已经开过站了": "У этого аккаунта X уже есть миска", + "连不上 X 接口: %w": "Не удаётся связаться с X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Твит не найден (неверная ссылка или твит не публичный)", + "推文读不到(可能被删除或账号受保护)": "Не удалось прочитать твит (удалён или аккаунт закрыт)", + "头像地址不在允许的域名": "URL аватара не из разрешённого домена", + "头像下载失败": "Не удалось скачать аватар", + "头像不是有效图片": "Аватар — не корректное изображение", + "金额格式不对": "Неверная сумма", + "收款链接过长": "Ссылка для получения слишком длинная", + "收款链接须为 https 链接": "Ссылка для получения должна быть https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Ссылка для получения должна быть на домене Binance (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "Ссылка на профиль X должна выглядеть как https://x.com/ваше_имя", + "核对成功,已到账": "Проверено, платёж получен", + "查到了这笔转账但金额不足,已按实付记账": "Перевод найден, но сумма меньше; засчитано фактически оплаченное", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Перевод не найден: проверьте номер ордера и аккаунт получателя, затем повторите, когда Binance покажет его", + "这笔转账已经被别的订单用过了": "Этот перевод уже использован другим ордером", + "币种不对": "Неверная валюта", + "这笔施舍当前状态不能回填": "В текущем статусе подаяния нельзя ввести номер ордера", + "这个网络今天丢得够多了": "С этой сети сегодня уже накидали достаточно", + "今天已经丢过了,明天再来": "Сегодня уже кидали, приходите завтра", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "не оплачено", + "待确认": "ожидает", + "已到账": "получено", + "已过期": "истекло", + "已关闭": "закрыто", + "已拒绝": "отклонено", + "空碗未入帮": "Пустая миска", + "一袋弟子": "Ученик 1 мешка", + "二袋弟子": "Ученик 2 мешков", + "三袋弟子": "Ученик 3 мешков", + "四袋弟子": "Ученик 4 мешков", + "五袋弟子": "Ученик 5 мешков", + "六袋弟子": "Ученик 6 мешков", + "七袋弟子": "Ученик 7 мешков", + "八袋弟子": "Ученик 8 мешков", + "九袋长老": "Старейшина 9 мешков", + "帮主": "Глава гильдии", + "副帮主": "Заместитель главы", + "传功长老": "Старейшина-наставник", + "执法长老": "Старейшина закона", + "掌棒龙头": "Хранитель посоха", + "掌钵龙头": "Хранитель чаши", + "长老": "Старейшина", + "舵主": "Глава отделения", + "弟子": "Ученик", + "总舵": "Штаб", + "投了个硬币": "кинул монетку", + "善心人": "добрая душа", + "大善人": "великий благодетель", + "活菩萨": "живой святой", + "财神爷": "бог богатства", + "刚刚": "только что", + "%d 分钟前": "%d мин назад", + "%d 小时前": "%d ч назад", + "%d 天前": "%d дн назад", + } +} diff --git a/i18n_tr.go b/i18n_tr.go new file mode 100644 index 0000000..2304967 --- /dev/null +++ b/i18n_tr.go @@ -0,0 +1,490 @@ +package main + +// 土耳其语。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["tr"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Siber Dilenci", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Siber Dilenci: bir sadaka ver. Binance Pay ile bağış yap ve Sevap Defteri'ne bir satır bırak; paran yoksa ücretsiz jeton at; X'te tek tweetle kendi kaseni aç.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Bir sadaka ver. Bağış yap, Sevap Defteri'ne gir; ücretsiz bir jeton bile sevgidir.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Siber Dilenci", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Bir sadaka ver. Binance Pay ile bağış yap ve Sevap Defteri'ne bir satır bırak.", + "#赛博丐帮": "#CyberBeggars", + "(已屏蔽:%s)": "(gizli: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Sokağa dön", + "回到刚才看的碗": "Az önce baktığın kaseye dön", + "声音开关": "Ses düğmesi", + "声音": "Ses", + "排行榜": "Sıralama", + "我的后台": "Panelim", + "站长": "Sahip ", + "登录": "Giriş", + "我的站": "Kasem", + "开通要饭站": "Kase aç", + "🙏 行行好,赏口饭吃": "🙏 Bir sadaka ver, iyi insan", + "🪙 一毛也是爱": "🪙 Bir kuruş bile sevgidir", + "💸 投币就上榜": "💸 Bağış yap, listeye gir", + "📜 留一句话刻功德簿": "📜 Sevap Defteri'ne bir satır bırak", + "🏚 发条推就能开自己的要饭站": "🏚 Tek tweetle kendi kaseni aç", + "👾 赛博丐帮,人人有碗": "👾 Siber Dilenciler Loncası: herkese bir kase", + "· 赛博丐帮,行行好": "· Siber Dilenciler Loncası · Bir sadaka ver", + "作者": "Yapımcı", + "收款由": "Ödemeler:", + "驱动 · 字体": "· Yazı tipi", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Ses: kapalı", + "声音:开(点击静音)": "Ses: açık (susturmak için tıkla)", + "点一下开始播放": "Müziği başlatmak için dokun", + "已复制": "Kopyalandı", + "功德 +": "Sevap +", + "你的名号和留言已刻上功德簿": "Adın ve mesajın Sevap Defteri'ne yazıldı", + "看看功德簿": "Sevap Defteri'ne bak", + "分享卡片": "Paylaşım kartı", + "已提交,等站长确认后上榜。本页会自动更新。": "Gönderildi. Sahip onaylayınca listeye gireceksin. Bu sayfa kendini yeniler.", + "这笔施舍已": "Bu bağış: ", + "过期": "süresi doldu", + "下单失败": "oluşturulamadı", + "被站长拒绝": "sahip tarafından reddedildi", + "关闭": "kapatıldı", + ",请回到页面重新投币。": ". Lütfen geri dönüp tekrar bağış yap.", + "没成功,再试试": "Olmadı, tekrar dene", + "网络开小差了": "Ağ takıldı", + "分页": "Sayfalama", + "‹ 上一页": "‹ Önceki", + "下一页 ›": "Sonraki ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Sahip girişi ·", + "🔑 站长登录": "🔑 Sahip girişi", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "X kullanıcı adın ve kaseni açarken belirlediğin şifreyle panele gir. Ana site sahibi: kullanıcı adını boş bırak.", + "X 用户名": "X kullanıcı adı", + "例如 qianyuwing(主站留空)": "örn. qianyuwing (ana site için boş bırak)", + "口令": "Şifre", + "忘了口令?": "Şifreni mi unuttun?", + "用 X 发推找回": "Tweetle kurtar", + "。还没有要饭站?": ". Henüz kasen yok mu?", + "用 X 开一个": "X ile aç", + // ---- 后台 ---- + "后台 ·": "Panel ·", + "🎉 开张大吉!你的要饭站": "🎉 Hayırlı olsun! Kasen", + "已上线": "yayında", + "(待主站站长收录后进榜)": " (ana site sahibi listeye alınca sıralamalara girer)", + "下一步:": "Sıradaki adım: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "aşağıdaki \"Ödeme\" bölümüne Binance UID'ni yaz (on saniye), yoksa kimse sana ödeme yapamaz.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Sonra %s üzerinden gir (X kullanıcı adı %s + şifren). Unutursan yeni bir tweetle kurtarabilirsin.", + "后台": "panel", + "· 碗里": "· Kasede", + "位施主 ·": "bağışçı ·", + "次 · 钢镚": "bağış · jeton", + "待收录": "listede değil", + "🔑 改口令": "🔑 Şifre", + "退出": "Çıkış", + "⏳ 待确认": "⏳ Bekleyen", + "✏️ 资料": "✏️ Profil", + "💰 收款方式": "💰 Ödeme", + "📜 施舍记录": "📜 Bağışlar", + "🏚 所有站点": "🏚 Tüm kaseler", + "🧹 留言巡查": "🧹 Mesajlar", + "⏳ 待确认的施舍": "⏳ Onay bekleyen bağışlar", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Binance uygulamasından transferi kontrol et (tutar ve not kodu), sonra onayla; bağışçı listeye girsin.", + "备注码": "Not kodu", + "· 币安订单": "· Binance emri", + "✓ 确认到账": "✓ Alındı", + "✗ 没收到": "✗ Alınmadı", + "站点标题": "Kase adı", + "(来自 X @": "(X'ten @", + ",锁定)": ", kilitli)", + "头像 emoji": "Avatar emojisi", + "一句话口号": "Tek satırlık slogan", + "绑定 X": "X bağla", + "(主页链接或 @名字,留空不显示)": "(profil linki veya @ad; boşsa gösterilmez)", + "https://x.com/你的名字": "https://x.com/kullaniciadin", + "保存资料": "Profili kaydet", + "config.env 配置": "config.env'de ayarlı", + "已绑币安 Key · 自动确认": "Binance Key bağlı · otomatik onay", + "直接转账 · UID": "Doğrudan transfer · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Kase henüz kurulmadı — ayarlamak için dokun", + "主站的收款方式在服务器 config.env 里配置。当前:": "Ana sitenin ödeme yöntemi sunucudaki config.env'de ayarlanır. Şu an: ", + "BinancePayTool 网关自动确认(默认账号)": "BinancePayTool geçidi ile otomatik onay (varsayılan hesap)", + "直接转账": "doğrudan transfer", + "校验网关默认账号": "Geçidin varsayılan hesabını doğrula", + "✅ 已绑定币安账号(UID": "✅ Binance hesabı bağlı (UID", + "),施主付款后": "). Bağışlar ", + "自动确认上榜": "otomatik onaylanır", + "收银页会展示你的收款码 / 一键唤起。": " Ödeme panelinde QR kodun / tek dokunuşla açma gösterilir.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Bağışçılar QR okutabilsin veya uygulamayı tek dokunuşla açabilsin diye bir alma linki ekle.", + "重新校验 Key": "Key'i yeniden doğrula", + "解绑后改为直接转账(需你手动确认到账),确定?": "Bağlantıyı kaldırınca doğrudan transfere geçilir (her ödemeyi elle onaylarsın). Devam?", + "解绑": "Bağlantıyı kaldır", + "换一个 Key / 更新收款链接": "Key değiştir / alma linkini güncelle", + "当前是": "Şu anki mod: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Bağışçılar Binance uygulamasında UID'ne transfer yapar, \"Ödedim\"e dokunur, sen burada onaylarsın.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Kase henüz kurulmadı: Binance UID'ni yaz, para almaya başla. On saniye sürer.", + "方式一:填币安 UID(最简单)": "1. yol: Binance UID'n (en kolayı)", + "币安 App → 点左上角头像,头像下面那串数字就是": "Binance uygulaması → sol üstteki avatara dokun; altındaki sayı senin", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (aynı zamanda Pay ID). Bağışçılar bağış yaparken bunu görür ve Binance uygulamasında \"Öde → Transfer\" ile sıfır komisyonla gönderir.", + "币安 UID": "Binance UID", + "例如 12345678": "örn. 12345678", + "收款链接": "Alma linki", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(isteğe bağlı. Varsa bağışçılar QR okutabilir veya Binance'i tek dokunuşla açabilir; yoksa UID ile transfer yaparlar)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Nasıl alınır: Binance alma sayfasında \"Görseli kaydet\"e dokun, QR'ı herhangi bir tarayıcı uygulamasıyla oku ve linki buraya yapıştır.", + "保存": "Kaydet", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "2. yol: salt okunur Binance API Key bağla (otomatik onay)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Bağışlar otomatik onaylanır. Key'e yalnızca \"Enable Reading\" yetkisi yeter, para çekemez; bu site Key'i saklamaz, ödeme geçidi şifreli tutar.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "toplam · spam mesajları gizle veya kişiyi engelle (kayıtlar kalır) · yanıtla", + "已屏蔽此人": "Kişi engellendi", + "(已屏蔽:": "(gizli: ", + "🥣 站长:": "🥣 Sahip: ", + "恢复留言": "Mesajı göster", + "屏蔽留言": "Mesajı gizle", + "恢复此人": "Engeli kaldır", + "屏蔽此人": "Kişiyi engelle", + "回一句…": "Yanıtla…", + "回复": "Yanıtla", + "还没有施舍记录": "Henüz bağış yok", + "🔑 修改口令": "🔑 Şifre değiştir", + "新口令(至少 6 位)": "Yeni şifre (en az 6 karakter)", + "再输一遍": "Tekrar yaz", + "改完后其它设备上的登录会失效。": "Diğer cihazlardaki oturumlar kapanır.", + "确认修改": "Şifreyi değiştir", + "🏚 所有要饭站": "🏚 Tüm kaseler", + "个 · 违规可除名 · 可帮站长重置口令": "toplam · kural bozanları kov · sahibin şifresini sıfırla", + "已除名": "kovuldu", + "未收录": "listede değil", + "已绑 Key 自动确认": "Key bağlı, otomatik onay", + "位施主 · 钢镚": "bağışçı · jeton", + "开张": "açıldı", + "取消收录": "Listeden çıkar", + "收录上榜": "Listeye al", + "除名": "Kov", + "恢复": "Geri al", + "重置 /%s 的口令?新口令只显示一次。": "/%s için şifre sıfırlansın mı? Yeni şifre yalnızca bir kez gösterilir.", + "重置口令": "Şifreyi sıfırla", + "还没有子站": "Henüz kase yok", + "🧹 全站最新留言": "🧹 Site genelinde son mesajlar", + "条 · 跨站点巡查广告": "toplam · tüm kaselerde spam devriyesi", + "暂无留言": "Henüz mesaj yok", + "币安 App → 账户 → API 管理 → 创建 API:": "Binance uygulaması → Hesap → API Yönetimi → API Oluştur: ", + "只勾「允许读取」": "yalnızca \"Enable Reading\" seç", + ",其它权限都不要,": ", başka yetki verme, ", + "不用设 IP 白名单": "IP beyaz listesi gerekmez", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (salt okunur Key para çekemez). Yalnızca gelen transferlerini okumak için kullanılır, şifreli saklanır, asla gösterilmez.", + "(App 头像页可见)": "(uygulamadaki profil sayfanda görünür)", + "(选填,填了施主能扫码)": "(isteğe bağlı; bağışçılar QR okutabilir)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Alma linki nasıl alınır: Binance alma sayfasında \"Görseli kaydet\"e dokun ve QR'ı herhangi bir tarayıcı uygulamasıyla oku.", + "绑定并校验": "Bağla ve doğrula", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Şifreyi X ile kurtar", + "🔑 用 X 找回口令": "🔑 Şifreyi X ile kurtar", + "🏚 开通我的要饭站": "🏚 Kasemi aç", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Sahibi olduğunu kanıtlamak için kodlu bir tweet at, sonra yeni şifreni belirle.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Bağış şart değil. X hesabından tek bir tweet kaseni açar: adı X görünen adın, avatarı X avatarın, her hesaba bir kase. Tweet aynı zamanda kaseni sokağa çıkarır.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Uygulama içi tarayıcıdasın. Tek dokunuşla tweet X'i açmayabilir ve geri döndüğünde kaldığın yeri kaybedebilirsin.", + "建议点右上角「⋯」选「在浏览器中打开」": "Sağ üstteki \"⋯\"a dokunup \"Tarayıcıda aç\"ı seç", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (veya linki Safari / Chrome'a kopyala), sonra devam et.", + "复制本页链接": "Bu sayfanın linkini kopyala", + "发一条推文,带上验证码": "Kodu içeren bir tweet at", + "推文内容(可以随便改,只要保留验证码)": "Tweet metni (istediğin gibi değiştir, kodu koru yeter)", + "换一条": "Başka bir tane", + "🐦 一键去 X 发推": "🐦 X'te paylaş", + "复制文案": "Metni kopyala", + "没拉起 X App?点这里用网页版发 →": "X uygulaması açılmadı mı? Web'den paylaş →", + "验证码": "Kod", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "büyük/küçük harf fark etmez, 24 saat geçerli. Metinde kasenin linki var, tweet aynı zamanda reklam olur.", + "把推文链接贴回来": "Tweet linkini buraya yapıştır", + "推文链接": "Tweet linki", + "https://x.com/你的名字/status/1234567890": "https://x.com/kullaniciadin/status/1234567890", + "验证": "Doğrula", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Tweeti attıktan sonra paylaş düğmesi → Linki kopyala.", + "还没开过站?": "Henüz kasen yok mu? ", + "去开一个": "Bir tane aç", + "已经开过站?": "Zaten kasen var mı? ", + "站长登录": "Sahip girişi", + "🔑 设置新口令": "🔑 Yeni şifre belirle", + "保存并登录": "Kaydet ve giriş yap", + "✅ X 验证通过": "✅ X doğrulandı", + "· 站名和头像来自 X(头像会定期同步)": "· ad ve avatar X'ten gelir (avatar düzenli olarak eşitlenir)", + "站点地址": "Kase adresi", + "(就是你的 X 用户名,不用填)": "(X kullanıcı adın; doldurmana gerek yok)", + "行行好,赏口饭吃 🙏": "Bir sadaka ver, iyi insan 🙏", + "登录口令": "Giriş şifresi", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Sonra X kullanıcı adı + şifreyle gir; unutursan yeni bir tweetle kurtar.", + "口令(至少 6 位)": "Şifre (en az 6 karakter)", + "开张 🏚": "Kaseyi aç 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Açtıktan sonra panelden Binance Key bağla veya UID'ni yaz, para almaya başla. İçerikten sen sorumlusun; spam kaseleri lonca kovar.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "%s için bağış", + "先回去看看": "Şimdilik geri dön", + "给 %s 投币": "Bağış alıcısı: %s", + "金额要": "Tutar ", + "一分不差": "kuruşu kuruşuna", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": " aynı olmalı: geçit bu benzersiz küsuratla ödemeyi tanır, transferden saniyeler sonra onaylar", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Binance Pay ile doğrudan sahibe gönder, sonra aşağıdaki \"Ödedim\"e dokun", + "打开币安 App 转账": "Ödeme için Binance'i aç", + "唤起后手动输入金额": "Uygulamada tutarı gir", + ",备注填": ", not", + "用另一台手机扫码": "Başka bir telefonla okut", + "收款二维码": "Ödeme QR kodu", + "币安 App → 首页「扫一扫」→ 输入金额": "Binance uygulaması → Tara → tutarı gir", + "或手动转账": "Veya elle transfer et", + "转账信息": "Transfer bilgileri", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "Binance uygulaması → \"Öde\" → \"Transfer\" → alıcı: aşağıdaki UID → tutar", + "→ 备注填": "→ not", + "→ 转完回来点「我已施舍」": "→ dönüp \"Ödedim\"e dokun", + "收款方": "Alıcı", + "复制": "Kopyala", + "金额": "Tutar", + "备注": "Not", + "等待到账…转完自动确认,本页会自动更新": "Ödeme bekleniyor… gönderince otomatik onaylanır; bu sayfa kendini yeniler", + "付了但一直没确认?": "Ödedin ama onaylanmadı mı?", + "币安订单编号(18 位数字,转账详情里有)": "Binance emir numarası (18 hane, transfer detaylarında)", + "我付过了,帮我核对": "Ödedim, kontrol edin", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Binance emir numarası (isteğe bağlı, 18 hane; onayı hızlandırır)", + "我已施舍,等站长确认": "Ödedim, sahibin onayını bekliyorum", + "「我已施舍」要在发起施舍的那台设备上点。": "\"Ödedim\"e bağışı başlattığın cihazdan dokunmalısın.", + "打不开?": "Açılmıyor mu? ", + "用网关收银页支付": "Geçidin ödeme sayfasından öde", + "施舍进行中": "Bağış devam ediyor", + "🙏 谢谢施主": "🙏 Teşekkürler, iyi kalpli bağışçı", + "你在 %s 的施主榜排第 %d 位": "%s bağışçı listesinde %d. sıradasın", + "回到 %s 的碗": "%s kasesine dön", + "复制链接分享": "Paylaşmak için linki kopyala", + "🖼 分享卡片": "🖼 Paylaşım kartı", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "X'te veya arkadaşlarınla paylaşmak için piksel bir kart oluştur, dilenciye de reklam olsun.", + "生成分享卡": "Kart oluştur", + "分享卡": "Paylaşım kartı", + "长按图片保存,或": "Kaydetmek için görsele uzun bas ya da ", + "下载": "indir", + "🏚 你也可以要饭": "🏚 Sen de dilenebilirsin", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "X hesabından tek tweetle kendi kaseni aç; para doğrudan Binance hesabına gider.", + "站长没有确认这笔施舍": "Sahip bu bağışı onaylamadı", + "这笔施舍已过期": "Bu bağışın süresi doldu", + "如果你确实转了,请联系站长核对。": "Gerçekten gönderdiysen kontrol için sahiple iletişime geç.", + "没付款不扣钱;想施舍请重新来一次。": "Para çekilmedi; bağış yapmak istersen baştan başla.", + "再来一次": "Tekrar dene", + // ---- 排行榜 ---- + "排行榜 ·": "Sıralama ·", + "🏆 施主榜": "🏆 Bağışçılar", + "🥣 乞丐榜": "🥣 Dilenciler", + "🪙 人气榜": "🪙 Popülerlik", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · tüm kaseler toplam ·", + "位施主": "bağışçı", + "总榜": "Tüm zamanlar", + "本周": "Bu hafta", + "要到最多的要饭站 · 共": "En çok toplayan kaseler ·", + "个": "", + "收到钢镚最多(免费投)· 共": "En çok jeton alanlar (ücretsiz) ·", + "← 回到刚才看的碗": "← Az önce baktığın kaseye dön", + "施主自己填的 X,未经验证": "Bağışçının kendi girdiği X, doğrulanmadı", + "次 · 施舍过": "bağış ·", + "个乞丐": "dilenciye verdi", + "榜上无人": "Henüz kimse yok", + "就是我": "benim", + "还没有人上榜": "Listede henüz kimse yok", + // ---- 站点页 ---- + "在要饭 ·": "dileniyor ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Bu kase henüz lonca listesinde değil, o yüzden sıralamalarda yok.", + "主站站长审核后会收录。": "Ana site sahibi inceledikten sonra listeye alacak.", + "· 榜 #": "· Sıra #", + "升%s要 %s": "%s için %s EXP", + "满级": "Maks seviye", + "饱食度": "Tokluk", + "今天还没吃饭": "Bugün hiç yemedi", + "今天有人投币了": "Bugün biri bağış yaptı", + "今天丢过了": "Bugün zaten attın", + "丢个钢镚(免费)": "Jeton at (ücretsiz)", + "💸 投币施舍": "💸 Bağış yap", + "还没摆碗,暂不能投币": "Kase kurulmadı, bağış yapılamaz", + "去配置": "Ayarla", + "钢镚": "Jeton", + "· 今日": "· bugün", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 jeton =", + "碗里已有": "Kasede", + "施主": "Bağışçı", + "人": "", + "今日": "Bugün", + "🕹️ 投币施舍": "🕹️ Bozuk para at", + "玩家名(上榜用,可留空)": "Oyuncu adı (liste için, isteğe bağlı)", + "匿名施主": "Anonim", + "你的 X(可选,显示头像)": "X'in (isteğe bağlı, avatarını gösterir)", + "投多少": "Tutar,", + "✏️ 自定义": "✏️ Özel", + "输入金额,最多两位小数": "Tutar, en fazla 2 ondalık", + "对乞丐喊话": "Dilenciye bir şey söyle", + "例如:别买烟了,去吃饭": "örn. Sigarayı bırak, yemek al", + "投币 💸": "Bağış yap 💸", + "投币": "Bağış yap", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Binance uygulamasıyla okut veya tek dokunuşla aç; ödeme gelince Sevap Defteri'ne otomatik yazılır.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Binance Pay ile doğrudan sahibe gönder; sahip onaylayınca listeye girersin.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "En az %s, en fazla %s. Mesajda link veya iletişim bilgisi olmasın.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Bu dilenci henüz kase kurmamış (ödeme yöntemi yok), para alamıyor.", + "去后台配置 →": "Panelden ayarla →", + "🏚 想自己要饭?": "🏚 Sen de dilenmek ister misin?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "X hesabından tek tweetle kendi kaseni aç: kendi adresin, kendi Sevap Defteri'n ve bağışçı listen, para doğrudan Binance hesabına.", + "用 X 开通我的要饭站 →": "X ile kasemi aç →", + "人气榜": "Popülerlik", + "功德簿": "Sevap Defteri", + "施主榜": "Bağışçılar", + "乞丐榜": "Dilenciler", + "已屏蔽的施主": "Engellenen bağışçı", + "功德簿空空如也,第一枚硬币会刻在这里": "Sevap Defteri bomboş. İlk para buraya yazılacak.", + "HIGH SCORE · 给": "HIGH SCORE · en cömert bağışçılar:", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 ilk bağışçı 💎 en büyük bağış 🔥 müdavim", + "丐帮排名 · 要到最多的要饭站": "Lonca sıralaması · en çok toplayan kaseler", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Popülerlik · en çok jeton alan kaseler (jeton ücretsiz)", + "次": "bağış", + "榜上无人,第一个投币的就是首席施主": "Henüz kimse yok. İlk bağış yapan baş bağışçı olur.", + "本站": "bu kase", + "叮!钢镚 +1": "Çın! Jeton +1", + "没丢进去": "Kaseyi ıskaladın", + "网络开小差了,再试一次": "Ağ takıldı, tekrar dene", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Geçersiz tutar (en fazla 2 ondalık)", + "最少施舍 %s %s": "En az bağış %s %s", + "最多施舍 %s %s,真有这么多请分几次": "En fazla bağış %s %s. Gerçekten o kadar varsa birkaç seferde gönder", + "支付网关开小差了:%s": "Ödeme geçidi takıldı: %s", + "手速太快了": "Çok hızlısın", + "这个乞丐不在": "Bu dilenci burada değil", + "请先打开要饭页再丢": "Önce kase sayfasını aç", + "服务器开小差了": "Sunucu takıldı", + "手速太快了,歇一会儿": "Çok hızlısın, biraz dinlen", + "已提交,等站长确认": "Gönderildi, sahibin onayı bekleniyor", + "网关返回 %s": "Geçit yanıtı: %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "%s üzerindeki kasemin şifresini unuttum, ben olduğumu kanıtlamak için tweet atıyorum 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "%s üzerinde bir kase kurdum 🥣 Bir sadaka verin, iyi insanlar~ %s #CyberBeggars %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Siber Dilenciler Loncası'na katıldım 🧎 Bir kuruş bile sevgidir, ücretsiz bir jeton da olur 🪙 %s #CyberBeggars %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "İşi bıraktım, artık dileniyorum. Kase burada, iyi insanlar el uzatın 🥣 %s #CyberBeggars %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Dilenciler loncası üye alıyor, ilk ben başlıyorum 🥣 Bağış yapan Sevap Defteri'ne girer, yapmayan ücretsiz jeton atsın %s #CyberBeggars %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Bu tweette %s kodu yok. Doğru tweeti attığından emin ol", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s zaten bir kase açmış: %s. Şifreni unuttuysan giriş sayfasında X ile sıfırla.", + "@%s 已经开过站了": "@%s zaten bir kase açmış", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "%s adresi dolu (@%s zaten bir kase açmış olabilir; şifreyi giriş sayfasında X ile kurtar)", + "@%s 还没开过要饭站": "@%s henüz kase açmamış", + "解绑币安 Key 失败:%s": "Binance Key bağlantısı kaldırılamadı: %s", + "绑定失败:%s": "Bağlama başarısız: %s", + "解绑失败:%s": "Bağlantı kaldırma başarısız: %s", + "校验失败:%s": "Doğrulama başarısız: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "/%s şifresi %s olarak sıfırlandı (yalnızca bir kez gösterilir, sahibe ilet)", + "本站未配置支付网关": "Ödeme geçidi ayarlanmamış", + "网关连不上,请稍后再试": "Geçide ulaşılamıyor, sonra tekrar dene", + "方法不允许": "Yönteme izin verilmiyor", + "主站不存在": "Ana site bulunamadı", + "页面不存在": "Sayfa bulunamadı", + "赛博丐帮没有这条路。": "Siber Dilenciler Loncası'nda böyle bir yol yok.", + "要么还没开张,要么已被丐帮除名。": "Ya henüz açılmadı ya da lonca tarafından kovuldu.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Bu dilenci henüz kase kurmamış (ödeme yöntemi yok), şimdilik para alamıyor", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "X kullanıcı adı yalnızca harf, rakam ve alt çizgi içerebilir (@ olsa da olur olmasa da)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Ad ve mesajda link veya iletişim bilgisi olmasın. Dilenciler reklam almaz", + "没有这笔施舍": "Bağış bulunamadı", + "站点不存在": "Kase bulunamadı", + "请在发起施舍的那台设备上点「我已施舍」": "\"Ödedim\"e bağışı başlattığın cihazdan dokun", + "币安订单编号是 18 位数字,不填也行": "Binance emir numarası 18 hanedir (isteğe bağlı)", + "核对失败": "Kontrol başarısız", + "这笔施舍不是网关模式": "Bu bağış geçit üzerinden değil", + "试得太频繁了,一分钟后再试": "Çok fazla deneme, bir dakika sonra tekrar dene", + "请在发起施舍的那台设备上回填": "Emir numarasını bağışı başlattığın cihazdan gir", + "币安订单编号是 18 位数字": "Binance emir numarası 18 hanedir", + "本站未开放开站": "Bu sitede kase açma kapalı", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Kodun süresi dolmuş (veya başka bir tarayıcıda oluşturulmuş). Yeni bir kod oluştur", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Geçersiz tweet linki. Şöyle görünmeli: https://x.com/kullaniciadin/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Bu tweet koddan daha eski. Kodu oluşturduktan sonra atılan bir tweet kullan", + "验证已失效,请重新验证": "Doğrulama süresi doldu, tekrar doğrula", + "口号和介绍里别放链接、联系方式": "Sloganda link veya iletişim bilgisi olmasın", + "口令至少 6 位": "Şifre en az 6 karakter olmalı", + "两次口令不一致": "Şifreler eşleşmiyor", + "主站口令在服务器 config.env 里改,不走 X 找回": "Ana sitenin şifresi sunucudaki config.env'de değiştirilir, X ile değil", + "这个 X 今天重置得太频繁了,明天再来": "Bu X hesabı bugün çok fazla sıfırlandı, yarın gel", + "口令至少 6 位,且两次一致": "Şifre en az 6 karakter olmalı ve eşleşmeli", + "口令已重置,其它设备上的登录已失效": "Şifre sıfırlandı. Diğer cihazlardaki oturumlar kapatıldı", + "X 用户名或口令不对": "X kullanıcı adı veya şifre yanlış", + "请先登录": "Önce giriş yap", + "登录状态已失效,请重新登录。": "Oturumun süresi doldu, tekrar giriş yap.", + "歇一会儿再来。": "Biraz dinlen, sonra gel.", + "这个站点的错误口令太多,歇一会儿。": "Bu kase için çok fazla yanlış şifre girildi. Biraz dinlen.", + "站点标题不能为空": "Kase adı boş olamaz", + "资料里别放链接、联系方式": "Profilde link veya iletişim bilgisi olmasın", + "资料已保存": "Profil kaydedildi", + "主站的收款方式在服务器 config.env 里改": "Ana sitenin ödeme yöntemi sunucudaki config.env'de değiştirilir", + "填一下币安 UID,不然钱没处去": "Binance UID'ni yaz, yoksa paranın gidecek yeri yok", + "已切换为直接转账:施主转完自报,你在这里确认": "Doğrudan transfere geçildi: bağışçılar ödemeyi bildirir, sen burada onaylarsın", + "本站不支持绑定": "Bu sitede bağlama yok", + "API Key 和 Secret 都要填": "API Key ve Secret ikisi de gerekli", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID yalnızca rakamlardan oluşur (uygulamadaki profil sayfanda görünür)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Bağlandı! Binance Key'i doğruladı; bağışlar artık otomatik onaylanacak", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Bağlantı kaldırıldı. Artık doğrudan transfer modundasın, UID'nin dolu olduğundan emin ol", + "校验通过:币安 Key 可用,到账会自动确认": "Doğrulandı: Binance Key çalışıyor, ödemeler otomatik onaylanacak", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Ana sitenin şifresi sunucudaki config.env'de (ADMIN_PASSWORD) değiştirilir", + "口令已修改,其它设备上的登录已失效": "Şifre değiştirildi. Diğer cihazlardaki oturumlar kapatıldı", + "这笔施舍当前不能确认/拒绝": "Bu bağış şu an onaylanamaz veya reddedilemez", + "只能回复自己站的施舍": "Yalnızca kendi kasendeki bağışlara yanıt verebilirsin", + "回复里别放链接、联系方式": "Yanıtta link veya iletişim bilgisi olmasın", + "未知操作": "Bilinmeyen işlem", + "无权操作": "Yetkin yok", + "没有这个站": "Böyle bir kase yok", + "未配置支付网关": "Ödeme geçidi ayarlanmamış", + "请求来源不对": "Geçersiz istek kaynağı", + "请从本站页面操作。": "Lütfen sitenin kendi sayfalarını kullan.", + "页面渲染失败": "Sayfa oluşturulamadı", + "稍后再试。": "Sonra tekrar dene.", + "地址已被占用": "Adres zaten alınmış", + "这个 X 账号已经开过站了": "Bu X hesabının zaten bir kasesi var", + "连不上 X 接口: %w": "X'e ulaşılamıyor: %w", + "找不到这条推文(链接不对,或推文不公开)": "Tweet bulunamadı (link yanlış veya tweet herkese açık değil)", + "推文读不到(可能被删除或账号受保护)": "Tweet okunamıyor (silinmiş veya hesap korumalı)", + "头像地址不在允许的域名": "Avatar URL'si izin verilen bir alan adında değil", + "头像下载失败": "Avatar indirilemedi", + "头像不是有效图片": "Avatar geçerli bir görsel değil", + "金额格式不对": "Geçersiz tutar", + "收款链接过长": "Alma linki çok uzun", + "收款链接须为 https 链接": "Alma linki https olmalı", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Alma linki bir Binance alan adı olmalı (app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "X profil linki şöyle görünmeli: https://x.com/kullaniciadin", + "核对成功,已到账": "Doğrulandı, ödeme alındı", + "查到了这笔转账但金额不足,已按实付记账": "Transfer bulundu ama tutar eksik; ödenen tutar kaydedildi", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Transfer bulunamadı: emir numarasını ve alıcı hesabı kontrol et, Binance'te göründükten sonra tekrar dene", + "这笔转账已经被别的订单用过了": "Bu transfer başka bir emirde zaten kullanılmış", + "币种不对": "Yanlış para birimi", + "这笔施舍当前状态不能回填": "Bu bağışın durumu emir numarası girmeye izin vermiyor", + "这个网络今天丢得够多了": "Bu ağ bugün yeterince jeton attı", + "今天已经丢过了,明天再来": "Bugün zaten attın, yarın gel", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "ödenmedi", + "待确认": "bekliyor", + "已到账": "alındı", + "已过期": "süresi doldu", + "已关闭": "kapatıldı", + "已拒绝": "reddedildi", + "空碗未入帮": "Boş kase", + "一袋弟子": "1 Çuvallı Çırak", + "二袋弟子": "2 Çuvallı Çırak", + "三袋弟子": "3 Çuvallı Çırak", + "四袋弟子": "4 Çuvallı Çırak", + "五袋弟子": "5 Çuvallı Çırak", + "六袋弟子": "6 Çuvallı Çırak", + "七袋弟子": "7 Çuvallı Çırak", + "八袋弟子": "8 Çuvallı Çırak", + "九袋长老": "9 Çuvallı Pir", + "帮主": "Lonca Reisi", + "副帮主": "Reis Yardımcısı", + "传功长老": "Öğreti Piri", + "执法长老": "Yasa Piri", + "掌棒龙头": "Asa Başı", + "掌钵龙头": "Kase Başı", + "长老": "Pir", + "舵主": "Şube Reisi", + "弟子": "Çırak", + "总舵": "Merkez", + "投了个硬币": "bir para attı", + "善心人": "iyi yürekli", + "大善人": "büyük hayırsever", + "活菩萨": "yaşayan evliya", + "财神爷": "bereket tanrısı", + "刚刚": "az önce", + "%d 分钟前": "%d dk önce", + "%d 小时前": "%d sa önce", + "%d 天前": "%d gün önce", + } +} diff --git a/i18n_vi.go b/i18n_vi.go new file mode 100644 index 0000000..9a9b153 --- /dev/null +++ b/i18n_vi.go @@ -0,0 +1,490 @@ +package main + +// 越南语。key 是中文原文,占位符 %s/%d 顺序须与中文一致。 +func init() { + translations["vi"] = map[string]string{ + // ---- 站名 / meta ---- + "赛博要饭": "Ăn Xin Cyber", + "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。": "Ăn Xin Cyber: làm ơn làm phước, cho xin miếng cơm. Bố thí bằng Binance Pay và để lại một câu trong Sổ Công Đức; hết tiền thì ném xu miễn phí; một tweet trên X là có bát ăn xin riêng.", + "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。": "Làm ơn làm phước, cho xin miếng cơm. Bố thí là vào Sổ Công Đức; ném xu miễn phí cũng là tình thương.", + "%s:%s · 赛博要饭,行行好": "%s: %s · Ăn Xin Cyber", + "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。": "Làm ơn làm phước, cho xin miếng cơm. Bố thí bằng Binance Pay và để lại một câu trong Sổ Công Đức.", + "#赛博丐帮": "#CaiBangCyber", + "(已屏蔽:%s)": "(đã ẩn: %s)", + // ---- 导航 / 页脚 / 通用 ---- + "回到街头": "Về lại phố", + "回到刚才看的碗": "Về lại cái bát vừa xem", + "声音开关": "Bật/tắt âm thanh", + "声音": "Âm thanh", + "排行榜": "Bảng xếp hạng", + "我的后台": "Trang quản lý", + "站长": "Chủ bát ", + "登录": "Đăng nhập", + "我的站": "Bát của tôi", + "开通要饭站": "Mở một cái bát", + "🙏 行行好,赏口饭吃": "🙏 Làm ơn làm phước, cho xin miếng cơm", + "🪙 一毛也是爱": "🪙 Một xu cũng là tình thương", + "💸 投币就上榜": "💸 Bố thí là lên bảng", + "📜 留一句话刻功德簿": "📜 Để lại một câu trong Sổ Công Đức", + "🏚 发条推就能开自己的要饭站": "🏚 Một tweet là có bát ăn xin riêng", + "👾 赛博丐帮,人人有碗": "👾 Cái Bang Cyber, ai cũng có bát", + "· 赛博丐帮,行行好": "· Cái Bang Cyber · Làm ơn làm phước", + "作者": "Tác giả", + "收款由": "Thanh toán bởi", + "驱动 · 字体": "· Phông chữ", + "缝合怪像素字体": "Fusion Pixel Font", + "声音:关": "Âm thanh: tắt", + "声音:开(点击静音)": "Âm thanh: bật (bấm để tắt tiếng)", + "点一下开始播放": "Chạm để phát nhạc", + "已复制": "Đã sao chép", + "功德 +": "Công đức +", + "你的名号和留言已刻上功德簿": "Tên và lời nhắn của bạn đã được khắc vào Sổ Công Đức", + "看看功德簿": "Xem Sổ Công Đức", + "分享卡片": "Thẻ chia sẻ", + "已提交,等站长确认后上榜。本页会自动更新。": "Đã gửi. Chủ bát xác nhận xong là bạn lên bảng. Trang này tự cập nhật.", + "这笔施舍已": "Lượt bố thí này đã ", + "过期": "hết hạn", + "下单失败": "tạo đơn thất bại", + "被站长拒绝": "bị chủ bát từ chối", + "关闭": "bị đóng", + ",请回到页面重新投币。": ". Hãy quay lại trang và bố thí lại nhé.", + "没成功,再试试": "Chưa được, thử lại nhé", + "网络开小差了": "Mạng lag rồi", + "分页": "Phân trang", + "‹ 上一页": "‹ Trước", + "下一页 ›": "Sau ›", + "页": "", + // ---- 登录 ---- + "站长登录 ·": "Chủ bát đăng nhập ·", + "🔑 站长登录": "🔑 Chủ bát đăng nhập", + "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。": "Đăng nhập bằng tên người dùng X + mật khẩu bạn đặt lúc mở bát. Chủ trang chính: để trống tên người dùng.", + "X 用户名": "Tên người dùng X", + "例如 qianyuwing(主站留空)": "vd: qianyuwing (trang chính để trống)", + "口令": "Mật khẩu", + "忘了口令?": "Quên mật khẩu?", + "用 X 发推找回": "Lấy lại bằng một tweet", + "。还没有要饭站?": ". Chưa có bát?", + "用 X 开一个": "Mở một cái bằng X", + // ---- 后台 ---- + "后台 ·": "Quản lý ·", + "🎉 开张大吉!你的要饭站": "🎉 Khai trương đại cát! Bát ăn xin của bạn", + "已上线": "đã lên sóng", + "(待主站站长收录后进榜)": " (sẽ vào bảng sau khi chủ trang chính duyệt)", + "下一步:": "Bước tiếp: ", + "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。": "điền Binance UID ở mục \"Nhận tiền\" bên dưới (mười giây thôi), không thì chẳng ai gửi tiền cho bạn được.", + "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。": "Lần sau vào qua %s (tên người dùng X %s + mật khẩu của bạn). Quên mật khẩu? Tweet lại là lấy được.", + "后台": "trang quản lý", + "· 碗里": "· Trong bát", + "位施主 ·": "thí chủ ·", + "次 · 钢镚": "lượt · xu", + "待收录": "chưa duyệt", + "🔑 改口令": "🔑 Mật khẩu", + "退出": "Đăng xuất", + "⏳ 待确认": "⏳ Chờ xác nhận", + "✏️ 资料": "✏️ Hồ sơ", + "💰 收款方式": "💰 Nhận tiền", + "📜 施舍记录": "📜 Bố thí", + "🏚 所有站点": "🏚 Mọi bát", + "🧹 留言巡查": "🧹 Lời nhắn", + "⏳ 待确认的施舍": "⏳ Bố thí chờ xác nhận", + "打开币安 App 核对到账(看金额和备注码),确认后上榜。": "Mở app Binance kiểm tra tiền về (xem số tiền và mã ghi chú), xác nhận xong là họ lên bảng.", + "备注码": "Mã ghi chú", + "· 币安订单": "· Đơn Binance", + "✓ 确认到账": "✓ Đã nhận", + "✗ 没收到": "✗ Chưa nhận", + "站点标题": "Tên bát", + "(来自 X @": "(từ X @", + ",锁定)": ", đã khóa)", + "头像 emoji": "Emoji đại diện", + "一句话口号": "Khẩu hiệu một câu", + "绑定 X": "Liên kết X", + "(主页链接或 @名字,留空不显示)": "(link trang cá nhân hoặc @tên; để trống thì không hiện)", + "https://x.com/你的名字": "https://x.com/tencuaban", + "保存资料": "Lưu hồ sơ", + "config.env 配置": "cấu hình trong config.env", + "已绑币安 Key · 自动确认": "Đã liên kết Binance Key · tự xác nhận", + "直接转账 · UID": "Chuyển khoản trực tiếp · UID", + "⚠️ 还没摆碗,点开设置": "⚠️ Chưa bày bát — bấm để cài đặt", + "主站的收款方式在服务器 config.env 里配置。当前:": "Cách nhận tiền của trang chính được cấu hình trong config.env trên máy chủ. Hiện tại: ", + "BinancePayTool 网关自动确认(默认账号)": "Cổng BinancePayTool tự xác nhận (tài khoản mặc định)", + "直接转账": "chuyển khoản trực tiếp", + "校验网关默认账号": "Kiểm tra tài khoản mặc định của cổng", + "✅ 已绑定币安账号(UID": "✅ Đã liên kết tài khoản Binance (UID", + "),施主付款后": "). Tiền bố thí sẽ được ", + "自动确认上榜": "tự động xác nhận lên bảng", + "收银页会展示你的收款码 / 一键唤起。": " Trang thanh toán sẽ hiện mã QR của bạn / mở app một chạm.", + "建议补一个收款链接,让施主能扫码 / 一键唤起。": " Nên thêm link nhận tiền để thí chủ quét mã / mở app một chạm.", + "重新校验 Key": "Kiểm tra lại Key", + "解绑后改为直接转账(需你手动确认到账),确定?": "Hủy liên kết sẽ chuyển sang chuyển khoản trực tiếp (bạn phải tự xác nhận từng khoản). Tiếp tục?", + "解绑": "Hủy liên kết", + "换一个 Key / 更新收款链接": "Đổi Key / cập nhật link nhận tiền", + "当前是": "Chế độ hiện tại: ", + "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。": ". Thí chủ chuyển tiền tới UID của bạn trong app Binance, bấm \"Tôi đã bố thí\", bạn xác nhận ở đây là họ lên bảng.", + "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。": "⚠️ Chưa bày bát: điền Binance UID là nhận được tiền, mười giây thôi.", + "方式一:填币安 UID(最简单)": "Cách 1: điền Binance UID (dễ nhất)", + "币安 App → 点左上角头像,头像下面那串数字就是": "App Binance → bấm ảnh đại diện góc trên trái, dãy số dưới ảnh chính là", + "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。": " (cũng là Pay ID). Thí chủ sẽ thấy nó khi bố thí, nhập vào \"Pay → Chuyển khoản\" trong app Binance là gửi được cho bạn, phí 0 đồng.", + "币安 UID": "Binance UID", + "例如 12345678": "vd: 12345678", + "收款链接": "Link nhận tiền", + "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)": "(tùy chọn. Có link thì thí chủ quét mã / mở app Binance một chạm; không có vẫn chuyển được theo UID)", + "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。": "Cách lấy: ở trang nhận tiền của app Binance bấm \"Lưu ảnh\", dùng app quét QR bất kỳ đọc link trong ảnh rồi dán vào đây.", + "保存": "Lưu", + "方式二:绑定币安只读 API Key(到账自动确认上榜)": "Cách 2: liên kết API Key chỉ đọc của Binance (tiền về là tự xác nhận)", + "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。": "Thí chủ trả xong là tự lên bảng, bạn khỏi phải xác nhận tay. Key chỉ cần quyền \"Enable Reading\", không rút được tiền; trang này không lưu Key, chỉ giao cho cổng thanh toán lưu mã hóa.", + "共": "", + "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复": "lượt · quảng cáo thì ẩn lời nhắn hoặc chặn người này (vẫn giữ bản ghi) · có thể trả lời", + "已屏蔽此人": "Đã chặn người này", + "(已屏蔽:": "(đã ẩn: ", + "🥣 站长:": "🥣 Chủ bát: ", + "恢复留言": "Hiện lại lời nhắn", + "屏蔽留言": "Ẩn lời nhắn", + "恢复此人": "Bỏ chặn", + "屏蔽此人": "Chặn người này", + "回一句…": "Trả lời…", + "回复": "Trả lời", + "还没有施舍记录": "Chưa có lượt bố thí nào", + "🔑 修改口令": "🔑 Đổi mật khẩu", + "新口令(至少 6 位)": "Mật khẩu mới (ít nhất 6 ký tự)", + "再输一遍": "Nhập lại lần nữa", + "改完后其它设备上的登录会失效。": "Các thiết bị khác sẽ bị đăng xuất.", + "确认修改": "Đổi mật khẩu", + "🏚 所有要饭站": "🏚 Mọi bát ăn xin", + "个 · 违规可除名 · 可帮站长重置口令": "bát · vi phạm thì trục xuất · có thể đặt lại mật khẩu cho chủ bát", + "已除名": "đã trục xuất", + "未收录": "chưa duyệt", + "已绑 Key 自动确认": "Đã liên kết Key, tự xác nhận", + "位施主 · 钢镚": "thí chủ · xu", + "开张": "mở", + "取消收录": "Gỡ khỏi bảng", + "收录上榜": "Đưa lên bảng", + "除名": "Trục xuất", + "恢复": "Khôi phục", + "重置 /%s 的口令?新口令只显示一次。": "Đặt lại mật khẩu cho /%s? Mật khẩu mới chỉ hiện một lần.", + "重置口令": "Đặt lại mật khẩu", + "还没有子站": "Chưa có bát nào", + "🧹 全站最新留言": "🧹 Lời nhắn mới nhất toàn trang", + "条 · 跨站点巡查广告": "lượt · tuần tra quảng cáo ở mọi bát", + "暂无留言": "Chưa có lời nhắn", + "币安 App → 账户 → API 管理 → 创建 API:": "App Binance → Tài khoản → Quản lý API → Tạo API: ", + "只勾「允许读取」": "chỉ tích \"Enable Reading\"", + ",其它权限都不要,": ", không tích gì khác, ", + "不用设 IP 白名单": "không cần whitelist IP", + "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。": " (Key chỉ đọc không rút được tiền). Key chỉ dùng để đọc lịch sử nhận tiền của bạn, lưu mã hóa trên máy chủ, không bao giờ hiển thị.", + "(App 头像页可见)": "(xem ở trang hồ sơ trong app)", + "(选填,填了施主能扫码)": "(tùy chọn; có thì thí chủ quét được QR)", + "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。": "Cách lấy link nhận tiền: ở trang nhận tiền của app Binance bấm \"Lưu ảnh\" rồi dùng app quét QR bất kỳ đọc link trong ảnh.", + "绑定并校验": "Liên kết và kiểm tra", + // ---- 开站 / 找回 ---- + "用 X 找回口令": "Lấy lại mật khẩu bằng X", + "🔑 用 X 找回口令": "🔑 Lấy lại mật khẩu bằng X", + "🏚 开通我的要饭站": "🏚 Mở bát ăn xin của tôi", + "发一条带验证码的推文证明你是站长本人,就能重设口令。": "Đăng một tweet có mã xác minh để chứng minh bạn là chủ bát, rồi đặt mật khẩu mới.", + "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。": "Không cần bố thí trước. Một tweet từ tài khoản X là mở được bát: tên bát lấy từ tên hiển thị X, ảnh đại diện lấy từ X, mỗi tài khoản X một bát. Tweet đó cũng tiện đem bát của bạn ra phố luôn.", + "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。": "📱 Bạn đang ở trình duyệt trong app. Đăng tweet một chạm có thể không mở được X, quay lại cũng có thể mất trạng thái.", + "建议点右上角「⋯」选「在浏览器中打开」": "Bấm \"⋯\" góc trên phải, chọn \"Mở trong trình duyệt\"", + "(或复制链接到 Safari / Chrome 打开)再操作。": " (hoặc sao chép link mở bằng Safari / Chrome) rồi làm tiếp.", + "复制本页链接": "Sao chép link trang này", + "发一条推文,带上验证码": "Đăng một tweet có chứa mã", + "推文内容(可以随便改,只要保留验证码)": "Nội dung tweet (sửa thoải mái, chỉ cần giữ lại mã)", + "换一条": "Đổi câu khác", + "🐦 一键去 X 发推": "🐦 Đăng lên X", + "复制文案": "Sao chép nội dung", + "没拉起 X App?点这里用网页版发 →": "Không mở được app X? Đăng bằng bản web →", + "验证码": "Mã", + "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。": "không phân biệt hoa thường, có hiệu lực 24 giờ. Nội dung có sẵn link bát của bạn, đăng lên là tiện rao luôn.", + "把推文链接贴回来": "Dán link tweet vào đây", + "推文链接": "Link tweet", + "https://x.com/你的名字/status/1234567890": "https://x.com/tencuaban/status/1234567890", + "验证": "Xác minh", + "推文发出后,点推文右上角「分享 → 复制链接」即可。": "Đăng xong, bấm nút chia sẻ của tweet → Sao chép link là được.", + "还没开过站?": "Chưa có bát? ", + "去开一个": "Mở một cái", + "已经开过站?": "Đã có bát rồi? ", + "站长登录": "Chủ bát đăng nhập", + "🔑 设置新口令": "🔑 Đặt mật khẩu mới", + "保存并登录": "Lưu và đăng nhập", + "✅ X 验证通过": "✅ X đã xác minh", + "· 站名和头像来自 X(头像会定期同步)": "· tên và ảnh đại diện lấy từ X (ảnh sẽ đồng bộ định kỳ)", + "站点地址": "Địa chỉ bát", + "(就是你的 X 用户名,不用填)": "(chính là tên người dùng X của bạn, khỏi cần điền)", + "行行好,赏口饭吃 🙏": "Làm ơn làm phước, cho xin miếng cơm 🙏", + "登录口令": "Mật khẩu đăng nhập", + "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。": "Sau này đăng nhập bằng tên người dùng X + mật khẩu; quên thì tweet lại là lấy được.", + "口令(至少 6 位)": "Mật khẩu (ít nhất 6 ký tự)", + "开张 🏚": "Khai trương 🏚", + "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。": "Mở xong, vào trang quản lý liên kết Binance Key hoặc điền UID là nhận được tiền. Bạn tự chịu trách nhiệm về nội dung; bát quảng cáo sẽ bị Cái Bang trục xuất.", + // ---- 付款面板 / 状态页 ---- + "给 %s 施舍": "Bố thí cho %s", + "先回去看看": "Quay lại trước đã", + "给 %s 投币": "Đang bố thí cho %s", + "金额要": "Số tiền phải ", + "一分不差": "chính xác từng xu", + ",网关靠这个唯一尾数自动认账,转完几秒内到账": ": cổng thanh toán nhận diện bằng phần lẻ duy nhất này, chuyển xong vài giây là xác nhận", + "用币安 Pay 直接转给站长,转完点下面「我已施舍」": "Chuyển thẳng cho chủ bát bằng Binance Pay, xong bấm \"Tôi đã bố thí\" bên dưới", + "打开币安 App 转账": "Mở app Binance để chuyển", + "唤起后手动输入金额": "Trong app, tự nhập số tiền", + ",备注填": ", ghi chú", + "用另一台手机扫码": "Quét mã bằng điện thoại khác", + "收款二维码": "Mã QR nhận tiền", + "币安 App → 首页「扫一扫」→ 输入金额": "App Binance → Quét mã → nhập số tiền", + "或手动转账": "Hoặc chuyển tay", + "转账信息": "Thông tin chuyển khoản", + "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填": "App Binance → \"Pay\" → \"Chuyển khoản\" → người nhận: UID bên dưới → số tiền", + "→ 备注填": "→ ghi chú", + "→ 转完回来点「我已施舍」": "→ chuyển xong quay lại bấm \"Tôi đã bố thí\"", + "收款方": "Người nhận", + "复制": "Sao chép", + "金额": "Số tiền", + "备注": "Ghi chú", + "等待到账…转完自动确认,本页会自动更新": "Đang chờ tiền về… chuyển xong là tự xác nhận, trang này tự cập nhật", + "付了但一直没确认?": "Đã trả mà mãi chưa xác nhận?", + "币安订单编号(18 位数字,转账详情里有)": "Mã đơn Binance (18 chữ số, có trong chi tiết giao dịch)", + "我付过了,帮我核对": "Tôi đã trả, kiểm tra giúp", + "币安订单编号(可选,18 位数字,填了站长确认更快)": "Mã đơn Binance (tùy chọn, 18 chữ số; có thì chủ bát xác nhận nhanh hơn)", + "我已施舍,等站长确认": "Tôi đã bố thí, chờ chủ bát xác nhận", + "「我已施舍」要在发起施舍的那台设备上点。": "Bấm \"Tôi đã bố thí\" trên chính thiết bị đã bắt đầu lượt bố thí này.", + "打不开?": "Không mở được? ", + "用网关收银页支付": "Trả qua trang thanh toán của cổng", + "施舍进行中": "Đang bố thí", + "🙏 谢谢施主": "🙏 Cảm ơn thí chủ", + "你在 %s 的施主榜排第 %d 位": "Trên bảng thí chủ của %s, bạn xếp hạng #%d", + "回到 %s 的碗": "Về bát của %s", + "复制链接分享": "Sao chép link để chia sẻ", + "🖼 分享卡片": "🖼 Thẻ chia sẻ", + "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。": "Tạo một thẻ pixel để đăng lên X hoặc gửi bạn bè, tiện rao hộ ăn mày luôn.", + "生成分享卡": "Tạo thẻ chia sẻ", + "分享卡": "Thẻ chia sẻ", + "长按图片保存,或": "Nhấn giữ ảnh để lưu, hoặc ", + "下载": "tải về", + "🏚 你也可以要饭": "🏚 Bạn cũng có thể đi xin", + "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。": "Một tweet từ tài khoản X là có bát riêng; tiền người ta cho vào thẳng tài khoản Binance của bạn.", + "站长没有确认这笔施舍": "Chủ bát không xác nhận lượt bố thí này", + "这笔施舍已过期": "Lượt bố thí này đã hết hạn", + "如果你确实转了,请联系站长核对。": "Nếu bạn thật sự đã chuyển, hãy liên hệ chủ bát để kiểm tra.", + "没付款不扣钱;想施舍请重新来一次。": "Chưa trả thì không mất tiền; muốn bố thí hãy làm lại từ đầu.", + "再来一次": "Thử lại", + // ---- 排行榜 ---- + "排行榜 ·": "Bảng xếp hạng ·", + "🏆 施主榜": "🏆 Thí chủ", + "🥣 乞丐榜": "🥣 Ăn mày", + "🪙 人气榜": "🪙 Nhân khí", + "HIGH SCORE · 所有要饭站加起来 · 共": "HIGH SCORE · gộp mọi bát ·", + "位施主": "thí chủ", + "总榜": "Mọi thời đại", + "本周": "Tuần này", + "要到最多的要饭站 · 共": "Những bát xin được nhiều nhất ·", + "个": "", + "收到钢镚最多(免费投)· 共": "Nhận nhiều xu nhất (ném miễn phí) ·", + "← 回到刚才看的碗": "← Về lại cái bát vừa xem", + "施主自己填的 X,未经验证": "X do thí chủ tự điền, chưa xác minh", + "次 · 施舍过": "lượt · đã bố thí cho", + "个乞丐": "ăn mày", + "榜上无人": "Chưa có ai", + "就是我": "là tôi", + "还没有人上榜": "Chưa ai lên bảng", + // ---- 站点页 ---- + "在要饭 ·": "đang ăn xin ·", + "🕵️ 这个站还没被丐帮收录,暂不进榜。": "🕵️ Bát này chưa được Cái Bang duyệt nên chưa vào bảng.", + "主站站长审核后会收录。": "Chủ trang chính duyệt xong sẽ đưa vào.", + "· 榜 #": "· Hạng #", + "升%s要 %s": "→ %s cần %s", + "满级": "Cấp tối đa", + "饱食度": "Độ no", + "今天还没吃饭": "Hôm nay chưa có gì ăn", + "今天有人投币了": "Hôm nay có người bố thí rồi", + "今天丢过了": "Hôm nay ném rồi", + "丢个钢镚(免费)": "Ném một xu (miễn phí)", + "💸 投币施舍": "💸 Bố thí", + "还没摆碗,暂不能投币": "Chưa bày bát, chưa bố thí được", + "去配置": "Cài đặt ngay", + "钢镚": "Xu", + "· 今日": "· hôm nay", + "· 每 0.1 U =": "· 0.1 U =", + "EXP · 每个钢镚 =": "EXP · 1 xu =", + "碗里已有": "Trong bát có", + "施主": "Thí chủ", + "人": "", + "今日": "Hôm nay", + "🕹️ 投币施舍": "🕹️ Nhét xu", + "玩家名(上榜用,可留空)": "Tên người chơi (để lên bảng, có thể bỏ trống)", + "匿名施主": "Thí chủ ẩn danh", + "你的 X(可选,显示头像)": "X của bạn (tùy chọn, để hiện ảnh đại diện)", + "投多少": "Bố thí bao nhiêu", + "✏️ 自定义": "✏️ Tùy chọn", + "输入金额,最多两位小数": "Nhập số tiền, tối đa 2 số lẻ", + "对乞丐喊话": "Nhắn gì đó cho ăn mày", + "例如:别买烟了,去吃饭": "vd: Đừng mua thuốc lá nữa, đi ăn cơm đi", + "投币 💸": "Bố thí 💸", + "投币": "Bố thí", + "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。": "Quét mã bằng app Binance hoặc mở app một chạm; tiền về là tự khắc vào Sổ Công Đức.", + "通过币安 Pay 直接转给站长,提交后由站长确认上榜。": "Chuyển thẳng cho chủ bát qua Binance Pay; chủ bát xác nhận là bạn lên bảng.", + "最少 %s,最多 %s。留言里不能放链接和联系方式。": "Ít nhất %s, nhiều nhất %s. Lời nhắn không được chứa link hay thông tin liên hệ.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。": "Ăn mày này chưa bày bát (chưa cài cách nhận tiền) nên tạm chưa nhận được tiền.", + "去后台配置 →": "Vào trang quản lý để cài đặt →", + "🏚 想自己要饭?": "🏚 Muốn tự đi xin?", + "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。": "Một tweet từ tài khoản X là có bát riêng: địa chỉ riêng, bát riêng, Sổ Công Đức và bảng thí chủ riêng, tiền vào thẳng tài khoản Binance của bạn.", + "用 X 开通我的要饭站 →": "Mở bát của tôi bằng X →", + "人气榜": "Nhân khí", + "功德簿": "Công đức", + "施主榜": "Thí chủ", + "乞丐榜": "Ăn mày", + "已屏蔽的施主": "Thí chủ đã bị chặn", + "功德簿空空如也,第一枚硬币会刻在这里": "Sổ Công Đức còn trống, đồng xu đầu tiên sẽ được khắc ở đây", + "HIGH SCORE · 给": "HIGH SCORE · người bố thí nhiều nhất cho", + "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客": "· 🏁 thí chủ đầu tiên 💎 khoản lớn nhất 🔥 khách quen", + "丐帮排名 · 要到最多的要饭站": "Xếp hạng Cái Bang · bát xin được nhiều nhất", + "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)": "Nhân khí · bát nhận nhiều xu nhất (xu miễn phí, không tốn tiền)", + "次": "lượt", + "榜上无人,第一个投币的就是首席施主": "Chưa có ai. Người bố thí đầu tiên sẽ là thí chủ số một", + "本站": "bát này", + "叮!钢镚 +1": "Keng! Xu +1", + "没丢进去": "Ném trượt rồi", + "网络开小差了,再试一次": "Mạng lag rồi, thử lại nhé", + // ---- 后端消息 ---- + "金额格式不对(最多两位小数)": "Số tiền không hợp lệ (tối đa 2 số lẻ)", + "最少施舍 %s %s": "Bố thí ít nhất %s %s", + "最多施舍 %s %s,真有这么多请分几次": "Bố thí nhiều nhất %s %s. Nếu có nhiều thật thì chia làm vài lần nhé", + "支付网关开小差了:%s": "Cổng thanh toán lag rồi: %s", + "手速太快了": "Nhanh tay quá", + "这个乞丐不在": "Ăn mày này không có ở đây", + "请先打开要饭页再丢": "Mở trang bát trước rồi hãy ném", + "服务器开小差了": "Máy chủ lag rồi", + "手速太快了,歇一会儿": "Nhanh tay quá, nghỉ chút đi", + "已提交,等站长确认": "Đã gửi, chờ chủ bát xác nhận", + "网关返回 %s": "Cổng trả về %s", + "我在「%s」要饭的碗口令忘了,发推证明是我本人 🥣 %s %s": "Tôi quên mật khẩu bát ăn xin trên %s, đăng tweet chứng minh là chính tôi 🥣 %s %s", + "我在「%s」摆了个碗 🥣 行行好,赏口饭吃~ %s #赛博丐帮 %s": "Tôi vừa bày bát trên %s 🥣 Làm ơn làm phước, cho xin miếng cơm~ %s #CaiBangCyber %s", + "本人已加入赛博丐帮,正式开丐 🧎 一毛也是爱,投个钢镚也行 🪙 %s #赛博丐帮 %s": "Tôi đã gia nhập Cái Bang Cyber, chính thức đi xin 🧎 Một xu cũng là tình thương, ném xu miễn phí cũng được 🪙 %s #CaiBangCyber %s", + "不上班了,改行要饭。碗在这,各位大善人行行好 🥣 %s #赛博丐帮 %s": "Nghỉ việc rồi, chuyển nghề ăn xin. Bát ở đây, các đại thiện nhân làm ơn làm phước 🥣 %s #CaiBangCyber %s", + "丐帮招新,我先带头要饭 🥣 谁投币谁上功德簿,不投的丢个钢镚也算 %s #赛博丐帮 %s": "Cái Bang tuyển người, tôi xin đi đầu 🥣 Ai bố thí thì lên Sổ Công Đức, không thì ném xu miễn phí cũng tính %s #CaiBangCyber %s", + "这条推文里没有验证码 %s,请检查是否发对了": "Tweet này không chứa mã %s. Kiểm tra xem đã đăng đúng chưa", + "@%s 已经开过站了:%s。忘了口令可以在登录页用 X 重置。": "@%s đã có bát rồi: %s. Quên mật khẩu? Đặt lại bằng X ở trang đăng nhập.", + "@%s 已经开过站了": "@%s đã có bát rồi", + "路径 %s 已被占用(@%s 可能已经开过站,忘了口令可在登录页用 X 找回)": "Địa chỉ %s đã có người dùng (@%s có thể đã có bát; quên mật khẩu thì lấy lại bằng X ở trang đăng nhập)", + "@%s 还没开过要饭站": "@%s chưa có bát", + "解绑币安 Key 失败:%s": "Hủy liên kết Binance Key thất bại: %s", + "绑定失败:%s": "Liên kết thất bại: %s", + "解绑失败:%s": "Hủy liên kết thất bại: %s", + "校验失败:%s": "Kiểm tra thất bại: %s", + "已重置 /%s 的口令为 %s(只显示这一次,请转告站长)": "Đã đặt lại mật khẩu của /%s thành %s (chỉ hiện một lần, hãy báo cho chủ bát)", + "本站未配置支付网关": "Trang này chưa cấu hình cổng thanh toán", + "网关连不上,请稍后再试": "Không kết nối được cổng, thử lại sau nhé", + "方法不允许": "Phương thức không được phép", + "主站不存在": "Không tìm thấy trang chính", + "页面不存在": "Không tìm thấy trang", + "赛博丐帮没有这条路。": "Cái Bang Cyber không có con đường này.", + "要么还没开张,要么已被丐帮除名。": "Hoặc chưa mở, hoặc đã bị Cái Bang trục xuất.", + "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱": "Ăn mày này chưa bày bát (chưa cài cách nhận tiền), tạm chưa nhận được tiền", + "X 用户名只能是字母、数字、下划线(不带 @ 也行)": "Tên người dùng X chỉ gồm chữ, số và gạch dưới (có @ hay không đều được)", + "名号和留言里别放链接、联系方式,乞丐不接广告": "Đừng để link hay thông tin liên hệ trong tên và lời nhắn. Ăn mày không nhận quảng cáo", + "没有这笔施舍": "Không tìm thấy lượt bố thí này", + "站点不存在": "Không tìm thấy bát", + "请在发起施舍的那台设备上点「我已施舍」": "Hãy bấm \"Tôi đã bố thí\" trên thiết bị đã bắt đầu lượt bố thí này", + "币安订单编号是 18 位数字,不填也行": "Mã đơn Binance gồm 18 chữ số (không bắt buộc)", + "核对失败": "Kiểm tra thất bại", + "这笔施舍不是网关模式": "Lượt bố thí này không đi qua cổng", + "试得太频繁了,一分钟后再试": "Thử nhiều quá rồi, một phút nữa thử lại", + "请在发起施舍的那台设备上回填": "Hãy nhập mã đơn trên thiết bị đã bắt đầu lượt bố thí này", + "币安订单编号是 18 位数字": "Mã đơn Binance gồm 18 chữ số", + "本站未开放开站": "Trang này chưa cho phép mở bát", + "验证码已失效(或不是本浏览器生成的),请重新生成": "Mã đã hết hạn (hoặc được tạo ở trình duyệt khác). Hãy tạo mã mới", + "推文链接不对,应形如 https://x.com/你的名字/status/1234567890": "Link tweet không đúng. Phải có dạng https://x.com/tencuaban/status/1234567890", + "这条推文比验证码还早,请用生成验证码之后发的推文": "Tweet này cũ hơn mã. Hãy dùng tweet đăng sau khi tạo mã", + "验证已失效,请重新验证": "Xác minh đã hết hạn, hãy xác minh lại", + "口号和介绍里别放链接、联系方式": "Đừng để link hay thông tin liên hệ trong khẩu hiệu", + "口令至少 6 位": "Mật khẩu phải có ít nhất 6 ký tự", + "两次口令不一致": "Hai mật khẩu không khớp", + "主站口令在服务器 config.env 里改,不走 X 找回": "Mật khẩu trang chính đổi trong config.env trên máy chủ, không lấy lại qua X", + "这个 X 今天重置得太频繁了,明天再来": "Tài khoản X này hôm nay đặt lại nhiều quá rồi, mai quay lại nhé", + "口令至少 6 位,且两次一致": "Mật khẩu phải có ít nhất 6 ký tự và hai lần nhập phải khớp", + "口令已重置,其它设备上的登录已失效": "Đã đặt lại mật khẩu. Các thiết bị khác đã bị đăng xuất", + "X 用户名或口令不对": "Sai tên người dùng X hoặc mật khẩu", + "请先登录": "Vui lòng đăng nhập trước", + "登录状态已失效,请重新登录。": "Phiên đăng nhập đã hết hạn, hãy đăng nhập lại.", + "歇一会儿再来。": "Nghỉ chút rồi quay lại nhé.", + "这个站点的错误口令太多,歇一会儿。": "Bát này nhập sai mật khẩu quá nhiều. Nghỉ chút đi.", + "站点标题不能为空": "Tên bát không được để trống", + "资料里别放链接、联系方式": "Đừng để link hay thông tin liên hệ trong hồ sơ", + "资料已保存": "Đã lưu hồ sơ", + "主站的收款方式在服务器 config.env 里改": "Cách nhận tiền của trang chính đổi trong config.env trên máy chủ", + "填一下币安 UID,不然钱没处去": "Điền Binance UID đi, không thì tiền chẳng biết về đâu", + "已切换为直接转账:施主转完自报,你在这里确认": "Đã chuyển sang chuyển khoản trực tiếp: thí chủ tự báo đã chuyển, bạn xác nhận ở đây", + "本站不支持绑定": "Trang này không hỗ trợ liên kết", + "API Key 和 Secret 都要填": "Phải điền cả API Key và Secret", + "币安 UID 是纯数字(App 头像页可见)": "Binance UID chỉ gồm chữ số (xem ở trang hồ sơ trong app)", + "绑定成功!币安校验通过,之后给你的施舍会自动确认上榜": "Liên kết thành công! Binance đã xác nhận Key, từ giờ bố thí sẽ tự động xác nhận lên bảng", + "已解绑。现在是直接转账模式,记得填好收款链接或 Pay ID": "Đã hủy liên kết. Giờ là chế độ chuyển khoản trực tiếp, nhớ điền đủ UID nhé", + "校验通过:币安 Key 可用,到账会自动确认": "Kiểm tra OK: Binance Key dùng được, tiền về sẽ tự xác nhận", + "主站口令在服务器 config.env(ADMIN_PASSWORD)里改": "Mật khẩu trang chính đổi trong config.env (ADMIN_PASSWORD) trên máy chủ", + "口令已修改,其它设备上的登录已失效": "Đã đổi mật khẩu. Các thiết bị khác đã bị đăng xuất", + "这笔施舍当前不能确认/拒绝": "Lượt bố thí này hiện không thể xác nhận / từ chối", + "只能回复自己站的施舍": "Chỉ trả lời được bố thí trên bát của mình", + "回复里别放链接、联系方式": "Đừng để link hay thông tin liên hệ trong câu trả lời", + "未知操作": "Thao tác không xác định", + "无权操作": "Không có quyền", + "没有这个站": "Không có bát này", + "未配置支付网关": "Chưa cấu hình cổng thanh toán", + "请求来源不对": "Nguồn yêu cầu không hợp lệ", + "请从本站页面操作。": "Hãy thao tác từ chính trang của web này.", + "页面渲染失败": "Không dựng được trang", + "稍后再试。": "Thử lại sau nhé.", + "地址已被占用": "Địa chỉ đã có người dùng", + "这个 X 账号已经开过站了": "Tài khoản X này đã có bát rồi", + "连不上 X 接口: %w": "Không kết nối được X: %w", + "找不到这条推文(链接不对,或推文不公开)": "Không tìm thấy tweet (sai link, hoặc tweet không công khai)", + "推文读不到(可能被删除或账号受保护)": "Không đọc được tweet (có thể đã bị xóa hoặc tài khoản ở chế độ bảo vệ)", + "头像地址不在允许的域名": "URL ảnh đại diện không thuộc tên miền được phép", + "头像下载失败": "Tải ảnh đại diện thất bại", + "头像不是有效图片": "Ảnh đại diện không phải ảnh hợp lệ", + "金额格式不对": "Số tiền không hợp lệ", + "收款链接过长": "Link nhận tiền quá dài", + "收款链接须为 https 链接": "Link nhận tiền phải là link https", + "收款链接必须是币安域名(app.binance.com/… 之类)": "Link nhận tiền phải thuộc tên miền Binance (kiểu app.binance.com/…)", + "X 主页链接应形如 https://x.com/你的名字": "Link trang X phải có dạng https://x.com/tencuaban", + "核对成功,已到账": "Kiểm tra OK, tiền đã về", + "查到了这笔转账但金额不足,已按实付记账": "Tìm thấy giao dịch nhưng số tiền thiếu; đã ghi theo số thực trả", + "没查到这笔转账:确认订单编号是否正确、是否转给了正确的账号,币安到账后再试": "Không tìm thấy giao dịch: kiểm tra lại mã đơn và tài khoản nhận, đợi Binance báo tiền về rồi thử lại", + "这笔转账已经被别的订单用过了": "Giao dịch này đã được dùng cho đơn khác rồi", + "币种不对": "Sai loại tiền", + "这笔施舍当前状态不能回填": "Trạng thái hiện tại của lượt bố thí này không cho nhập mã đơn", + "这个网络今天丢得够多了": "Mạng này hôm nay ném xu đủ rồi", + "今天已经丢过了,明天再来": "Hôm nay ném rồi, mai quay lại nhé", + // ---- 状态 / 等级 / 职位 / 施主档 / 时间 ---- + "未付款": "chưa trả", + "待确认": "chờ xác nhận", + "已到账": "đã nhận", + "已过期": "hết hạn", + "已关闭": "đã đóng", + "已拒绝": "đã từ chối", + "空碗未入帮": "Bát rỗng chưa nhập bang", + "一袋弟子": "Đệ tử 1 túi", + "二袋弟子": "Đệ tử 2 túi", + "三袋弟子": "Đệ tử 3 túi", + "四袋弟子": "Đệ tử 4 túi", + "五袋弟子": "Đệ tử 5 túi", + "六袋弟子": "Đệ tử 6 túi", + "七袋弟子": "Đệ tử 7 túi", + "八袋弟子": "Đệ tử 8 túi", + "九袋长老": "Trưởng lão 9 túi", + "帮主": "Bang chủ", + "副帮主": "Phó bang chủ", + "传功长老": "Truyền Công Trưởng lão", + "执法长老": "Chấp Pháp Trưởng lão", + "掌棒龙头": "Chưởng Bổng Long Đầu", + "掌钵龙头": "Chưởng Bát Long Đầu", + "长老": "Trưởng lão", + "舵主": "Đà chủ", + "弟子": "Đệ tử", + "总舵": "Tổng đà", + "投了个硬币": "đã ném một xu", + "善心人": "người tốt bụng", + "大善人": "đại thiện nhân", + "活菩萨": "Bồ Tát sống", + "财神爷": "Thần Tài", + "刚刚": "vừa xong", + "%d 分钟前": "%d phút trước", + "%d 小时前": "%d giờ trước", + "%d 天前": "%d ngày trước", + } +} diff --git a/payment.go b/payment.go index 2c7b7a1..a760c1c 100644 --- a/payment.go +++ b/payment.go @@ -215,16 +215,18 @@ func (a *App) verifyAccount(site *Site) (*bpaygate.Account, error) { } // gatewayErr 把网关错误变成能给站长看的话。 -func gatewayErr(err error) string { +func gatewayErr(err error) string { return gatewayErrL("zh", err) } + +func gatewayErrL(lang string, err error) string { var ae *bpaygate.APIError if errors.As(err, &ae) { if ae.Message != "" { return ae.Message } - return "网关返回 " + ae.Code + return tr(lang, "网关返回 %s", ae.Code) } if errors.Is(err, errNoGateway) { - return "本站未配置支付网关" + return tr(lang, "本站未配置支付网关") } - return "网关连不上,请稍后再试" + return tr(lang, "网关连不上,请稍后再试") } diff --git a/templates/error.html b/templates/error.html index e80b3a0..939c713 100644 --- a/templates/error.html +++ b/templates/error.html @@ -1,12 +1,12 @@ -{{define "title"}}{{.Title}} · {{.SiteTitle}}{{end}} +{{define "title"}}{{T .Title}} · {{T .SiteTitle}}{{end}} {{define "content"}}
{{template "sprite"}}
GAME OVER?
-

{{.Title}}

- {{if .Msg}}

{{.Msg}}

{{end}} - 回到街头 +

{{T .Title}}

+ {{if .Msg}}

{{T .Msg}}

{{end}} + {{T "回到街头"}}
{{end}} diff --git a/templates/layout.html b/templates/layout.html index d24dc08..d52e927 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -1,13 +1,13 @@ {{define "layout"}} - + {{template "title" .}} - + - + {{if .OGImage}}{{end}} @@ -31,10 +31,11 @@ a{color:var(--blue)} @media(min-width:900px){.page{padding-bottom:40px}} .px{border:4px solid transparent;border-image:var(--frame) 2 / 4px stretch;image-rendering:pixelated;background-clip:padding-box} .nav{display:flex;align-items:center;gap:6px;height:64px} +.langsel{display:inline-flex;align-items:center;gap:2px;font-size:16px;flex:none;position:relative}.langsel select{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;font-size:16px} .sfx{background:none;border:0;font-size:18px;line-height:1;padding:8px 6px;cursor:pointer;min-width:36px;min-height:36px;opacity:.85;flex:none}.sfx.off{opacity:.45} .sfx.idle{animation:sfxnudge 1.2s ease-in-out infinite}@keyframes sfxnudge{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}@media(prefers-reduced-motion:reduce){.sfx.idle{animation:none}} -.nav>*{flex:none} -@media(max-width:430px){.nav{gap:4px}.nav .brand{font-size:22px;margin-right:2px}.sfx{min-width:28px;padding:6px 2px;font-size:16px}.nav a.link{padding:8px 5px;font-size:15px}.nav a.pill{padding:6px 10px;font-size:15px} +.nav>*{flex:none}.nav .brand{flex:0 1 auto;min-width:0}.nav .brand span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +@media(max-width:430px){.nav{gap:4px}.nav .brand{font-size:20px;margin-right:2px}.nav .brand .px-coin{display:none}.sfx{min-width:28px;padding:6px 2px;font-size:16px}.nav a.link{padding:8px 5px;font-size:15px}.nav a.pill{padding:6px 10px;font-size:15px} .nav a.navrank span{display:none}.nav a.navrank::before{content:"🏆";font-size:16px}} .brand{display:flex;align-items:center;gap:8px;font-size:24px;line-height:1;color:var(--ink);text-decoration:none;white-space:nowrap;margin-right:6px} .brand .px-coin{width:28px;height:28px;flex:none} @@ -78,7 +79,7 @@ h1{font-size:24px;margin:0 0 8px;line-height:1.3} .pname{font-size:24px;margin:0 0 8px;line-height:1.25;word-break:break-word} .barlabel{display:flex;justify-content:space-between;align-items:baseline;font-size:12px;color:var(--muted);margin-top:8px;line-height:1.4} .barlabel b{color:var(--ink);font-weight:normal;margin-left:4px} -.barlabel span{font-size:12px;color:var(--muted)} +.barlabel span{font-size:12px;color:var(--muted);margin-left:8px;text-align:right} .bar{position:relative;height:14px;border:3px solid var(--ink);background:#fff;margin:2px 0 0;box-shadow:2px 2px 0 var(--ink)} .bar span{display:block;height:100%;background:var(--green);background-image:repeating-linear-gradient(90deg,transparent 0 6px,rgba(0,0,0,.14) 6px 8px);transition:width .6s steps(12)} .bar.hp span{background-color:var(--red)} @@ -249,19 +250,20 @@ footer a{color:var(--muted)} {{if .HasBGM}}{{end}}
- + {{template "content" .}}
与 (里面的中文单独手工处理) + parts = re.split(r'(|)', src, flags=re.S) + res = [] + for i, part in enumerate(parts): + if i % 2 == 1: + res.append(part) + continue + # 属性 + part = ATTR.sub(lambda m: (keys.append(m.group(2)) or f'{m.group(1)}="{{{{T "{esc(m.group(2))}"}}}}"'), part) + # 文本节点:按标签切 + toks = re.split(r'(<[^>]+>)', part) + for j, t in enumerate(toks): + if j % 2 == 0: + toks[j] = wrap_text(t) + res.append(''.join(toks)) + return ''.join(res) + +def main(): + dry = '--dry' in sys.argv + files = [a for a in sys.argv[1:] if not a.startswith('--')] + for f in files: + src = open(f, encoding='utf-8').read() + out = process(src) + if not dry: + open(f, 'w', encoding='utf-8').write(out) + seen = set() + for k in keys: + if k not in seen: + seen.add(k) + print(k) + +if __name__ == '__main__': + main()