多语言:12 种语言(中英日韩俄西葡法德越印尼土),中文原文为 key,按浏览器语言自动选 + 导航栏切换

This commit is contained in:
qianyu committed 2026-09-04 15:58:49 +08:00
1 parent 2145b5a74a
commit 47d0819688
29 files changed
+5937 -311

No files matched your search

+3
View File
@@ -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_<lang>.go`,新增语言只需加一个文件并在 `i18n.go` 的 `langs` 里登记。`tools/i18n_wrap.py` 可把模板里裸露的中文批量包上 T 并列出 key。
背景音乐是可选的:把一段 AAC 循环片段放到 `static/bgm.m4a` 再编译即可,仓库不附带。换曲子请改文件名(静态路由是永久缓存)。
## 常见问题
+39 -9
View File
@@ -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
+5 -5
View File
@@ -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, "排第 <b>1</b> 位"), "名次")
must(t, strings.Contains(body, "排第 1 位"), "名次")
st, body, _ = c.get("/")
must(t, strings.Contains(body, "加油要饭 &lt;b&gt;x&lt;/b&gt;") && 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, "支付</b>」→「<b>转账") && 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, "<html"), "异步下单错误应为纯文本: %d", st)
must(t, st == 400 && strings.Contains(body, "最多两位小数") && !strings.Contains(body, "<html"), "异步下单错误应为纯文本: %d", st)
st, body, h = c8.post("/donate", url.Values{"site": {""}, "nickname": {"弹窗党"}, "amount": {"2"}, "ajax": {"1"}})
code8 := h.Get("X-Donation")
must(t, st == 200 && strings.HasPrefix(code8, "BEG") && strings.Contains(body, `class="paypanel"`) && strings.Contains(body, "帮我核对") && !strings.Contains(body, "<html"), "异步下单应返回面板片段: %d", st)
+18 -16
View File
@@ -85,7 +85,7 @@ func (a *App) renderSite(w http.ResponseWriter, r *http.Request, status int, sit
Ready: site.PaymentReady(), Err: errMsg, Nick: nick, XHandle: xh, Amount: amount, Message: message,
MinAmount: fmtE8(a.cfg.MinAmountE8), MaxAmount: fmtE8(a.cfg.MaxAmountE8), CoinsPerDay: a.cfg.CoinsPerDay}
p.NoIndex = !site.Listed
p.Desc = site.Name + ":" + site.Slogan + " · 赛博要饭,行行好"
p.Desc = a.T(r, "%s:%s · 赛博要饭,行行好", site.Name, site.Slogan)
if site.AvatarURL() != "" {
p.OGImage = a.cfg.BaseURL + site.AvatarURL()
}
@@ -209,15 +209,15 @@ func (a *App) handleDonate(w http.ResponseWriter, r *http.Request) {
}
e8, err := parseAmountE8(rawAmt, 2)
if err != nil {
bad("金额" + err.Error() + "(最多两位小数)")
bad(a.T(r, "金额格式不对(最多两位小数)"))
return
}
if e8 < a.cfg.MinAmountE8 {
bad("最少施舍 " + fmtE8(a.cfg.MinAmountE8) + " " + site.Currency)
bad(a.T(r, "最少施舍 %s %s", fmtE8(a.cfg.MinAmountE8), site.Currency))
return
}
if e8 > 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)
+27 -25
View File
@@ -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:
+120
View File
@@ -0,0 +1,120 @@
package main
import (
"fmt"
"net/http"
"net/url"
"strings"
"time"
)
// 多语言:模板与代码里的中文原文就是 key,按语言查表;查不到回落英文,再回落中文。
// 各语言表在 i18n_<lang>.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)) },
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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 日前",
}
}
+490
View File
@@ -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일 전",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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 дн назад",
}
}
+490
View File
@@ -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",
}
}
+490
View File
@@ -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",
}
}
+6 -4
View File
@@ -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, "网关连不上,请稍后再试")
}
+4 -4
View File
@@ -1,12 +1,12 @@
{{define "title"}}{{.Title}} · {{.SiteTitle}}{{end}}
{{define "title"}}{{T .Title}} · {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow">
<section class="card px center">
<div class="sprite-wrap" style="margin:0 auto 10px">{{template "sprite"}}</div>
<div class="insert">GAME OVER?</div>
<h1>{{.Title}}</h1>
{{if .Msg}}<p class="hint" style="font-size:14px">{{.Msg}}</p>{{end}}
<a class="btn sec" href="/">回到街头</a>
<h1>{{T .Title}}</h1>
{{if .Msg}}<p class="hint" style="font-size:14px">{{T .Msg}}</p>{{end}}
<a class="btn sec" href="/">{{T "回到街头"}}</a>
</section>
</div>
{{end}}
+26 -24
View File
@@ -1,13 +1,13 @@
{{define "layout"}}<!doctype html>
<html lang="zh-CN">
<html lang="{{.Lang}}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<meta name="theme-color" content="#f4eedd">
<title>{{template "title" .}}</title>
<meta name="description" content="{{if .Desc}}{{.Desc}}{{else}}赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。{{end}}">
<meta name="description" content="{{if .Desc}}{{.Desc}}{{else}}{{T "赛博要饭:行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿;不花钱也能丢钢镚;用 X 发一条推就能开自己的要饭站。"}}{{end}}">
<meta property="og:title" content="{{template "title" .}}">
<meta property="og:description" content="{{if .Desc}}{{.Desc}}{{else}}行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。{{end}}">
<meta property="og:description" content="{{if .Desc}}{{.Desc}}{{else}}{{T "行行好,赏口饭吃。投币上功德簿,丢钢镚也算爱。"}}{{end}}">
<meta property="og:type" content="website">
{{if .OGImage}}<meta property="og:image" content="{{.OGImage}}">{{end}}
<meta name="twitter:card" content="summary">
@@ -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}}<audio id="bgm" src="/static/bgm.m4a" loop preload="none" playsinline></audio>{{end}}
<div class="page">
<nav class="nav">
<a class="brand" href="{{.HomePath}}"{{if ne .HomePath "/"}} title="回到刚才看的碗"{{end}}>{{template "coin"}}<span>{{.SiteTitle}}</span></a>
<a class="brand" href="{{.HomePath}}"{{if ne .HomePath "/"}} title="{{T "回到刚才看的碗"}}"{{end}}>{{template "coin"}}<span>{{T .SiteTitle}}</span></a>
<span class="sp"></span>
<button class="sfx" id="sfxBtn" type="button" aria-label="声音开关" title="声音">🔊</button>
<a class="link navrank" href="/rank" aria-label="排行榜" title="排行榜"><span>排行榜</span></a>
{{if .Me}}<a class="link" href="/manage">我的后台</a>{{else}}<a class="link" href="/login"><span class="hide-sm">站长</span>登录</a>{{end}}
{{if .Me}}<a class="pill px" href="/{{.Me.Slug}}">我的站</a>{{else if .SubsitesEnabled}}<a class="pill px" href="/new">开通要饭站</a>{{end}}
<label class="langsel" title="Language"><span aria-hidden="true">🌐</span><select onchange="location.href='/lang?to='+encodeURIComponent(this.value)" aria-label="Language">{{range .Langs}}<option value="{{.Code}}"{{if eq .Code $.Lang}} selected{{end}}>{{.Name}}</option>{{end}}</select></label>
<button class="sfx" id="sfxBtn" type="button" aria-label="{{T "声音开关"}}" title="{{T "声音"}}">🔊</button>
<a class="link navrank" href="/rank" aria-label="{{T "排行榜"}}" title="{{T "排行榜"}}"><span>{{T "排行榜"}}</span></a>
{{if .Me}}<a class="link" href="/manage">{{T "我的后台"}}</a>{{else}}<a class="link" href="/login"><span class="hide-sm">{{T "站长"}}</span>{{T "登录"}}</a>{{end}}
{{if .Me}}<a class="pill px" href="/{{.Me.Slug}}">{{T "我的站"}}</a>{{else if .SubsitesEnabled}}<a class="pill px" href="/new">{{T "开通要饭站"}}</a>{{end}}
</nav>
<div class="ticker" aria-hidden="true"><div class="ticker-in"><span>🙏 行行好,赏口饭吃</span><span>🪙 一毛也是爱</span><span>💸 投币就上榜</span><span>📜 留一句话刻功德簿</span><span>🏚 发条推就能开自己的要饭站</span><span>👾 赛博丐帮,人人有碗</span><span>🙏 行行好,赏口饭吃</span><span>🪙 一毛也是爱</span><span>💸 投币就上榜</span><span>📜 留一句话刻功德簿</span><span>🏚 发条推就能开自己的要饭站</span><span>👾 赛博丐帮,人人有碗</span></div></div>
<div class="ticker" aria-hidden="true"><div class="ticker-in"><span>{{T "🙏 行行好,赏口饭吃"}}</span><span>{{T "🪙 一毛也是爱"}}</span><span>{{T "💸 投币就上榜"}}</span><span>{{T "📜 留一句话刻功德簿"}}</span><span>{{T "🏚 发条推就能开自己的要饭站"}}</span><span>{{T "👾 赛博丐帮,人人有碗"}}</span><span>{{T "🙏 行行好,赏口饭吃"}}</span><span>{{T "🪙 一毛也是爱"}}</span><span>{{T "💸 投币就上榜"}}</span><span>{{T "📜 留一句话刻功德簿"}}</span><span>{{T "🏚 发条推就能开自己的要饭站"}}</span><span>{{T "👾 赛博丐帮,人人有碗"}}</span></div></div>
{{template "content" .}}
<footer>
{{.SiteTitle}} · 赛博丐帮,行行好<br>
{{if or .AuthorX .AuthorGitHub}}作者{{if .AuthorX}} <a href="{{.AuthorX}}" target="_blank" rel="noopener">𝕏 @{{lastSeg .AuthorX}}</a>{{end}}{{if .AuthorGitHub}} · <a href="{{.AuthorGitHub}}" target="_blank" rel="noopener">GitHub {{lastSeg .AuthorGitHub}}</a>{{end}}<br>{{end}}
收款由 <a href="{{.RepoURL}}" target="_blank" rel="noopener">BinancePayTool</a> 驱动 · 字体 <a href="https://github.com/TakWolf/fusion-pixel-font" target="_blank" rel="noopener">缝合怪像素字体</a>
{{T .SiteTitle}} {{T "· 赛博丐帮,行行好"}}<br>
{{if or .AuthorX .AuthorGitHub}}{{T "作者"}}{{if .AuthorX}} <a href="{{.AuthorX}}" target="_blank" rel="noopener">𝕏 @{{lastSeg .AuthorX}}</a>{{end}}{{if .AuthorGitHub}} · <a href="{{.AuthorGitHub}}" target="_blank" rel="noopener">GitHub {{lastSeg .AuthorGitHub}}</a>{{end}}<br>{{end}}
{{T "收款由"}} <a href="{{.RepoURL}}" target="_blank" rel="noopener">BinancePayTool</a> {{T "驱动 · 字体"}} <a href="https://github.com/TakWolf/fusion-pixel-font" target="_blank" rel="noopener">{{T "缝合怪像素字体"}}</a>
</footer>
</div>
<script>
@@ -311,25 +313,25 @@ window.sfx=(function(){var ctx,on=true,C=window.AudioContext||window.webkitAudio
var b=document.getElementById('sfxBtn');if(!b)return;
// 三态:🔊 在放 / 🔈 开着但还没放(浏览器拦了自动播放,点一下就放)/ 🔇 静音
var hasBgm=!!document.getElementById('bgm'); // 没放音乐文件时只有音效,喇叭只有开/关两态
paint=function(){var p=on&&(!hasBgm||playingNow());b.textContent=!on?'🔇':(p?'🔊':'🔈');b.classList.toggle('off',!on);b.classList.toggle('idle',on&&!p);b.title=!on?'声音:关':(p?'声音:开(点击静音)':'点一下开始播放')};paint();
paint=function(){var p=on&&(!hasBgm||playingNow());b.textContent=!on?'🔇':(p?'🔊':'🔈');b.classList.toggle('off',!on);b.classList.toggle('idle',on&&!p);b.title=!on?{{T "声音:关"}}:(p?{{T "声音:开(点击静音)"}}:{{T "点一下开始播放"}})};paint();
b.addEventListener('click',function(){if(on&&!playingNow()){loadBgm();startBgm();return}S.toggle()})});
document.addEventListener('click',function(ev){var b=ev.target.closest('.btn,.tab,.amt-btn,.copy,.pill,.toggle button,.link');if(!b||b.disabled)return;ac();if(b.id!=='coinbtn')S.click()},true);
return S})();
(function(){
// 复制按钮(全站委托)
document.addEventListener('click',function(ev){var b=ev.target.closest('.copy');if(!b||b.id==='nextText')return;var src=b.dataset.copyFrom;var t=src?document.getElementById(src).value:b.dataset.copy;var o=b.textContent;
function done(){b.textContent='已复制';setTimeout(function(){b.textContent=o},1500)}
function done(){b.textContent={{T "已复制"}};setTimeout(function(){b.textContent=o},1500)}
(navigator.clipboard?navigator.clipboard.writeText(t):Promise.reject()).then(done,function(){var i=document.createElement('input');i.value=t;document.body.appendChild(i);i.select();try{document.execCommand('copy')}catch(e){}i.remove();done()})});
// 付款面板:轮询到账、回填/自报、成功态
window.initPayPanel=function(pp,onDone){
var code=pp.dataset.code,site=pp.dataset.site,amount=pp.dataset.amount,status=pp.dataset.status,stop=false,fails=0;
function success(amt){stop=true;if(window.sfx)sfx.ok();var sp=document.querySelector('.sprite');pp.innerHTML='<div class="center"><div class="sprite-wrap jump" style="margin:0 auto 8px">'+(sp?sp.outerHTML:'🥣')+'</div><div class="insert">★ THANK YOU ★</div><h2 class="center" style="justify-content:center">🙏 功德 +'+(amt||amount)+'</h2><p class="hint">你的名号和留言已刻上功德簿</p><div class="btns"><a class="btn" href="'+site+'#feed" onclick="if(location.pathname===this.pathname){location.hash=\'feed\';location.reload();return false}">看看功德簿</a><a class="btn sec" href="/d/'+code+'">分享卡片</a></div></div>';if(onDone)onDone('paid')}
function success(amt){stop=true;if(window.sfx)sfx.ok();var sp=document.querySelector('.sprite');pp.innerHTML='<div class="center"><div class="sprite-wrap jump" style="margin:0 auto 8px">'+(sp?sp.outerHTML:'🥣')+'</div><div class="insert">★ THANK YOU ★</div><h2 class="center" style="justify-content:center">🙏 '+{{T "功德 +"}}+(amt||amount)+'</h2><p class="hint">'+{{T "你的名号和留言已刻上功德簿"}}+'</p><div class="btns"><a class="btn" href="'+site+'#feed" onclick="if(location.pathname===this.pathname){location.hash=\'feed\';location.reload();return false}">'+{{T "看看功德簿"}}+'</a><a class="btn sec" href="/d/'+code+'">'+{{T "分享卡片"}}+'</a></div></div>';if(onDone)onDone('paid')}
function setStatus(html){var st=pp.querySelector('#ppStatus');if(st)st.innerHTML=html}
function apply(j){if(!j||!j.status)return;if(j.status==='paid'){success(j.amount)}else if(j.status==='claimed'&&status!=='claimed'){status='claimed';setStatus('<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> 已提交,等站长确认后上榜。本页会自动更新。</div>')}else if(['expired','failed','rejected','closed'].indexOf(j.status)>=0){stop=true;setStatus('<div class="notice bad" style="margin-top:12px">这笔施舍已'+({expired:'过期',failed:'下单失败',rejected:'被站长拒绝',closed:'关闭'})[j.status]+',请回到页面重新投币。</div>')}}
function apply(j){if(!j||!j.status)return;if(j.status==='paid'){success(j.amount)}else if(j.status==='claimed'&&status!=='claimed'){status='claimed';setStatus('<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> '+{{T "已提交,等站长确认后上榜。本页会自动更新。"}}+'</div>')}else if(['expired','failed','rejected','closed'].indexOf(j.status)>=0){stop=true;setStatus('<div class="notice bad" style="margin-top:12px">'+{{T "这笔施舍已"}}+({expired:{{T "过期"}},failed:{{T "下单失败"}},rejected:{{T "被站长拒绝"}},closed:{{T "关闭"}}})[j.status]+{{T ",请回到页面重新投币。"}}+'</div>')}}
function tick(){if(stop)return;fetch('/d/'+code+'/status',{cache:'no-store'}).then(function(r){return r.json()}).then(function(j){fails=0;apply(j)}).catch(function(){if(++fails>=20)stop=true})}
var timer=setInterval(function(){if(stop){clearInterval(timer);return}tick()},3000);
pp.addEventListener('submit',function(ev){var f=ev.target.closest('.claimf');if(!f)return;ev.preventDefault();var fd=new FormData(f);fd.append('ajax','1');var btn=f.querySelector('button');btn.disabled=true;var err=f.querySelector('.claim-err');err.textContent='';
fetch(f.getAttribute('action'),{method:'POST',body:fd}).then(function(r){return r.json()}).then(function(j){btn.disabled=false;if(j.status==='paid'){success()}else if(j.ok&&j.status==='claimed'){apply({status:'claimed'})}else{if(window.sfx)sfx.fail();err.textContent=j.msg||'没成功,再试试'}}).catch(function(){btn.disabled=false;if(window.sfx)sfx.fail();err.textContent='网络开小差了'})});
fetch(f.getAttribute('action'),{method:'POST',body:fd}).then(function(r){return r.json()}).then(function(j){btn.disabled=false;if(j.status==='paid'){success()}else if(j.ok&&j.status==='claimed'){apply({status:'claimed'})}else{if(window.sfx)sfx.fail();err.textContent=j.msg||{{T "没成功,再试试"}}}}).catch(function(){btn.disabled=false;if(window.sfx)sfx.fail();err.textContent={{T "网络开小差了"}}})});
return function(){stop=true;clearInterval(timer)}
};
var pp=document.getElementById('paypanel');if(pp)window.initPayPanel(pp);
@@ -338,9 +340,9 @@ window.sfx=(function(){var ctx,on=true,C=window.AudioContext||window.webkitAudio
{{block "scripts" .}}{{end}}
</body>
</html>{{end}}
{{define "pager"}}{{if gt .Pages 1}}<nav class="pager" aria-label="分页">
{{if .HasPrev}}<a href="{{.URL .Prev}}">‹ 上一页</a>{{else}}<span class="dis">‹ 上一页</span>{{end}}
{{define "pager"}}{{if gt .Pages 1}}<nav class="pager" aria-label="{{T "分页"}}">
{{if .HasPrev}}<a href="{{.URL .Prev}}">{{T "‹ 上一页"}}</a>{{else}}<span class="dis">{{T "‹ 上一页"}}</span>{{end}}
{{range .Nums}}{{if eq . $.Page}}<span class="cur">{{.}}</span>{{else}}<a href="{{$.URL .}}">{{.}}</a>{{end}}{{end}}
{{if .HasNext}}<a href="{{.URL .Next}}">下一页 ›</a>{{else}}<span class="dis">下一页 ›</span>{{end}}
<span class="hint" style="margin-left:auto">{{.Page}}/{{.Pages}} 页</span>
{{if .HasNext}}<a href="{{.URL .Next}}">{{T "下一页 ›"}}</a>{{else}}<span class="dis">{{T "下一页 ›"}}</span>{{end}}
<span class="hint" style="margin-left:auto">{{.Page}}/{{.Pages}} {{T "页"}}</span>
</nav>{{end}}{{end}}
+9 -9
View File
@@ -1,18 +1,18 @@
{{define "title"}}站长登录 · {{.SiteTitle}}{{end}}
{{define "title"}}{{T "站长登录 ·"}} {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow">
<section class="card px">
<h1>🔑 站长登录</h1>
<p class="hint" style="font-size:14px;margin:0 0 6px">用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。</p>
<h1>{{T "🔑 站长登录"}}</h1>
<p class="hint" style="font-size:14px;margin:0 0 6px">{{T "用「X 用户名 + 开站时设的口令」登录后台。主站站长用户名留空。"}}</p>
<form method="post" action="/login">
<label for="slugIn">X 用户名</label>
<input id="slugIn" name="slug" placeholder="例如 qianyuwing(主站留空)" value="{{.Slug}}" autocapitalize="off" autocomplete="username">
<label for="pwIn">口令</label>
<label for="slugIn">{{T "X 用户名"}}</label>
<input id="slugIn" name="slug" placeholder="{{T "例如 qianyuwing(主站留空)"}}" value="{{.Slug}}" autocapitalize="off" autocomplete="username">
<label for="pwIn">{{T "口令"}}</label>
<input id="pwIn" name="password" type="password" required autocomplete="current-password">
{{if .Err}}<div class="err">{{.Err}}</div>{{end}}
<button class="btn" type="submit" style="margin-top:16px">登录</button>
{{if .Err}}<div class="err">{{T .Err}}</div>{{end}}
<button class="btn" type="submit" style="margin-top:16px">{{T "登录"}}</button>
</form>
<div class="hint" style="margin-top:12px">忘了口令?<a href="/reset">用 X 发推找回</a>。还没有要饭站?<a href="/new">用 X 开一个</a>。</div>
<div class="hint" style="margin-top:12px">{{T "忘了口令?"}}<a href="/reset">{{T "用 X 发推找回"}}</a>{{T "。还没有要饭站?"}}<a href="/new">{{T "用 X 开一个"}}</a>。</div>
</section>
</div>
{{end}}
+70 -70
View File
@@ -1,38 +1,38 @@
{{define "title"}}后台 · {{.Site.Name}} · {{.SiteTitle}}{{end}}
{{define "title"}}{{T "后台 ·"}} {{.Site.Name}} · {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow" style="max-width:720px">
{{if .Welcome}}<div class="notice ok" style="margin-bottom:12px">🎉 开张大吉!你的要饭站 <a href="{{.Site.Path}}">{{.BaseURL}}{{.Site.Path}}</a> 已上线{{if not .Site.Listed}}(待主站站长收录后进榜){{end}}。<b>下一步:</b>到下面「收款方式」把币安 App 收款页分享出来的链接贴进去(一分钟),不然施主没法给你钱。以后从 <a href="{{.LoginURL}}">站长登录</a> 进来(X 用户名 {{.Site.Slug}} + 你的口令),忘了口令可以再发推找回。</div>{{end}}
{{if .Flash}}<div class="notice ok" style="margin-bottom:12px">{{.Flash}}</div><div class="toast" id="flashToast" aria-hidden="true">✅ {{.Flash}}</div>{{end}}
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{.Err}}</div>{{end}}
{{if .Welcome}}<div class="notice ok" style="margin-bottom:12px">{{T "🎉 开张大吉!你的要饭站"}} <a href="{{.Site.Path}}">{{.BaseURL}}{{.Site.Path}}</a> {{T "已上线"}}{{if not .Site.Listed}}{{T "(待主站站长收录后进榜)"}}{{end}}。<b>{{T "下一步:"}}</b>{{T "到下面「收款方式」填上币安 UID(十秒钟),不然施主没法给你钱。"}} {{T "以后从 %s 进来(X 用户名 %s + 你的口令),忘了口令可以再发推找回。" (printf "<a href=\"%s\">%s</a>" .LoginURL (T "站长登录") | safeHTML) .Site.Slug | safeHTML}}</div>{{end}}
{{if .Flash}}<div class="notice ok" style="margin-bottom:12px">{{T .Flash}}</div><div class="toast" id="flashToast" aria-hidden="true">✅ {{T .Flash}}</div>{{end}}
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{T .Err}}</div>{{end}}
<section class="card px" style="margin-bottom:12px">
<div class="hdr">
{{if .Site.AvatarURL}}<img class="av img" style="width:48px;height:48px" src="{{.Site.AvatarURL}}" alt="">{{else}}<div class="av sq" style="width:48px;height:48px;font-size:26px">{{.Site.Avatar}}</div>{{end}}
<div class="body"><h1 style="font-size:20px;margin:0">{{.Site.Name}} <span class="hint" style="display:inline">后台</span></h1>
<div class="hint"><a href="{{.Site.Path}}">{{.BaseURL}}{{.Site.Path}}</a> · 碗里 <b class="num accent">{{fmtAmt .Stats.TotalE8}}</b> {{.Site.Currency}} · {{.Stats.Donors}} 位施主 · {{.Stats.Count}} 次 · 钢镚 {{.Coins}}{{if not .Site.Listed}} · <span class="tag claimed">待收录</span>{{end}}</div></div>
<div class="hdr-actions">{{if not .Site.IsMain}}<button class="btn sec sm" type="button" id="pwBtn">🔑 改口令</button>{{end}}<form method="post" action="/logout"><button class="btn ghost sm" type="submit">退出</button></form></div>
<div class="body"><h1 style="font-size:20px;margin:0">{{.Site.Name}} <span class="hint" style="display:inline">{{T "后台"}}</span></h1>
<div class="hint"><a href="{{.Site.Path}}">{{.BaseURL}}{{.Site.Path}}</a> {{T "· 碗里"}} <b class="num accent">{{fmtAmt .Stats.TotalE8}}</b> {{.Site.Currency}} · {{.Stats.Donors}} {{T "位施主 ·"}} {{.Stats.Count}} {{T "次 · 钢镚"}} {{.Coins}}{{if not .Site.Listed}} · <span class="tag claimed">{{T "待收录"}}</span>{{end}}</div></div>
<div class="hdr-actions">{{if not .Site.IsMain}}<button class="btn sec sm" type="button" id="pwBtn">{{T "🔑 改口令"}}</button>{{end}}<form method="post" action="/logout"><button class="btn ghost sm" type="submit">{{T "退出"}}</button></form></div>
</div>
<div class="anchors" style="margin-top:14px">
{{if .Claims}}<a href="#claims">⏳ 待确认 {{len .Claims}}</a>{{end}}
<a href="#profile">✏️ 资料</a><a href="#payment">💰 收款方式</a><a href="#donations">📜 施舍记录</a>
{{if .Claims}}<a href="#claims">{{T "⏳ 待确认"}} {{len .Claims}}</a>{{end}}
<a href="#profile">{{T "✏️ 资料"}}</a><a href="#payment">{{T "💰 收款方式"}}</a><a href="#donations">{{T "📜 施舍记录"}}</a>
{{if .Site.IsMain}}<a href="#sites">🏚 所有站点</a><a href="#messages">🧹 留言巡查</a>{{end}}
{{if .Site.IsMain}}<a href="#sites">{{T "🏚 所有站点"}}</a><a href="#messages">{{T "🧹 留言巡查"}}</a>{{end}}
</div>
</section>
{{if .Claims}}
<section class="card px" id="claims" style="margin-bottom:12px">
<h2>⏳ 待确认的施舍 <span class="tag claimed">{{len .Claims}}</span></h2>
<div class="hint" style="margin:-6px 0 8px">打开币安 App 核对到账(看金额和备注码),确认后上榜。</div>
<h2>{{T "⏳ 待确认的施舍"}} <span class="tag claimed">{{len .Claims}}</span></h2>
<div class="hint" style="margin:-6px 0 8px">{{T "打开币安 App 核对到账(看金额和备注码),确认后上榜。"}}</div>
<ul class="list feed">
{{range .Claims}}<li class="item">
<div class="av" style="--h:{{hue .NickKey}}">{{initial .Nickname}}</div>
<div class="body"><div class="name"><span>{{.Nickname}}</span></div><div class="sub">备注码 <span class="code">{{.NoteCode}}</span>{{if .BinanceOrderID}} · 币安订单 <span class="code">{{.BinanceOrderID}}</span>{{end}} · {{ago .CreatedAt}}</div></div>
<div class="body"><div class="name"><span>{{.Nickname}}</span></div><div class="sub">{{T "备注码"}} <span class="code">{{.NoteCode}}</span>{{if .BinanceOrderID}} {{T "· 币安订单"}} <span class="code">{{.BinanceOrderID}}</span>{{end}} · {{ago .CreatedAt}}</div></div>
<div class="amtv num">{{.Amount}} {{.Currency}}</div>
{{if .Message}}<div class="bubble">{{.Message}}</div>{{end}}
<div class="actions">
<form method="post" action="/manage/donation/{{.ID}}/confirm"><button class="btn sm">✓ 确认到账</button></form>
<form method="post" action="/manage/donation/{{.ID}}/reject"><button class="btn sm danger">✗ 没收到</button></form>
<form method="post" action="/manage/donation/{{.ID}}/confirm"><button class="btn sm">{{T "✓ 确认到账"}}</button></form>
<form method="post" action="/manage/donation/{{.ID}}/reject"><button class="btn sm danger">{{T "✗ 没收到"}}</button></form>
</div>
</li>{{end}}
</ul>
@@ -40,49 +40,49 @@
{{end}}
<section class="card px" id="profile" style="margin-bottom:12px">
<h2>✏️ 资料</h2>
<h2>{{T "✏️ 资料"}}</h2>
<form method="post" action="/manage/profile">
<div class="grid2">
<div>{{$lock := and .Site.XHandle (not .Site.IsMain)}}<label for="nameIn">站点标题{{if $lock}} <span class="hint" style="display:inline">(来自 X @{{.Site.XHandle}},锁定)</span>{{end}}</label><input id="nameIn" name="name" maxlength="20" value="{{.Site.Name}}" {{if $lock}}readonly{{else}}required{{end}}></div>
{{if not .Site.AvatarURL}}<div><label for="avatarIn">头像 emoji</label><input id="avatarIn" name="avatar" maxlength="12" value="{{.Site.Avatar}}"></div>{{end}}
<div>{{$lock := and .Site.XHandle (not .Site.IsMain)}}<label for="nameIn">{{T "站点标题"}}{{if $lock}} <span class="hint" style="display:inline">{{T "(来自 X @"}}{{.Site.XHandle}}{{T ",锁定)"}}</span>{{end}}</label><input id="nameIn" name="name" maxlength="20" value="{{.Site.Name}}" {{if $lock}}readonly{{else}}required{{end}}></div>
{{if not .Site.AvatarURL}}<div><label for="avatarIn">{{T "头像 emoji"}}</label><input id="avatarIn" name="avatar" maxlength="12" value="{{.Site.Avatar}}"></div>{{end}}
</div>
<label for="sloganIn">一句话口号</label><input id="sloganIn" name="slogan" maxlength="60" value="{{.Site.Slogan}}">
{{if not .Site.XHandle}}<label>绑定 X <span class="hint" style="display:inline">(主页链接或 @名字,留空不显示)</span></label><input name="x_url" maxlength="100" value="{{.Site.XURL}}" placeholder="https://x.com/你的名字">{{end}}
<button class="btn sec" type="submit" style="margin-top:14px">保存资料</button>
<label for="sloganIn">{{T "一句话口号"}}</label><input id="sloganIn" name="slogan" maxlength="60" value="{{.Site.Slogan}}">
{{if not .Site.XHandle}}<label>{{T "绑定 X"}} <span class="hint" style="display:inline">{{T "(主页链接或 @名字,留空不显示)"}}</span></label><input name="x_url" maxlength="100" value="{{.Site.XURL}}" placeholder="{{T "https://x.com/你的名字"}}">{{end}}
<button class="btn sec" type="submit" style="margin-top:14px">{{T "保存资料"}}</button>
</form>
</section>
<details class="card px fold" id="payment" style="margin-bottom:12px"{{if or .Site.IsMain (not .Site.PaymentReady)}} open{{end}}>
<summary><h2>💰 收款方式 <span class="sub">{{if .Site.IsMain}}config.env 配置{{else if eq .Site.PayMode "gateway"}}已绑币安 Key · 自动确认{{else if .Site.PaymentReady}}直接转账 · UID {{.Site.PayID}}{{else}}⚠️ 还没摆碗,点开设置{{end}}</span><span class="caret" aria-hidden="true">▸</span></h2></summary>
<summary><h2>{{T "💰 收款方式"}} <span class="sub">{{if .Site.IsMain}}{{T "config.env 配置"}}{{else if eq .Site.PayMode "gateway"}}{{T "已绑币安 Key · 自动确认"}}{{else if .Site.PaymentReady}}{{T "直接转账 · UID"}} {{.Site.PayID}}{{else}}{{T "⚠️ 还没摆碗,点开设置"}}{{end}}</span><span class="caret" aria-hidden="true">▸</span></h2></summary>
{{if .Site.IsMain}}
<div class="hint">主站的收款方式在服务器 config.env 里配置。当前:{{if eq .Site.PayMode "gateway"}}BinancePayTool 网关自动确认(默认账号){{else}}直接转账{{if .Site.PayID}},Pay ID {{.Site.PayID}}{{end}}{{end}}。</div>
{{if eq .Site.PayMode "gateway"}}<form method="post" action="/manage/verify" style="margin-top:10px"><button class="btn sec sm" type="submit">校验网关默认账号</button></form>{{end}}
<div class="hint">{{T "主站的收款方式在服务器 config.env 里配置。当前:"}}{{if eq .Site.PayMode "gateway"}}{{T "BinancePayTool 网关自动确认(默认账号)"}}{{else}}{{T "直接转账"}}{{if .Site.PayID}},Pay ID {{.Site.PayID}}{{end}}{{end}}。</div>
{{if eq .Site.PayMode "gateway"}}<form method="post" action="/manage/verify" style="margin-top:10px"><button class="btn sec sm" type="submit">{{T "校验网关默认账号"}}</button></form>{{end}}
{{else}}
{{if eq .Site.PayMode "gateway"}}
<div class="notice ok">✅ 已绑定币安账号(UID {{.Site.BinanceUID}}),施主付款后<b>自动确认上榜</b>。{{if .Site.ReceiveLink}}收银页会展示你的收款码 / 一键唤起。{{else}}建议补一个收款链接,让施主能扫码 / 一键唤起。{{end}}</div>
<div class="notice ok">{{T "✅ 已绑定币安账号(UID"}} {{.Site.BinanceUID}}{{T "),施主付款后"}}<b>{{T "自动确认上榜"}}</b>。{{if .Site.ReceiveLink}}{{T "收银页会展示你的收款码 / 一键唤起。"}}{{else}}{{T "建议补一个收款链接,让施主能扫码 / 一键唤起。"}}{{end}}</div>
<div class="btns">
<form method="post" action="/manage/verify" style="flex:1"><button class="btn sec" type="submit">重新校验 Key</button></form>
<form method="post" action="/manage/unbind" style="flex:1" onsubmit="return confirm('解绑后改为直接转账(需你手动确认到账),确定?')"><button class="btn danger" type="submit">解绑</button></form>
<form method="post" action="/manage/verify" style="flex:1"><button class="btn sec" type="submit">{{T "重新校验 Key"}}</button></form>
<form method="post" action="/manage/unbind" style="flex:1" onsubmit="return confirm({{T "解绑后改为直接转账(需你手动确认到账),确定?"}})"><button class="btn danger" type="submit">{{T "解绑"}}</button></form>
</div>
<details style="margin-top:12px"><summary class="hint" style="cursor:pointer">换一个 Key / 更新收款链接</summary>
<details style="margin-top:12px"><summary class="hint" style="cursor:pointer">{{T "换一个 Key / 更新收款链接"}}</summary>
{{template "bindform" .}}
</details>
{{else}}
<div class="notice" style="margin-bottom:12px">{{if .Site.PaymentReady}}当前是<b>直接转账</b>模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。{{else}}⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。{{end}}</div>
<h2 style="font-size:15px">方式一:填币安 UID(最简单)</h2>
<div class="hint" style="margin:6px 0 10px">币安 App → 点左上角头像,头像下面那串数字就是 <b>UID</b>(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。</div>
<div class="notice" style="margin-bottom:12px">{{if .Site.PaymentReady}}{{T "当前是"}}<b>{{T "直接转账"}}</b>{{T "模式:施主在币安 App 里按你的 UID 转账,转完点「我已施舍」,你在后台确认后上榜。"}}{{else}}{{T "⚠️ 还没摆碗:填一下币安 UID 就能收钱,十秒钟的事。"}}{{end}}</div>
<h2 style="font-size:15px">{{T "方式一:填币安 UID(最简单)"}}</h2>
<div class="hint" style="margin:6px 0 10px">{{T "币安 App → 点左上角头像,头像下面那串数字就是"}} <b>UID</b>{{T "(也是 Pay ID)。施主投币时会看到它,在币安 App「支付 → 转账」里输入就能转给你,零手续费。"}}</div>
<form method="post" action="/manage/payment">
<label for="payIdIn">币安 UID</label>
<input id="payIdIn" name="pay_id" inputmode="numeric" maxlength="60" value="{{.Site.PayID}}" placeholder="例如 12345678" required>
<label for="rlIn">收款链接 <span class="hint" style="display:inline">(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)</span></label>
<label for="payIdIn">{{T "币安 UID"}}</label>
<input id="payIdIn" name="pay_id" inputmode="numeric" maxlength="60" value="{{.Site.PayID}}" placeholder="{{T "例如 12345678"}}" required>
<label for="rlIn">{{T "收款链接"}} <span class="hint" style="display:inline">{{T "(选填。填了施主就能扫码 / 一键唤起币安 App;不填也能按 UID 转账)"}}</span></label>
<input id="rlIn" name="receive_link" maxlength="300" value="{{.Site.ReceiveLink}}" placeholder="https://app.binance.com/uni-qr/…">
<div class="hint" style="margin-top:-4px">怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。</div>
<button class="btn" type="submit" style="margin-top:14px">保存</button>
<div class="hint" style="margin-top:-4px">{{T "怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具(微信扫一扫、相册识图都行)读出图片里的链接,贴到这里。"}}</div>
<button class="btn" type="submit" style="margin-top:14px">{{T "保存"}}</button>
</form>
{{if .HasGateway}}
<h2 style="font-size:15px;margin-top:22px">方式二:绑定币安只读 API Key(到账自动确认上榜)</h2>
<div class="hint" style="margin:6px 0 4px">施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。</div>
<h2 style="font-size:15px;margin-top:22px">{{T "方式二:绑定币安只读 API Key(到账自动确认上榜)"}}</h2>
<div class="hint" style="margin:6px 0 4px">{{T "施主付完钱自动上榜,你不用手动确认。Key 只要「允许读取」权限,拿不走钱;本站不保存 Key,只交给收款网关加密存储。"}}</div>
{{template "bindform" .}}
{{end}}
{{end}}
@@ -91,84 +91,84 @@
<section class="card px" id="donations" style="margin-bottom:12px">
<h2>📜 施舍记录 <span class="sub">共 {{.DonPager.Total}} 条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复</span></h2>
<h2>{{T "📜 施舍记录"}} <span class="sub">{{T "共"}} {{.DonPager.Total}} {{T "条 · 广告可屏蔽留言或屏蔽此人(记录保留)· 可回复"}}</span></h2>
{{if .Donations}}<ul class="list feed">
{{range .Donations}}<li class="item">
<div class="av" style="--h:{{hue .NickKey}}">{{if .Blocked}}✕{{else}}{{initial .Nickname}}{{end}}</div>
<div class="body"><div class="name"><span>{{.Nickname}}</span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="tag{{if eq .Status "paid"}} paid{{else if eq .Status "claimed"}} claimed{{else if ne .Status "pending"}} bad{{end}}">{{statusText .Status}}</span>{{if .Blocked}}<span class="tag bad">已屏蔽此人</span>{{end}}</div><div class="sub">{{ago .CreatedAt}}</div></div>
<div class="body"><div class="name"><span>{{.Nickname}}</span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="tag{{if eq .Status "paid"}} paid{{else if eq .Status "claimed"}} claimed{{else if ne .Status "pending"}} bad{{end}}">{{statusText .Status}}</span>{{if .Blocked}}<span class="tag bad">{{T "已屏蔽此人"}}</span>{{end}}</div><div class="sub">{{ago .CreatedAt}}</div></div>
<div class="amtv num{{if eq .Status "paid"}} accent{{end}}">{{if eq .Status "paid"}}{{fmtAmt .ActualE8}}{{else}}{{.Amount}}{{end}}</div>
{{if .Message}}<div class="bubble{{if .MsgBlocked}} blocked{{end}}" style="letter-spacing:0">{{if .MsgBlocked}}*** <span class="hint" style="display:inline">(已屏蔽:{{.Message}})</span>{{else}}{{.Message}}{{end}}</div>{{end}}
{{if .Reply}}<div class="bubble reply">🥣 站长:{{.Reply}}</div>{{end}}
{{if .Message}}<div class="bubble{{if .MsgBlocked}} blocked{{end}}" style="letter-spacing:0">{{if .MsgBlocked}}*** <span class="hint" style="display:inline">{{T "(已屏蔽:%s)" .Message}}</span>{{else}}{{.Message}}{{end}}</div>{{end}}
{{if .Reply}}<div class="bubble reply">{{T "🥣 站长:"}}{{.Reply}}</div>{{end}}
<div class="actions">
{{if .Message}}<form method="post" action="/manage/donation/{{.ID}}/{{if .MsgBlocked}}unblock{{else}}block{{end}}"><button class="btn sm{{if .MsgBlocked}} sec{{else}} danger{{end}}">{{if .MsgBlocked}}恢复留言{{else}}屏蔽留言{{end}}</button></form>{{end}}
<form method="post" action="/manage/donation/{{.ID}}/{{if .Blocked}}unblockuser{{else}}blockuser{{end}}"><button class="btn sm{{if .Blocked}} sec{{else}} danger{{end}}">{{if .Blocked}}恢复此人{{else}}屏蔽此人{{end}}</button></form>
{{if eq .Status "paid"}}<form method="post" action="/manage/donation/{{.ID}}/reply" class="replyf"><input name="reply" maxlength="80" placeholder="回一句…" value="{{.Reply}}"><button class="btn sm sec">回复</button></form>{{end}}
{{if .Message}}<form method="post" action="/manage/donation/{{.ID}}/{{if .MsgBlocked}}unblock{{else}}block{{end}}"><button class="btn sm{{if .MsgBlocked}} sec{{else}} danger{{end}}">{{if .MsgBlocked}}{{T "恢复留言"}}{{else}}{{T "屏蔽留言"}}{{end}}</button></form>{{end}}
<form method="post" action="/manage/donation/{{.ID}}/{{if .Blocked}}unblockuser{{else}}blockuser{{end}}"><button class="btn sm{{if .Blocked}} sec{{else}} danger{{end}}">{{if .Blocked}}{{T "恢复此人"}}{{else}}{{T "屏蔽此人"}}{{end}}</button></form>
{{if eq .Status "paid"}}<form method="post" action="/manage/donation/{{.ID}}/reply" class="replyf"><input name="reply" maxlength="80" placeholder="{{T "回一句…"}}" value="{{.Reply}}"><button class="btn sm sec">{{T "回复"}}</button></form>{{end}}
</div>
</li>{{end}}
</ul>{{template "pager" .DonPager}}{{else}}<div class="empty"><div class="ico">📜</div>还没有施舍记录</div>{{end}}
</ul>{{template "pager" .DonPager}}{{else}}<div class="empty"><div class="ico">📜</div>{{T "还没有施舍记录"}}</div>{{end}}
</section>
{{if not .Site.IsMain}}
<div class="modal" id="pwModal" hidden role="dialog" aria-modal="true" aria-labelledby="pwTitle"><div class="modal-box">
<button class="modal-x" type="button" id="pwX" aria-label="关闭">✕</button>
<h2 id="pwTitle">🔑 修改口令</h2>
{{if .PwErr}}<div class="notice bad" style="margin-bottom:10px">{{.Err}}</div>{{end}}
<button class="modal-x" type="button" id="pwX" aria-label="{{T "关闭"}}">✕</button>
<h2 id="pwTitle">{{T "🔑 修改口令"}}</h2>
{{if .PwErr}}<div class="notice bad" style="margin-bottom:10px">{{T .Err}}</div>{{end}}
<form method="post" action="/manage/password">
<div class="grid2">
<div><label for="pw1">新口令(至少 6 位)</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">再输一遍</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw1">{{T "新口令(至少 6 位)"}}</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">{{T "再输一遍"}}</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
</div>
<div class="hint">改完后其它设备上的登录会失效。</div>
<button class="btn" type="submit" style="margin-top:14px">确认修改</button>
<div class="hint">{{T "改完后其它设备上的登录会失效。"}}</div>
<button class="btn" type="submit" style="margin-top:14px">{{T "确认修改"}}</button>
</form>
</div></div>
{{end}}
{{if .Site.IsMain}}
<section class="card px" id="sites" style="margin-bottom:12px">
<h2>🏚 所有要饭站 <span class="sub">{{.SitePager.Total}} 个 · 违规可除名 · 可帮站长重置口令</span></h2>
<h2>{{T "🏚 所有要饭站"}} <span class="sub">{{.SitePager.Total}} {{T "个 · 违规可除名 · 可帮站长重置口令"}}</span></h2>
{{if .Sites}}<ul class="list feed">
{{range .Sites}}<li class="item">
{{if .AvatarURL}}<img class="av img" src="{{.AvatarURL}}" alt="">{{else}}<div class="av sq">{{.Avatar}}</div>{{end}}
<div class="body"><div class="name"><span><a href="{{.Path}}">{{.Name}}</a></span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="hint" style="display:inline">/{{.Slug}}</span>{{if ne .Status "active"}}<span class="tag bad">已除名</span>{{end}}{{if not .Listed}}<span class="tag claimed">未收录</span>{{end}}</div><div class="sub">{{if .Title}}{{.Title}} · {{end}}{{if eq .PayMode "gateway"}}已绑 Key 自动确认{{else}}直接转账{{end}} · {{.Donors}} 位施主 · 钢镚 {{.Coins}} · {{ago .CreatedAt}}开张</div></div>
<div class="body"><div class="name"><span><a href="{{.Path}}">{{.Name}}</a></span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="hint" style="display:inline">/{{.Slug}}</span>{{if ne .Status "active"}}<span class="tag bad">{{T "已除名"}}</span>{{end}}{{if not .Listed}}<span class="tag claimed">{{T "未收录"}}</span>{{end}}</div><div class="sub">{{if .Title}}{{.Title}} · {{end}}{{if eq .PayMode "gateway"}}{{T "已绑 Key 自动确认"}}{{else}}{{T "直接转账"}}{{end}} · {{.Donors}} {{T "位施主 · 钢镚"}} {{.Coins}} · {{ago .CreatedAt}}{{T "开张"}}</div></div>
<div class="amtv num">{{fmtAmt .TotalE8}}</div>
<div class="actions">
<form method="post" action="/manage/site/{{.ID}}/{{if .Listed}}unlist{{else}}list{{end}}"><button class="btn sm{{if .Listed}} ghost{{end}}">{{if .Listed}}取消收录{{else}}收录上榜{{end}}</button></form>
<form method="post" action="/manage/site/{{.ID}}/{{if eq .Status "active"}}disable{{else}}enable{{end}}"><button class="btn sm{{if eq .Status "active"}} danger{{else}} sec{{end}}">{{if eq .Status "active"}}除名{{else}}恢复{{end}}</button></form>
<form method="post" action="/manage/site/{{.ID}}/resetpw" onsubmit="return confirm('重置 /{{.Slug}} 的口令?新口令只显示一次。')"><button class="btn sm ghost">重置口令</button></form>
<form method="post" action="/manage/site/{{.ID}}/{{if .Listed}}unlist{{else}}list{{end}}"><button class="btn sm{{if .Listed}} ghost{{end}}">{{if .Listed}}{{T "取消收录"}}{{else}}{{T "收录上榜"}}{{end}}</button></form>
<form method="post" action="/manage/site/{{.ID}}/{{if eq .Status "active"}}disable{{else}}enable{{end}}"><button class="btn sm{{if eq .Status "active"}} danger{{else}} sec{{end}}">{{if eq .Status "active"}}{{T "除名"}}{{else}}{{T "恢复"}}{{end}}</button></form>
<form method="post" action="/manage/site/{{.ID}}/resetpw" onsubmit="return confirm({{T "重置 /%s 的口令?新口令只显示一次。" .Slug}})"><button class="btn sm ghost">{{T "重置口令"}}</button></form>
</div>
</li>{{end}}
</ul>{{template "pager" .SitePager}}{{else}}<div class="empty"><div class="ico">🏚</div>还没有子站</div>{{end}}
</ul>{{template "pager" .SitePager}}{{else}}<div class="empty"><div class="ico">🏚</div>{{T "还没有子站"}}</div>{{end}}
</section>
<section class="card px" id="messages">
<h2>🧹 全站最新留言 <span class="sub">共 {{.MsgPager.Total}} 条 · 跨站点巡查广告</span></h2>
<h2>{{T "🧹 全站最新留言"}} <span class="sub">{{T "共"}} {{.MsgPager.Total}} {{T "条 · 跨站点巡查广告"}}</span></h2>
{{if .Messages}}<ul class="list feed">
{{range .Messages}}<li class="item">
<div class="av" style="--h:{{hue .NickKey}}">{{if .Blocked}}✕{{else}}{{initial .Nickname}}{{end}}</div>
<div class="body"><div class="name"><span>{{.Nickname}}</span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="hint" style="display:inline">→ {{.SiteName}}</span>{{if .Blocked}}<span class="tag bad">已屏蔽此人</span>{{end}}</div><div class="sub">{{ago .PaidAt}}</div></div>
<div class="body"><div class="name"><span>{{.Nickname}}</span>{{if .XHandle}}<span class="xh">@{{.XHandle}}</span>{{end}}<span class="hint" style="display:inline">→ {{.SiteName}}</span>{{if .Blocked}}<span class="tag bad">{{T "已屏蔽此人"}}</span>{{end}}</div><div class="sub">{{ago .PaidAt}}</div></div>
<div class="amtv num">{{fmtAmt .ActualE8}}</div>
<div class="bubble{{if .MsgBlocked}} blocked{{end}}" style="letter-spacing:0">{{if .MsgBlocked}}*** <span class="hint" style="display:inline">(已屏蔽:{{.Message}})</span>{{else}}{{.Message}}{{end}}</div>
<div class="actions"><form method="post" action="/manage/donation/{{.ID}}/{{if .MsgBlocked}}unblock{{else}}block{{end}}"><button class="btn sm{{if .MsgBlocked}} sec{{else}} danger{{end}}">{{if .MsgBlocked}}恢复留言{{else}}屏蔽留言{{end}}</button></form>
<form method="post" action="/manage/donation/{{.ID}}/{{if .Blocked}}unblockuser{{else}}blockuser{{end}}"><button class="btn sm{{if .Blocked}} sec{{else}} danger{{end}}">{{if .Blocked}}恢复此人{{else}}屏蔽此人{{end}}</button></form></div>
<div class="bubble{{if .MsgBlocked}} blocked{{end}}" style="letter-spacing:0">{{if .MsgBlocked}}*** <span class="hint" style="display:inline">{{T "(已屏蔽:%s)" .Message}}</span>{{else}}{{.Message}}{{end}}</div>
<div class="actions"><form method="post" action="/manage/donation/{{.ID}}/{{if .MsgBlocked}}unblock{{else}}block{{end}}"><button class="btn sm{{if .MsgBlocked}} sec{{else}} danger{{end}}">{{if .MsgBlocked}}{{T "恢复留言"}}{{else}}{{T "屏蔽留言"}}{{end}}</button></form>
<form method="post" action="/manage/donation/{{.ID}}/{{if .Blocked}}unblockuser{{else}}blockuser{{end}}"><button class="btn sm{{if .Blocked}} sec{{else}} danger{{end}}">{{if .Blocked}}{{T "恢复此人"}}{{else}}{{T "屏蔽此人"}}{{end}}</button></form></div>
</li>{{end}}
</ul>{{template "pager" .MsgPager}}{{else}}<div class="empty"><div class="ico">🧹</div>暂无留言</div>{{end}}
</ul>{{template "pager" .MsgPager}}{{else}}<div class="empty"><div class="ico">🧹</div>{{T "暂无留言"}}</div>{{end}}
</section>
{{end}}
</div>
{{end}}
{{define "bindform"}}
<form method="post" action="/manage/bind" autocomplete="off">
<div class="hint" style="margin-bottom:8px">币安 App → 账户 → API 管理 → 创建 API:<b>只勾「允许读取」</b>,其它权限都不要,<b>不用设 IP 白名单</b>(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。</div>
<div class="hint" style="margin-bottom:8px">{{T "币安 App → 账户 → API 管理 → 创建 API:"}}<b>{{T "只勾「允许读取」"}}</b>{{T ",其它权限都不要,"}}<b>{{T "不用设 IP 白名单"}}</b>{{T "(只读 Key 拿不走钱)。Key 只用来读取你的收款流水,服务端加密存储,永不展示。"}}</div>
<div class="grid2">
<div><label>API Key</label><input name="api_key" maxlength="128" required autocomplete="off"></div>
<div><label>Secret Key</label><input name="api_secret" type="password" maxlength="128" required autocomplete="new-password"></div>
</div>
<div class="grid2">
<div><label>币安 UID <span class="hint" style="display:inline">(App 头像页可见)</span></label><input name="uid" inputmode="numeric" maxlength="20" value="{{.Site.BinanceUID}}" required></div>
<div><label>收款链接 <span class="hint" style="display:inline">(选填,填了施主能扫码)</span></label><input name="receive_link" maxlength="300" value="{{.Site.ReceiveLink}}" placeholder="https://app.binance.com/uni-qr/…"></div>
<div><label>{{T "币安 UID"}} <span class="hint" style="display:inline">{{T "(App 头像页可见)"}}</span></label><input name="uid" inputmode="numeric" maxlength="20" value="{{.Site.BinanceUID}}" required></div>
<div><label>{{T "收款链接"}} <span class="hint" style="display:inline">{{T "(选填,填了施主能扫码)"}}</span></label><input name="receive_link" maxlength="300" value="{{.Site.ReceiveLink}}" placeholder="https://app.binance.com/uni-qr/…"></div>
</div>
<div class="hint" style="margin-top:-4px">收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。</div>
<button class="btn" type="submit" style="margin-top:14px">绑定并校验</button>
<div class="hint" style="margin-top:-4px">{{T "收款链接怎么拿:币安 App 收款页「保存图片」,用任意二维码识别工具读出图片里的链接。"}}</div>
<button class="btn" type="submit" style="margin-top:14px">{{T "绑定并校验"}}</button>
</form>
{{end}}
{{define "scripts"}}<script>
+36 -36
View File
@@ -1,72 +1,72 @@
{{define "title"}}{{if eq .Purpose "reset"}}用 X 找回口令{{else}}开通要饭站{{end}} · {{.SiteTitle}}{{end}}
{{define "title"}}{{if eq .Purpose "reset"}}{{T "用 X 找回口令"}}{{else}}{{T "开通要饭站"}}{{end}} · {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow">
{{if eq .Step 1}}
<section class="card px">
<h1>{{if eq .Purpose "reset"}}🔑 用 X 找回口令{{else}}🏚 开通我的要饭站{{end}}</h1>
<p class="hint" style="font-size:14px;margin:0 0 12px">{{if eq .Purpose "reset"}}发一条带验证码的推文证明你是站长本人,就能重设口令。{{else}}不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。{{end}}</p>
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{.Err}}</div>{{end}}
{{if .InApp}}<div class="notice" style="margin-bottom:12px">📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。<b>建议点右上角「⋯」选「在浏览器中打开」</b>(或复制链接到 Safari / Chrome 打开)再操作。
<div class="btns" style="margin-top:8px"><button type="button" class="btn sec sm copy" data-copy="{{.BaseURL}}{{if eq .Purpose "reset"}}/reset{{else}}/new{{end}}">复制本页链接</button></div></div>{{end}}
<h1>{{if eq .Purpose "reset"}}{{T "🔑 用 X 找回口令"}}{{else}}{{T "🏚 开通我的要饭站"}}{{end}}</h1>
<p class="hint" style="font-size:14px;margin:0 0 12px">{{if eq .Purpose "reset"}}{{T "发一条带验证码的推文证明你是站长本人,就能重设口令。"}}{{else}}{{T "不用先施舍,用你的 X 账号发一条推就能开:站名用你的 X 昵称、头像用 X 头像,一个 X 账号一个站。发推顺便帮你把碗摆到街上。"}}{{end}}</p>
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{T .Err}}</div>{{end}}
{{if .InApp}}<div class="notice" style="margin-bottom:12px">{{T "📱 你现在在 App 内置浏览器里,一键发推可能拉不起来、发完回来也可能丢状态。"}}<b>{{T "建议点右上角「⋯」选「在浏览器中打开」"}}</b>{{T "(或复制链接到 Safari / Chrome 打开)再操作。"}}
<div class="btns" style="margin-top:8px"><button type="button" class="btn sec sm copy" data-copy="{{.BaseURL}}{{if eq .Purpose "reset"}}/reset{{else}}/new{{end}}">{{T "复制本页链接"}}</button></div></div>{{end}}
<div class="steps">
<div class="step">
<h2>发一条推文,带上验证码 <span class="code">{{.Code}}</span></h2>
<label>推文内容(可以随便改,只要保留验证码)<span class="count"><button type="button" class="copy" id="nextText">换一条</button></span></label>
<h2>{{T "发一条推文,带上验证码"}} <span class="code">{{.Code}}</span></h2>
<label>{{T "推文内容(可以随便改,只要保留验证码)"}}<span class="count"><button type="button" class="copy" id="nextText">{{T "换一条"}}</button></span></label>
<textarea id="tweetText" rows="4" maxlength="280">{{index .Texts 0}}</textarea>
<div class="btns">
<a class="btn" id="intent" href="{{.IntentURL}}" target="_blank" rel="noopener">🐦 一键去 X 发推</a>
<button type="button" class="btn sec copy" data-copy-from="tweetText">复制文案</button>
<a class="btn" id="intent" href="{{.IntentURL}}" target="_blank" rel="noopener">{{T "🐦 一键去 X 发推"}}</a>
<button type="button" class="btn sec copy" data-copy-from="tweetText">{{T "复制文案"}}</button>
</div>
<a class="hint" id="intentAlt" href="{{.IntentURL}}" target="_blank" rel="noopener" hidden style="display:block;margin-top:6px;text-decoration:underline">没拉起 X App?点这里用网页版发 →</a>
<div class="hint">验证码 <b>{{.Code}}</b> 大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。</div>
<a class="hint" id="intentAlt" href="{{.IntentURL}}" target="_blank" rel="noopener" hidden style="display:block;margin-top:6px;text-decoration:underline">{{T "没拉起 X App?点这里用网页版发 →"}}</a>
<div class="hint">{{T "验证码"}} <b>{{.Code}}</b> {{T "大小写不限,24 小时内有效。文案里带着你的碗的链接,发出去顺便吆喝。"}}</div>
</div>
<div class="step">
<h2>把推文链接贴回来</h2>
<h2>{{T "把推文链接贴回来"}}</h2>
<form method="post" action="{{if eq .Purpose "reset"}}/reset/verify{{else}}/new/verify{{end}}">
<input type="hidden" name="code" value="{{.Code}}">
<label for="tweetUrl">推文链接</label>
<input id="tweetUrl" name="tweet_url" placeholder="https://x.com/你的名字/status/1234567890" value="{{.TweetURL}}" required autocapitalize="off">
<button class="btn" type="submit" style="margin-top:14px">验证</button>
<label for="tweetUrl">{{T "推文链接"}}</label>
<input id="tweetUrl" name="tweet_url" placeholder="{{T "https://x.com/你的名字/status/1234567890"}}" value="{{.TweetURL}}" required autocapitalize="off">
<button class="btn" type="submit" style="margin-top:14px">{{T "验证"}}</button>
</form>
<div class="hint">推文发出后,点推文右上角「分享 → 复制链接」即可。</div>
<div class="hint">{{T "推文发出后,点推文右上角「分享 → 复制链接」即可。"}}</div>
</div>
</div>
<div class="hint" style="margin-top:14px">{{if eq .Purpose "reset"}}还没开过站?<a href="/new">去开一个</a>{{else}}已经开过站?<a href="/login">站长登录</a>{{end}}</div>
<div class="hint" style="margin-top:14px">{{if eq .Purpose "reset"}}{{T "还没开过站?"}}<a href="/new">{{T "去开一个"}}</a>{{else}}{{T "已经开过站?"}}<a href="/login">{{T "站长登录"}}</a>{{end}}</div>
</section>
{{else if eq .Purpose "reset"}}
<section class="card px">
<h1>🔑 设置新口令</h1>
<h1>{{T "🔑 设置新口令"}}</h1>
<div class="profrow">{{if .AvatarURL}}<img class="xavatar" src="{{.AvatarURL}}" alt="">{{else}}<div class="av sq">🥣</div>{{end}}<div><b>{{.Site.Name}}</b><div class="hint" style="margin:0">@{{.Prof.Handle}} · {{.BaseURL}}{{.Site.Path}}</div></div></div>
{{if .Err}}<div class="notice bad" style="margin:12px 0">{{.Err}}</div>{{end}}
{{if .Err}}<div class="notice bad" style="margin:12px 0">{{T .Err}}</div>{{end}}
<form method="post" action="/reset">
<input type="hidden" name="code" value="{{.Code}}">
<div class="grid2">
<div><label for="pw1">新口令(至少 6 位)</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">再输一遍</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw1">{{T "新口令(至少 6 位)"}}</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">{{T "再输一遍"}}</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
</div>
<button class="btn" type="submit" style="margin-top:16px">保存并登录</button>
<button class="btn" type="submit" style="margin-top:16px">{{T "保存并登录"}}</button>
</form>
</section>
{{else}}
<section class="card px">
<h1>🏚 开通我的要饭站</h1>
<div class="notice ok">✅ X 验证通过</div>
<div class="profrow">{{if .AvatarURL}}<img class="xavatar" src="{{.AvatarURL}}" alt="">{{else}}<div class="av sq">🥣</div>{{end}}<div><b>{{.Prof.Name}}</b><div class="hint" style="margin:0">@{{.Prof.Handle}} · 站名和头像来自 X(头像会定期同步)</div></div></div>
<h1>{{T "🏚 开通我的要饭站"}}</h1>
<div class="notice ok">{{T "✅ X 验证通过"}}</div>
<div class="profrow">{{if .AvatarURL}}<img class="xavatar" src="{{.AvatarURL}}" alt="">{{else}}<div class="av sq">🥣</div>{{end}}<div><b>{{.Prof.Name}}</b><div class="hint" style="margin:0">@{{.Prof.Handle}} {{T "· 站名和头像来自 X(头像会定期同步)"}}</div></div></div>
<form method="post" action="/new" id="nf">
<input type="hidden" name="code" value="{{.Code}}">
<label>站点地址 <span class="hint" style="display:inline">(就是你的 X 用户名,不用填)</span></label>
<label>{{T "站点地址"}} <span class="hint" style="display:inline">{{T "(就是你的 X 用户名,不用填)"}}</span></label>
<div class="code" style="display:inline-block;margin-bottom:10px">{{.BaseURL}}/{{.F.Slug}}</div>
<label for="sloganIn">一句话口号</label>
<input id="sloganIn" name="slogan" maxlength="60" placeholder="行行好,赏口饭吃 🙏" value="{{.F.Slogan}}">
<div class="section-title">登录口令</div>
<div class="hint" style="margin-bottom:6px">以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。</div>
<label for="sloganIn">{{T "一句话口号"}}</label>
<input id="sloganIn" name="slogan" maxlength="60" placeholder="{{T "行行好,赏口饭吃 🙏"}}" value="{{.F.Slogan}}">
<div class="section-title">{{T "登录口令"}}</div>
<div class="hint" style="margin-bottom:6px">{{T "以后用「X 用户名 + 口令」登录后台;忘了可以再发推找回。"}}</div>
<div class="grid2">
<div><label for="pw1">口令(至少 6 位)</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">再输一遍</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw1">{{T "口令(至少 6 位)"}}</label><input id="pw1" name="password" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
<div><label for="pw2">{{T "再输一遍"}}</label><input id="pw2" name="password2" type="password" minlength="6" maxlength="72" required autocomplete="new-password"></div>
</div>
{{if .Err}}<div class="err">{{.Err}}</div>{{end}}
<button class="btn" type="submit" style="margin-top:18px">开张 🏚</button>
<div class="hint" style="margin-top:10px">开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。</div>
{{if .Err}}<div class="err">{{T .Err}}</div>{{end}}
<button class="btn" type="submit" style="margin-top:18px">{{T "开张 🏚"}}</button>
<div class="hint" style="margin-top:10px">{{T "开通后在后台绑定币安 Key 或填收款码就能收钱。站点内容自负,广告站会被丐帮除名。"}}</div>
</form>
</section>
{{end}}
+3 -3
View File
@@ -1,10 +1,10 @@
{{define "title"}}给 {{.Site.Name}} 施舍 {{.D.Amount}} {{.D.Currency}} · {{.SiteTitle}}{{end}}
{{define "title"}}{{T "给 %s 施舍" .Site.Name}} {{.D.Amount}} {{.D.Currency}} · {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow">
<section class="card px">
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{.Err}}</div>{{end}}
{{if .Err}}<div class="notice bad" style="margin-bottom:12px">{{T .Err}}</div>{{end}}
{{template "paypanel" .Panel}}
<div class="hint center" style="margin-top:12px"><a href="{{.Site.Path}}">先回去看看</a></div>
<div class="hint center" style="margin-top:12px"><a href="{{.Site.Path}}">{{T "先回去看看"}}</a></div>
</section>
</div>
{{end}}
+22 -22
View File
@@ -1,48 +1,48 @@
{{define "paypanel"}}<div class="paypanel" id="paypanel" data-code="{{.D.Code}}" data-status="{{.D.Status}}" data-mode="{{.Mode}}" data-site="{{.Site.Path}}" data-amount="{{.Amount}}">
<div class="center">
<div class="hint">给 {{.Site.Name}} 投币</div>
<div class="hint">{{T "给 %s 投币" .Site.Name}}</div>
<div class="big num accent">{{.Amount}}<small>{{.D.Currency}}</small></div>
{{if eq .Mode "gateway"}}<div class="hint">金额要<b>一分不差</b>,网关靠这个唯一尾数自动认账,转完几秒内到账</div>{{else}}<div class="hint">用币安 Pay 直接转给站长,转完点下面「我已施舍」</div>{{end}}
{{if eq .Mode "gateway"}}<div class="hint">{{T "金额要"}}<b>{{T "一分不差"}}</b>{{T ",网关靠这个唯一尾数自动认账,转完几秒内到账"}}</div>{{else}}<div class="hint">{{T "用币安 Pay 直接转给站长,转完点下面「我已施舍」"}}</div>{{end}}
</div>
{{if .QR}}
{{if .IsMobile}}
<a class="btn" href="{{.AppLink}}" style="margin-top:12px">打开币安 App 转账</a>
<div class="hint center">唤起后手动输入金额 <b class="num">{{.Amount}}</b>{{if .NoteCode}},备注填 <b class="num">{{.NoteCode}}</b>{{end}}</div>
<details style="margin-top:8px"><summary class="hint" style="cursor:pointer">用另一台手机扫码</summary><img class="qr" src="data:image/png;base64,{{.QR}}" alt="收款二维码"></details>
<a class="btn" href="{{.AppLink}}" style="margin-top:12px">{{T "打开币安 App 转账"}}</a>
<div class="hint center">{{T "唤起后手动输入金额"}} <b class="num">{{.Amount}}</b>{{if .NoteCode}}{{T ",备注填"}} <b class="num">{{.NoteCode}}</b>{{end}}</div>
<details style="margin-top:8px"><summary class="hint" style="cursor:pointer">{{T "用另一台手机扫码"}}</summary><img class="qr" src="data:image/png;base64,{{.QR}}" alt="{{T "收款二维码"}}"></details>
{{else}}
<img class="qr" src="data:image/png;base64,{{.QR}}" alt="收款二维码">
<div class="hint center">币安 App → 首页「扫一扫」→ 输入金额 <b class="num">{{.Amount}}</b>{{if .NoteCode}},备注填 <b class="num">{{.NoteCode}}</b>{{end}}</div>
<img class="qr" src="data:image/png;base64,{{.QR}}" alt="{{T "收款二维码"}}">
<div class="hint center">{{T "币安 App → 首页「扫一扫」→ 输入金额"}} <b class="num">{{.Amount}}</b>{{if .NoteCode}}{{T ",备注填"}} <b class="num">{{.NoteCode}}</b>{{end}}</div>
{{end}}
<div class="section-title">或手动转账</div>
{{else}}<div class="section-title" style="margin-top:12px">转账信息</div>
{{if .PayID}}<div class="hint">币安 App → 底部「<b>支付</b>」→「<b>转账</b>」→ 收款方输入下面的 UID → 金额填 <b class="num">{{.Amount}}</b>{{if .NoteCode}} → 备注填 <b class="num">{{.NoteCode}}</b>{{end}} → 转完回来点「我已施舍」</div>{{end}}{{end}}
<div class="section-title">{{T "或手动转账"}}</div>
{{else}}<div class="section-title" style="margin-top:12px">{{T "转账信息"}}</div>
{{if .PayID}}<div class="hint">{{T "币安 App → 底部「支付」→「转账」→ 收款方输入下面的 UID → 金额填"}} <b class="num">{{.Amount}}</b>{{if .NoteCode}} {{T "→ 备注填"}} <b class="num">{{.NoteCode}}</b>{{end}} {{T "→ 转完回来点「我已施舍」"}}</div>{{end}}{{end}}
<div class="kv">
{{if .PayID}}<span class="k">收款方</span><span class="v"><span class="code">{{.PayID}}</span><button type="button" class="copy" data-copy="{{.PayID}}">复制</button></span>{{end}}
<span class="k">金额</span><span class="v"><span class="code">{{.Amount}} {{.D.Currency}}</span><button type="button" class="copy" data-copy="{{.Amount}}">复制</button></span>
{{if .NoteCode}}<span class="k">备注</span><span class="v"><span class="code">{{.NoteCode}}</span><button type="button" class="copy" data-copy="{{.NoteCode}}">复制</button></span>{{end}}
{{if .PayID}}<span class="k">{{T "收款方"}}</span><span class="v"><span class="code">{{.PayID}}</span><button type="button" class="copy" data-copy="{{.PayID}}">{{T "复制"}}</button></span>{{end}}
<span class="k">{{T "金额"}}</span><span class="v"><span class="code">{{.Amount}} {{.D.Currency}}</span><button type="button" class="copy" data-copy="{{.Amount}}">{{T "复制"}}</button></span>
{{if .NoteCode}}<span class="k">{{T "备注"}}</span><span class="v"><span class="code">{{.NoteCode}}</span><button type="button" class="copy" data-copy="{{.NoteCode}}">{{T "复制"}}</button></span>{{end}}
</div>
<div class="pp-status" id="ppStatus">
{{if eq .D.Status "claimed"}}
<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> 已提交,等站长确认后上榜。本页会自动更新。</div>
<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> {{T "已提交,等站长确认后上榜。本页会自动更新。"}}</div>
{{else if eq .Mode "gateway"}}
<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> 等待到账…转完自动确认,本页会自动更新</div>
{{if .Owned}}<details style="margin-top:10px"><summary class="hint" style="cursor:pointer">付了但一直没确认?</summary>
<div class="notice" style="margin-top:12px"><span class="spin-inline"></span> {{T "等待到账…转完自动确认,本页会自动更新"}}</div>
{{if .Owned}}<details style="margin-top:10px"><summary class="hint" style="cursor:pointer">{{T "付了但一直没确认?"}}</summary>
<form class="claimf" method="post" action="/d/{{.D.Code}}/claim">
<label>币安订单编号(18 位数字,转账详情里有)</label>
<label>{{T "币安订单编号(18 位数字,转账详情里有)"}}</label>
<input name="binance_order_id" inputmode="numeric" maxlength="18" placeholder="4520……" required>
<button class="btn sec" type="submit" style="margin-top:10px">我付过了,帮我核对</button>
<button class="btn sec" type="submit" style="margin-top:10px">{{T "我付过了,帮我核对"}}</button>
<div class="err claim-err"></div>
</form></details>{{end}}
{{else if .Owned}}
<form class="claimf" method="post" action="/pay/{{.D.Code}}/claim" style="margin-top:12px">
<label>币安订单编号(可选,18 位数字,填了站长确认更快)</label>
<label>{{T "币安订单编号(可选,18 位数字,填了站长确认更快)"}}</label>
<input name="binance_order_id" inputmode="numeric" maxlength="18" placeholder="4520……">
<button class="btn" type="submit" style="margin-top:10px">我已施舍,等站长确认</button>
<button class="btn" type="submit" style="margin-top:10px">{{T "我已施舍,等站长确认"}}</button>
<div class="err claim-err"></div>
</form>
{{else}}
<div class="hint" style="margin-top:12px">「我已施舍」要在发起施舍的那台设备上点。</div>
<div class="hint" style="margin-top:12px">{{T "「我已施舍」要在发起施舍的那台设备上点。"}}</div>
{{end}}
</div>
{{if .Fallback}}<div class="hint center" style="margin-top:12px">打不开?<a href="{{.Fallback}}" target="_blank" rel="noopener">用网关收银页支付</a></div>{{end}}
{{if .Fallback}}<div class="hint center" style="margin-top:12px">{{T "打不开?"}}<a href="{{.Fallback}}" target="_blank" rel="noopener">{{T "用网关收银页支付"}}</a></div>{{end}}
</div>{{end}}
+14 -14
View File
@@ -1,48 +1,48 @@
{{define "title"}}排行榜 · {{.SiteTitle}}{{end}}
{{define "title"}}{{T "排行榜 ·"}} {{T .SiteTitle}}{{end}}
{{define "content"}}
<div style="max-width:760px;margin:0 auto">
<section class="card px">
<div class="tabs" role="tablist">
<button class="tab on" type="button" role="tab" id="t-donors" aria-controls="p-donors" aria-selected="true" data-t="donors">🏆 施主榜</button>
<button class="tab" type="button" role="tab" id="t-beggars" aria-controls="p-beggars" aria-selected="false" data-t="beggars">🥣 乞丐榜</button>
<button class="tab" type="button" role="tab" id="t-popular" aria-controls="p-popular" aria-selected="false" data-t="popular">🪙 人气榜</button>
<button class="tab on" type="button" role="tab" id="t-donors" aria-controls="p-donors" aria-selected="true" data-t="donors">{{T "🏆 施主榜"}}</button>
<button class="tab" type="button" role="tab" id="t-beggars" aria-controls="p-beggars" aria-selected="false" data-t="beggars">{{T "🥣 乞丐榜"}}</button>
<button class="tab" type="button" role="tab" id="t-popular" aria-controls="p-popular" aria-selected="false" data-t="popular">{{T "🪙 人气榜"}}</button>
</div>
<div class="panel on" id="p-donors" role="tabpanel" aria-labelledby="t-donors">
<div class="hint" style="margin-bottom:8px">HIGH SCORE · 所有要饭站加起来 · 共 {{.PgDonors.Total}} 位施主</div>
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="hint" style="margin-bottom:8px">{{T "HIGH SCORE · 所有要饭站加起来 · 共"}} {{.PgDonors.Total}} {{T "位施主"}}</div>
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">{{T "总榜"}}</button><button type="button" data-w="week">{{T "本周"}}</button></div>
<div class="wk donors-all">{{template "gdonorlist" (dict "Rows" .Donors "Start" .PgDonors.Offset)}}{{template "pager" .PgDonors}}</div>
<div class="wk donors-week" hidden>{{template "gdonorlist" (dict "Rows" .DonorsWeek "Start" .PgDonorsWeek.Offset)}}{{template "pager" .PgDonorsWeek}}</div>
</div>
<div class="panel" id="p-beggars" role="tabpanel" aria-labelledby="t-beggars">
<div class="hint" style="margin-bottom:8px">要到最多的要饭站 · 共 {{.PgSites.Total}} 个</div>
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="hint" style="margin-bottom:8px">{{T "要到最多的要饭站 · 共"}} {{.PgSites.Total}} {{T "个"}}</div>
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">{{T "总榜"}}</button><button type="button" data-w="week">{{T "本周"}}</button></div>
<div class="wk beggars-all">{{template "gsitelist" (dict "Rows" .Sites "By" "amount" "Me" .MeID "Start" .PgSites.Offset)}}{{template "pager" .PgSites}}</div>
<div class="wk beggars-week" hidden>{{template "gsitelist" (dict "Rows" .SitesWeek "By" "amount" "Me" .MeID "Start" .PgSitesWeek.Offset)}}{{template "pager" .PgSitesWeek}}</div>
</div>
<div class="panel" id="p-popular" role="tabpanel" aria-labelledby="t-popular">
<div class="hint" style="margin-bottom:8px">收到钢镚最多(免费投)· 共 {{.PgPopular.Total}} 个</div>
<div class="hint" style="margin-bottom:8px">{{T "收到钢镚最多(免费投)· 共"}} {{.PgPopular.Total}} {{T "个"}}</div>
{{template "gsitelist" (dict "Rows" .Popular "By" "coins" "Me" .MeID "Start" .PgPopular.Offset)}}{{template "pager" .PgPopular}}
</div>
</section>
{{if ne .HomePath "/"}}<div class="center" style="margin-top:14px"><a class="btn sec" href="{{.HomePath}}">← 回到刚才看的碗</a></div>{{end}}
{{if ne .HomePath "/"}}<div class="center" style="margin-top:14px"><a class="btn sec" href="{{.HomePath}}">{{T "← 回到刚才看的碗"}}</a></div>{{end}}
</div>
{{end}}
{{define "gdonorlist"}}{{if .Rows}}<ul class="list">
{{range $i, $r := .Rows}}{{$n := add $i $.Start}}<li class="item">
<div class="rank{{if lt $n 3}} m{{end}}">{{rankBadge $n}}</div>
{{$h := handleOf $r.NickKey}}{{$f := xav $h}}{{if $f}}<img class="av img" src="/a/{{$f}}" alt="">{{else}}<div class="av" style="--h:{{hue $r.NickKey}}">{{initial $r.Nickname}}</div>{{end}}
<div class="body"><div class="name"><span>{{$r.Nickname}}</span>{{if $h}}<span class="xh" title="施主自己填的 X,未经验证">@{{$h}}</span>{{end}}</div><div class="sub">{{donorTier $r.TotalE8}} · {{$r.Count}} 次 · 施舍过 {{$r.Sites}} 个乞丐</div></div>
<div class="body"><div class="name"><span>{{$r.Nickname}}</span>{{if $h}}<span class="xh" title="{{T "施主自己填的 X,未经验证"}}">@{{$h}}</span>{{end}}</div><div class="sub">{{donorTier $r.TotalE8}} · {{$r.Count}} {{T "次 · 施舍过"}} {{$r.Sites}} {{T "个乞丐"}}</div></div>
<div class="amtv num accent">{{fmtAmt $r.TotalE8}}</div>
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">👑</div>榜上无人</div>{{end}}{{end}}
</ul>{{else}}<div class="empty"><div class="ico">👑</div>{{T "榜上无人"}}</div>{{end}}{{end}}
{{define "gsitelist"}}{{if .Rows}}<ul class="list">
{{range $i, $s := .Rows}}{{$n := add $i $.Start}}<li class="item">
<div class="rank{{if lt $n 3}} m{{end}}">{{rankBadge $n}}</div>
{{if $s.AvatarURL}}<img class="av img" src="{{$s.AvatarURL}}" alt="">{{else}}<div class="av sq">{{$s.Avatar}}</div>{{end}}
<div class="body"><div class="name"><span><a href="{{$s.Path}}">{{$s.Name}}</a></span>{{if eq $s.ID $.Me}}<span class="me">就是我</span>{{end}}</div><div class="sub">{{if $s.Title}}{{$s.Title}} · {{end}}{{(level $s.Exp).Title}} · {{$s.Donors}} 位施主 · 钢镚 {{$s.Coins}}</div></div>
<div class="body"><div class="name"><span><a href="{{$s.Path}}">{{$s.Name}}</a></span>{{if eq $s.ID $.Me}}<span class="me">{{T "就是我"}}</span>{{end}}</div><div class="sub">{{if $s.Title}}{{T $s.Title}} · {{end}}{{(level $s.Exp).Title}} · {{$s.Donors}} {{T "位施主 · 钢镚"}} {{$s.Coins}}</div></div>
<div class="amtv num{{if ne $.By "coins"}} accent{{end}}">{{if eq $.By "coins"}}🪙 {{$s.Coins}}{{else}}{{fmtAmt $s.TotalE8}}{{end}}</div>
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">🏚</div>还没有人上榜</div>{{end}}{{end}}
</ul>{{else}}<div class="empty"><div class="ico">🏚</div>{{T "还没有人上榜"}}</div>{{end}}{{end}}
{{define "scripts"}}<script>
(function(){
var tabs=document.querySelectorAll('.tab'),panels=document.querySelectorAll('.panel');
+51 -51
View File
@@ -1,66 +1,66 @@
{{define "title"}}{{.Site.Name}} 在要饭 · {{.SiteTitle}}{{end}}
{{define "title"}}{{.Site.Name}} {{T "在要饭 ·"}} {{T .SiteTitle}}{{end}}
{{define "content"}}
{{$lv := level .Exp}}
<div class="layout">
<aside class="col-l">
{{if not .Site.Listed}}<div class="notice">🕵️ 这个站还没被丐帮收录,暂不进榜。{{if and .Me (eq .Me.ID .Site.ID)}}主站站长审核后会收录。{{end}}</div>{{end}}
{{if not .Site.Listed}}<div class="notice">{{T "🕵️ 这个站还没被丐帮收录,暂不进榜。"}}{{if and .Me (eq .Me.ID .Site.ID)}}{{T "主站站长审核后会收录。"}}{{end}}</div>{{end}}
<section class="card px" id="topcard">
<div class="char-top">
<div class="sprite-wrap">{{template "sprite"}}</div>
<div class="char-info">
<div class="lvrow"><span class="lv">Lv.{{$lv.Lv}}<b>{{$lv.Title}}</b></span>{{if .SectTitle}}<span class="lv gold">{{.SectTitle}}{{if .Position}} · 榜 #{{.Position}}{{end}}</span>{{end}}</div>
<div class="lvrow"><span class="lv">Lv.{{$lv.Lv}}<b>{{$lv.Title}}</b></span>{{if .SectTitle}}<span class="lv gold">{{T .SectTitle}}{{if .Position}} {{T "· 榜 #"}}{{.Position}}{{end}}</span>{{end}}</div>
<h1 class="pname">{{if .Site.AvatarURL}}<img class="xavatar" src="{{.Site.AvatarURL}}" alt="">{{else}}{{.Site.Avatar}} {{end}}{{.Site.Name}}</h1>
<div class="barlabel">EXP <b>{{.Exp}}</b>{{if $lv.Next}}<span>升{{$lv.NextT}}要 {{$lv.Next}}</span>{{else}}<span>满级</span>{{end}}</div>
<div class="barlabel">EXP <b>{{.Exp}}</b>{{if $lv.Next}}<span>{{T "升%s要 %s" (T $lv.NextT) $lv.Next}}</span>{{else}}<span>{{T "满级"}}</span>{{end}}</div>
<div class="bar xp"><span style="width:{{$lv.Pct}}%"></span></div>
<div class="barlabel">饱食度 <b>{{satiety .Stats.TodayE8}}%</b><span>{{if eq (satiety .Stats.TodayE8) 0}}今天还没吃饭{{else}}今天有人投币了{{end}}</span></div>
<div class="barlabel">{{T "饱食度"}} <b>{{satiety .Stats.TodayE8}}%</b><span>{{if eq (satiety .Stats.TodayE8) 0}}{{T "今天还没吃饭"}}{{else}}{{T "今天有人投币了"}}{{end}}</span></div>
<div class="bar hp"><span style="width:{{satiety .Stats.TodayE8}}%"></span></div>
{{if .Site.XLabel}}<a class="xpill" href="https://x.com/{{.Site.XLabel}}" target="_blank" rel="noopener">𝕏 @{{.Site.XLabel}}</a>{{end}}
</div>
</div>
{{if .Site.Slogan}}<div class="dialog"><span class="typer" data-text="{{.Site.Slogan}}">{{.Site.Slogan}}</span><span class="cursor">▼</span></div>{{end}}
<div class="coinrow">
<button type="button" class="btn sec sm coinbtn" id="coinbtn" data-site="{{.Site.Slug}}" {{if ge .MyCoins .CoinsPerDay}}disabled{{end}}>{{template "coin"}}<span id="coinTxt">{{if ge .MyCoins .CoinsPerDay}}今天丢过了{{else}}丢个钢镚(免费){{end}}</span></button>
{{if .Ready}}<a class="btn sm" id="donateBtn" href="#donate">💸 投币施舍</a>{{else}}<span class="hint" style="margin:0">还没摆碗,暂不能投币{{if and .Me (eq .Me.ID .Site.ID)}},<a href="/manage#payment">去配置</a>{{end}}</span>{{end}}
<button type="button" class="btn sec sm coinbtn" id="coinbtn" data-site="{{.Site.Slug}}" {{if ge .MyCoins .CoinsPerDay}}disabled{{end}}>{{template "coin"}}<span id="coinTxt">{{if ge .MyCoins .CoinsPerDay}}{{T "今天丢过了"}}{{else}}{{T "丢个钢镚(免费)"}}{{end}}</span></button>
{{if .Ready}}<a class="btn sm" id="donateBtn" href="#donate">{{T "💸 投币施舍"}}</a>{{else}}<span class="hint" style="margin:0">{{T "还没摆碗,暂不能投币"}}{{if and .Me (eq .Me.ID .Site.ID)}},<a href="/manage#payment">{{T "去配置"}}</a>{{end}}</span>{{end}}
</div>
<div class="coins hint" style="margin-top:8px">钢镚 <b class="pf coinN">{{.Coins}}</b> · 今日 <b id="coinT" class="pf">{{.CoinsToday}}</b> · 每 0.1 U = {{.MoneyExp | div10}} EXP · 每个钢镚 = {{.CoinExp}} EXP</div>
<div class="coins hint" style="margin-top:8px">{{T "钢镚"}} <b class="pf coinN">{{.Coins}}</b> {{T "· 今日"}} <b id="coinT" class="pf">{{.CoinsToday}}</b> {{T "· 每 0.1 U ="}} {{.MoneyExp | div10}} {{T "EXP · 每个钢镚 ="}} {{.CoinExp}} EXP</div>
</section>
<section class="stats">
<div class="stat main px">{{template "bowlicon"}}<div style="min-width:0;flex:1"><div class="k">碗里已有</div><div class="v num bowlv"><span>{{fmtAmt .Stats.TotalE8}}<small>{{.Site.Currency}}</small></span><span class="bowlcoins">{{template "coin"}}<b class="coinN">{{.Coins}}</b><small>钢镚</small></span></div></div>
<div class="sub2"><span><i>施主</i><b class="num">{{.Stats.Donors}}</b><small>人</small></span><span><i>今日</i><b class="num">+{{fmtAmt .Stats.TodayE8}}</b></span></div></div>
<div class="stat main px">{{template "bowlicon"}}<div style="min-width:0;flex:1"><div class="k">{{T "碗里已有"}}</div><div class="v num bowlv"><span>{{fmtAmt .Stats.TotalE8}}<small>{{.Site.Currency}}</small></span><span class="bowlcoins">{{template "coin"}}<b class="coinN">{{.Coins}}</b><small>{{T "钢镚"}}</small></span></div></div>
<div class="sub2"><span><i>{{T "施主"}}</i><b class="num">{{.Stats.Donors}}</b><small>{{T "人"}}</small></span><span><i>{{T "今日"}}</i><b class="num">+{{fmtAmt .Stats.TodayE8}}</b></span></div></div>
</section>
<section class="card px donate-card" id="donate">
<h2>🕹️ 投币施舍</h2>
<h2>{{T "🕹️ 投币施舍"}}</h2>
{{if .Ready}}
<div class="insert blink">▶ INSERT COIN ◀</div>
<form method="post" action="/donate" id="f">
<input type="hidden" name="site" value="{{.Site.Slug}}">
<div class="grid2">
<div><label for="nick">玩家名(上榜用,可留空)</label><input id="nick" name="nickname" maxlength="20" placeholder="匿名施主" value="{{.Nick}}" autocomplete="nickname"></div>
<div><label for="xh">你的 X(可选,显示头像)</label><input id="xh" name="x_handle" maxlength="16" placeholder="@name" value="{{.XHandle}}" autocapitalize="off"></div>
<div><label for="nick">{{T "玩家名(上榜用,可留空)"}}</label><input id="nick" name="nickname" maxlength="20" placeholder="{{T "匿名施主"}}" value="{{.Nick}}" autocomplete="nickname"></div>
<div><label for="xh">{{T "你的 X(可选,显示头像)"}}</label><input id="xh" name="x_handle" maxlength="16" placeholder="@name" value="{{.XHandle}}" autocapitalize="off"></div>
</div>
<label>投多少 {{.Site.Currency}}</label>
<label>{{T "投多少"}} {{.Site.Currency}}</label>
<div class="amounts" id="amounts">
{{range .Presets}}<button type="button" class="amt-btn" data-v="{{.}}">{{template "coin"}}{{.}}</button>{{end}}
<button type="button" class="amt-btn" data-v="">✏️ 自定义</button>
<button type="button" class="amt-btn" data-v="">{{T "✏️ 自定义"}}</button>
</div>
<input name="amount" id="amount" inputmode="decimal" autocomplete="off" placeholder="输入金额,最多两位小数" value="{{.Amount}}" required style="margin-top:10px">
<label for="msg">对乞丐喊话 <span class="count" id="cnt">0/80</span></label>
<textarea id="msg" name="message" maxlength="80" rows="2" placeholder="例如:别买烟了,去吃饭">{{.Message}}</textarea>
{{if .Err}}<div class="err">{{.Err}}</div>{{end}}
<button class="btn" type="submit" id="cta" style="margin-top:16px">投币 💸</button>
<div class="hint" style="margin-top:10px">{{if eq .Site.PayMode "gateway"}}币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。{{else}}通过币安 Pay 直接转给站长,提交后由站长确认上榜。{{end}}最少 {{.MinAmount}},最多 {{.MaxAmount}}。留言里不能放链接和联系方式。</div>
<input name="amount" id="amount" inputmode="decimal" autocomplete="off" placeholder="{{T "输入金额,最多两位小数"}}" value="{{.Amount}}" required style="margin-top:10px">
<label for="msg">{{T "对乞丐喊话"}} <span class="count" id="cnt">0/80</span></label>
<textarea id="msg" name="message" maxlength="80" rows="2" placeholder="{{T "例如:别买烟了,去吃饭"}}">{{.Message}}</textarea>
{{if .Err}}<div class="err">{{T .Err}}</div>{{end}}
<button class="btn" type="submit" id="cta" style="margin-top:16px">{{T "投币 💸"}}</button>
<div class="hint" style="margin-top:10px">{{if eq .Site.PayMode "gateway"}}{{T "币安 App 扫码 / 一键唤起支付,到账后自动刻上功德簿。"}}{{else}}{{T "通过币安 Pay 直接转给站长,提交后由站长确认上榜。"}}{{end}}{{T "最少 %s,最多 %s。留言里不能放链接和联系方式。" .MinAmount .MaxAmount}}</div>
</form>
{{else}}
<div class="notice">这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。{{if and .Me (eq .Me.ID .Site.ID)}}<a href="/manage#payment">去后台配置 →</a>{{end}}</div>
<div class="notice">{{T "这位乞丐还没摆碗(未配置收款方式),暂时收不了钱。"}}{{if and .Me (eq .Me.ID .Site.ID)}}<a href="/manage#payment">{{T "去后台配置 →"}}</a>{{end}}</div>
{{end}}
</section>
{{if and .SubsitesEnabled (not .Me)}}<div class="only-desktop">
<section class="card px cta">
<h2 style="justify-content:center">🏚 想自己要饭?</h2>
<p>用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。</p>
<a class="btn sec" href="/new">用 X 开通我的要饭站 →</a>
<h2 style="justify-content:center">{{T "🏚 想自己要饭?"}}</h2>
<p>{{T "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。"}}</p>
<a class="btn sec" href="/new">{{T "用 X 开通我的要饭站 →"}}</a>
</section>
</div>{{end}}
</aside>
@@ -68,69 +68,69 @@
<main class="col-r">
<section class="card px">
<div class="tabs four" role="tablist">
<button class="tab on" type="button" role="tab" id="t-popular" aria-controls="p-popular" aria-selected="true" data-t="popular">人气榜</button>
<button class="tab" type="button" role="tab" id="t-feed" aria-controls="p-feed" aria-selected="false" data-t="feed">功德簿</button>
<button class="tab" type="button" role="tab" id="t-donors" aria-controls="p-donors" aria-selected="false" data-t="donors">施主榜</button>
<button class="tab" type="button" role="tab" id="t-beggars" aria-controls="p-beggars" aria-selected="false" data-t="beggars">乞丐榜</button>
<button class="tab on" type="button" role="tab" id="t-popular" aria-controls="p-popular" aria-selected="true" data-t="popular">{{T "人气榜"}}</button>
<button class="tab" type="button" role="tab" id="t-feed" aria-controls="p-feed" aria-selected="false" data-t="feed">{{T "功德簿"}}</button>
<button class="tab" type="button" role="tab" id="t-donors" aria-controls="p-donors" aria-selected="false" data-t="donors">{{T "施主榜"}}</button>
<button class="tab" type="button" role="tab" id="t-beggars" aria-controls="p-beggars" aria-selected="false" data-t="beggars">{{T "乞丐榜"}}</button>
</div>
<div class="panel" id="p-feed" role="tabpanel" aria-labelledby="t-feed">
{{if .Feed}}<ul class="list feed">
{{range .Feed}}<li class="item">
{{template "avatar" .}}
<div class="body"><div class="name"><span>{{if .Blocked}}已屏蔽的施主{{else}}{{.Nickname}}{{end}}</span>{{if and .XHandle (not .Blocked)}}<span class="xh" title="施主自己填的 X,未经验证">@{{.XHandle}}</span>{{end}}</div><div class="sub">{{ago .PaidAt}} 投币</div></div>
<div class="body"><div class="name"><span>{{if .Blocked}}{{T "已屏蔽的施主"}}{{else}}{{.Nickname}}{{end}}</span>{{if and .XHandle (not .Blocked)}}<span class="xh" title="{{T "施主自己填的 X,未经验证"}}">@{{.XHandle}}</span>{{end}}</div><div class="sub">{{ago .PaidAt}} {{T "投币"}}</div></div>
<div class="amtv num accent">+{{fmtAmt .ActualE8}}</div>
{{if .Blocked}}{{else if .MsgBlocked}}<div class="bubble blocked">***</div>{{else if .Message}}<div class="bubble">{{.Message}}</div>{{end}}
{{if and .Reply (not .Blocked)}}<div class="bubble reply">🥣 站长:{{.Reply}}</div>{{end}}
{{if and .Reply (not .Blocked)}}<div class="bubble reply">{{T "🥣 站长:"}}{{.Reply}}</div>{{end}}
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">📜</div>功德簿空空如也,第一枚硬币会刻在这里</div>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">📜</div>{{T "功德簿空空如也,第一枚硬币会刻在这里"}}</div>{{end}}
</div>
<div class="panel" id="p-donors" role="tabpanel" aria-labelledby="t-donors">
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="hint" style="margin:-4px 0 8px">HIGH SCORE · 给 {{.Site.Name}} 投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客</div>
<div class="toggle" data-for="donors"><button type="button" class="on" data-w="all">{{T "总榜"}}</button><button type="button" data-w="week">{{T "本周"}}</button></div>
<div class="hint" style="margin:-4px 0 8px">{{T "HIGH SCORE · 给"}} {{.Site.Name}} {{T "投币最多的人 · 🏁 首位施主 💎 单笔最大 🔥 常客"}}</div>
<div class="wk donors-all">{{template "donorlist" (dict "Rows" .Rank "Badges" .Badges)}}</div>
<div class="wk donors-week" hidden>{{template "donorlist" (dict "Rows" .RankWeek "Badges" .Badges)}}</div>
</div>
<div class="panel" id="p-beggars" role="tabpanel" aria-labelledby="t-beggars">
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">总榜</button><button type="button" data-w="week">本周</button></div>
<div class="hint" style="margin:-4px 0 8px">丐帮排名 · 要到最多的要饭站</div>
<div class="toggle" data-for="beggars"><button type="button" class="on" data-w="all">{{T "总榜"}}</button><button type="button" data-w="week">{{T "本周"}}</button></div>
<div class="hint" style="margin:-4px 0 8px">{{T "丐帮排名 · 要到最多的要饭站"}}</div>
<div class="wk beggars-all">{{template "sitelist" (dict "Rows" .Subsites "Me" .MeID "Here" .Site.ID "By" "amount")}}</div>
<div class="wk beggars-week" hidden>{{template "sitelist" (dict "Rows" .SubsitesWeek "Me" .MeID "Here" .Site.ID "By" "amount")}}</div>
</div>
<div class="panel on" id="p-popular" role="tabpanel" aria-labelledby="t-popular">
<div class="hint" style="margin:-4px 0 8px">人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)</div>
<div class="hint" style="margin:-4px 0 8px">{{T "人气榜 · 收到钢镚最多的要饭站(钢镚免费,不用花钱)"}}</div>
{{template "sitelist" (dict "Rows" .Popular "Me" .MeID "Here" .Site.ID "By" "coins")}}
</div>
</section>
{{if and .SubsitesEnabled (not .Me)}}<div class="only-mobile">
<section class="card px cta">
<h2 style="justify-content:center">🏚 想自己要饭?</h2>
<p>用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。</p>
<a class="btn sec" href="/new">用 X 开通我的要饭站 →</a>
<h2 style="justify-content:center">{{T "🏚 想自己要饭?"}}</h2>
<p>{{T "用 X 账号发一条推就能开自己的要饭站:独立地址、自己的碗、功德簿和施主榜,钱直接进你的币安账户。"}}</p>
<a class="btn sec" href="/new">{{T "用 X 开通我的要饭站 →"}}</a>
</section>
</div>{{end}}
</main>
</div>
{{if .Ready}}<div class="fab" id="fab"><a class="btn" href="#donate" id="fabBtn">💸 投币施舍</a></div>{{end}}
{{if .Ready}}<div class="fab" id="fab"><a class="btn" href="#donate" id="fabBtn">{{T "💸 投币施舍"}}</a></div>{{end}}
<div id="toast" class="toast" hidden></div>
<div class="modal" id="modal" hidden role="dialog" aria-modal="true"><div class="modal-box"><button class="modal-x" type="button" id="modalX" aria-label="关闭">✕</button><div id="modalForm" hidden></div><div id="modalBody" hidden></div></div></div>
<div class="modal" id="modal" hidden role="dialog" aria-modal="true"><div class="modal-box"><button class="modal-x" type="button" id="modalX" aria-label="{{T "关闭"}}">✕</button><div id="modalForm" hidden></div><div id="modalBody" hidden></div></div></div>
{{end}}
{{define "avatar"}}{{$f := xav .XHandle}}{{if and $f (not .Blocked)}}<img class="av img" src="/a/{{$f}}" alt="">{{else}}<div class="av" style="--h:{{hue .NickKey}}">{{if .Blocked}}✕{{else}}{{initial .Nickname}}{{end}}</div>{{end}}{{end}}
{{define "donorlist"}}{{if .Rows}}<ul class="list">
{{range $i, $r := .Rows}}<li class="item">
<div class="rank{{if lt $i 3}} m{{end}}">{{rankBadge $i}}</div>
{{$h := handleOf $r.NickKey}}{{$f := xav $h}}{{if $f}}<img class="av img" src="/a/{{$f}}" alt="">{{else}}<div class="av" style="--h:{{hue $r.NickKey}}">{{initial $r.Nickname}}</div>{{end}}
<div class="body"><div class="name"><span>{{$r.Nickname}}</span>{{if $h}}<span class="xh" title="施主自己填的 X,未经验证">@{{$h}}</span>{{end}}{{with index $.Badges $r.NickKey}}<span class="badge">{{.}}</span>{{end}}</div><div class="sub">{{donorTier $r.TotalE8}} · {{$r.Count}} 次</div></div>
<div class="body"><div class="name"><span>{{$r.Nickname}}</span>{{if $h}}<span class="xh" title="{{T "施主自己填的 X,未经验证"}}">@{{$h}}</span>{{end}}{{with index $.Badges $r.NickKey}}<span class="badge">{{.}}</span>{{end}}</div><div class="sub">{{donorTier $r.TotalE8}} · {{$r.Count}} {{T "次"}}</div></div>
<div class="amtv num accent">{{fmtAmt $r.TotalE8}}</div>
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">👑</div>榜上无人,第一个投币的就是首席施主</div>{{end}}{{end}}
</ul>{{else}}<div class="empty"><div class="ico">👑</div>{{T "榜上无人,第一个投币的就是首席施主"}}</div>{{end}}{{end}}
{{define "sitelist"}}{{if .Rows}}<ul class="list">
{{range $i, $s := .Rows}}<li class="item">
<div class="rank{{if lt $i 3}} m{{end}}">{{rankBadge $i}}</div>
{{if $s.AvatarURL}}<img class="av img" src="{{$s.AvatarURL}}" alt="">{{else}}<div class="av sq">{{$s.Avatar}}</div>{{end}}
<div class="body"><div class="name"><span><a href="{{$s.Path}}">{{$s.Name}}</a></span>{{if eq $s.ID $.Me}}<span class="me">就是我</span>{{else if eq $s.ID $.Here}}<span class="me here">本站</span>{{end}}</div><div class="sub">{{if $s.Title}}{{$s.Title}} · {{end}}{{(level $s.Exp).Title}} · {{$s.Donors}} 位施主 · 钢镚 {{$s.Coins}}</div></div>
<div class="body"><div class="name"><span><a href="{{$s.Path}}">{{$s.Name}}</a></span>{{if eq $s.ID $.Me}}<span class="me">{{T "就是我"}}</span>{{else if eq $s.ID $.Here}}<span class="me here">{{T "本站"}}</span>{{end}}</div><div class="sub">{{if $s.Title}}{{T $s.Title}} · {{end}}{{(level $s.Exp).Title}} · {{$s.Donors}} {{T "位施主 · 钢镚"}} {{$s.Coins}}</div></div>
<div class="amtv num{{if ne $.By "coins"}} accent{{end}}">{{if eq $.By "coins"}}🪙 {{$s.Coins}}{{else}}{{fmtAmt $s.TotalE8}}{{end}}</div>
</li>{{end}}
</ul>{{else}}<div class="empty"><div class="ico">🏚</div>还没有人上榜</div>{{end}}{{end}}
</ul>{{else}}<div class="empty"><div class="ico">🏚</div>{{T "还没有人上榜"}}</div>{{end}}{{end}}
{{define "scripts"}}<script>
(function(){
var tabs=document.querySelectorAll('.tab'),panels=document.querySelectorAll('.panel');
@@ -150,16 +150,16 @@
if(j.ok&&j.added){document.querySelectorAll('.coinN').forEach(function(el){el.textContent=j.total});document.getElementById('coinT').textContent=j.today;
var c=document.createElement('div');c.className='flycoin';c.textContent='🪙';var r=cb.getBoundingClientRect();c.style.left=(r.left+r.width/2)+'px';c.style.top=r.top+'px';document.body.appendChild(c);setTimeout(function(){c.remove()},900);
var sw=document.querySelector('.char-top .sprite-wrap');if(sw){sw.classList.add('jump');setTimeout(function(){sw.classList.remove('jump')},900)}
if(window.sfx)sfx.coin();say('叮!钢镚 +1');if(j.mine>=j.per_day){document.getElementById('coinTxt').textContent='今天丢过了'}else{cb.disabled=false}}
else{if(window.sfx)sfx.fail();say(j.msg||'没丢进去');if(j.mine>=j.per_day){document.getElementById('coinTxt').textContent='今天丢过了'}else{cb.disabled=false}}
}).catch(function(){if(window.sfx)sfx.fail();say('网络开小差了');cb.disabled=false})})}
if(window.sfx)sfx.coin();say({{T "叮!钢镚 +1"}});if(j.mine>=j.per_day){document.getElementById('coinTxt').textContent={{T "今天丢过了"}}}else{cb.disabled=false}}
else{if(window.sfx)sfx.fail();say(j.msg||{{T "没丢进去"}});if(j.mine>=j.per_day){document.getElementById('coinTxt').textContent={{T "今天丢过了"}}}else{cb.disabled=false}}
}).catch(function(){if(window.sfx)sfx.fail();say({{T "网络开小差了"}});cb.disabled=false})})}
var f=document.getElementById('f');if(!f)return;
var btns=f.querySelectorAll('.amt-btn'),amt=document.getElementById('amount'),cta=document.getElementById('cta'),msg=document.getElementById('msg'),cnt=document.getElementById('cnt');
var cur={{.Site.Currency}};
function sel(b){btns.forEach(function(x){x.classList.remove('on')});if(b)b.classList.add('on')}
function custom(){return f.querySelector('.amt-btn[data-v=""]')}
function label(){cta.textContent=amt.value?'投币 '+amt.value+' '+cur+' 💸':'投币 💸'}
function label(){cta.textContent=amt.value?{{T "投币"}}+' '+amt.value+' '+cur+' 💸':{{T "投币 💸"}}}
function sync(){var hit=null;btns.forEach(function(b){if(b.dataset.v&&b.dataset.v===amt.value)hit=b});sel(hit||(amt.value?custom():null));amt.style.display=(hit&&hit.dataset.v)?'none':'';label()}
btns.forEach(function(b){b.addEventListener('click',function(){if(b.dataset.v){amt.value=b.dataset.v;sync()}else{amt.value='';sel(b);amt.style.display='';amt.focus();label()}})});
amt.addEventListener('input',function(){var hit=null;btns.forEach(function(b){if(b.dataset.v&&b.dataset.v===amt.value)hit=b});sel(hit||custom());label()});
@@ -180,7 +180,7 @@
fetch('/donate',{method:'POST',body:fd}).then(function(r){return r.text().then(function(t){return {ok:r.ok,text:t}})}).then(function(res){cta.disabled=false;cta.textContent=old;
if(!res.ok){errEl.textContent=res.text;return}
mbody.innerHTML=res.text;mform.hidden=true;mbody.hidden=false;modal.hidden=false;modal.querySelector('.modal-box').scrollTop=0;var pp=mbody.querySelector('.paypanel');if(pp){stopPanel=window.initPayPanel(pp,function(){paidDone=true})}
}).catch(function(){cta.disabled=false;cta.textContent=old;errEl.textContent='网络开小差了,再试一次'})});
}).catch(function(){cta.disabled=false;cta.textContent=old;errEl.textContent={{T "网络开小差了,再试一次"}}})});
var fab=document.getElementById('fab'),top=document.getElementById('topcard');
if(fab&&top&&'IntersectionObserver' in window){new IntersectionObserver(function(es){fab.classList.toggle('show',!es[0].isIntersecting&&es[0].boundingClientRect.top<0)},{threshold:0}).observe(top)}
+19 -19
View File
@@ -1,50 +1,50 @@
{{define "title"}}{{if eq .D.Status "paid"}}功德 +{{fmtAmt .D.ActualE8}}{{else}}施舍进行中{{end}} · {{.SiteTitle}}{{end}}
{{define "title"}}{{if eq .D.Status "paid"}}{{T "功德 +"}}{{fmtAmt .D.ActualE8}}{{else}}{{T "施舍进行中"}}{{end}} · {{T .SiteTitle}}{{end}}
{{define "content"}}
<div class="narrow">
{{if eq .D.Status "paid"}}
<section class="card px center">
<div class="sprite-wrap jump" style="margin:0 auto 10px">{{template "sprite"}}</div>
<div class="insert">★ THANK YOU ★</div>
<h1>🙏 谢谢施主 {{.D.Nickname}}</h1>
<h1>{{T "🙏 谢谢施主"}} {{.D.Nickname}}</h1>
<div class="big num accent">+{{fmtAmt .D.ActualE8}}<small>{{.D.Currency}}</small></div>
{{if .D.MsgBlocked}}{{else if .D.Message}}<div class="bubble" style="margin:14px 0 0;text-align:left">{{.D.Message}}</div>{{end}}
{{if and (gt .Position 0) (not .D.Blocked)}}<div class="notice ok" style="margin-top:14px">你在 {{.Site.Name}} 的施主榜排第 <b>{{.Position}}</b> 位 · {{donorTier .DonorTotal}}</div>{{end}}
{{if and (gt .Position 0) (not .D.Blocked)}}<div class="notice ok" style="margin-top:14px">{{T "你在 %s 的施主榜排第 %d 位" .Site.Name .Position}} · {{T (donorTier .DonorTotal)}}</div>{{end}}
<div class="btns">
<a class="btn sec" href="{{.Site.Path}}#donors">回到 {{.Site.Name}} 的碗</a>
<button class="btn ghost copy" type="button" data-copy="{{.ShareURL}}">复制链接分享</button>
<a class="btn sec" href="{{.Site.Path}}#donors">{{T "回到 %s 的碗" .Site.Name}}</a>
<button class="btn ghost copy" type="button" data-copy="{{.ShareURL}}">{{T "复制链接分享"}}</button>
</div>
</section>
<section class="card px" style="margin-top:16px">
<h2>🖼 分享卡片</h2>
<p class="hint" style="margin:0 0 10px">生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。</p>
<button class="btn sec" type="button" id="shareBtn">生成分享卡</button>
<div class="sharebox" id="sharebox" hidden><img id="shareImg" alt="分享卡"><div class="hint">长按图片保存,或 <a id="shareDl" download="beggar-card.png">下载</a></div></div>
<h2>{{T "🖼 分享卡片"}}</h2>
<p class="hint" style="margin:0 0 10px">{{T "生成一张像素分享图,发到 X 或朋友圈,顺便帮乞丐吆喝。"}}</p>
<button class="btn sec" type="button" id="shareBtn">{{T "生成分享卡"}}</button>
<div class="sharebox" id="sharebox" hidden><img id="shareImg" alt="{{T "分享卡"}}"><div class="hint">{{T "长按图片保存,或"}} <a id="shareDl" download="beggar-card.png">{{T "下载"}}</a></div></div>
</section>
{{if .SubsitesEnabled}}
<section class="card px center" style="margin-top:16px">
<h2 style="justify-content:center">🏚 你也可以要饭</h2>
<p class="hint" style="font-size:14px">用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。</p>
<a class="btn" href="/new">用 X 开通我的要饭站 →</a>
<h2 style="justify-content:center">{{T "🏚 你也可以要饭"}}</h2>
<p class="hint" style="font-size:14px">{{T "用 X 账号发一条推就能开自己的要饭站,别人给你的钱直接进你的币安账户。"}}</p>
<a class="btn" href="/new">{{T "用 X 开通我的要饭站 →"}}</a>
</section>
{{end}}
{{else if or (eq .D.Status "claimed") (and (eq .D.Status "pending") (not .Stale))}}
<section class="card px">
{{template "paypanel" .Panel}}
<div class="hint center" style="margin-top:12px"><a href="{{.Site.Path}}">回到 {{.Site.Name}} 的碗</a></div>
<div class="hint center" style="margin-top:12px"><a href="{{.Site.Path}}">{{T "回到 %s 的碗" .Site.Name}}</a></div>
</section>
{{else}}
<section class="card px center">
<div class="sprite-wrap" style="margin:0 auto 10px">{{template "sprite"}}</div>
<h1>{{if eq .D.Status "rejected"}}站长没有确认这笔施舍{{else if eq .D.Status "failed"}}下单失败{{else}}这笔施舍已过期{{end}}</h1>
<p class="hint" style="font-size:14px">{{if eq .D.Status "rejected"}}如果你确实转了,请联系站长核对。{{else}}没付款不扣钱;想施舍请重新来一次。{{end}}</p>
<a class="btn" href="{{.Site.Path}}#donate">再来一次</a>
<h1>{{if eq .D.Status "rejected"}}{{T "站长没有确认这笔施舍"}}{{else if eq .D.Status "failed"}}{{T "下单失败"}}{{else}}{{T "这笔施舍已过期"}}{{end}}</h1>
<p class="hint" style="font-size:14px">{{if eq .D.Status "rejected"}}{{T "如果你确实转了,请联系站长核对。"}}{{else}}{{T "没付款不扣钱;想施舍请重新来一次。"}}{{end}}</p>
<a class="btn" href="{{.Site.Path}}#donate">{{T "再来一次"}}</a>
</section>
{{end}}
</div>
{{end}}
{{define "scripts"}}<script>
(function(){var b=document.getElementById('shareBtn');if(!b)return;b.addEventListener('click',function(){b.disabled=true;b.textContent='生成中…';
var data={site:{{.Site.Name}},nick:{{.D.Nickname}},amt:'+'+{{fmtAmt .D.ActualE8}}+' '+{{.D.Currency}},msg:{{if .D.MsgBlocked}}''{{else}}{{.D.Message}}{{end}},pos:{{.Position}},url:{{.ShareURL}},title:{{.SiteTitle}}};
var data={site:{{.Site.Name}},nick:{{.D.Nickname}},amt:'+'+{{fmtAmt .D.ActualE8}}+' '+{{.D.Currency}},msg:{{if .D.MsgBlocked}}''{{else}}{{.D.Message}}{{end}},pos:{{.Position}},url:{{.ShareURL}},title:{{T .SiteTitle}}};
var svg=document.querySelector('.sprite');var xml=new XMLSerializer().serializeToString(svg);var img=new Image();img.onload=function(){draw(img)};img.onerror=function(){draw(null)};img.src='data:image/svg+xml;charset=utf-8,'+encodeURIComponent(xml);
function px(c,x,y,w,h,fill){c.fillStyle=fill;c.fillRect(x,y,w,h)}
function frame(c,x,y,w,h){px(c,x,y,w,h,'#1e1e2e');px(c,x+4,y+4,w-8,h-8,'#fffbf0')}
@@ -62,9 +62,9 @@
if(data.pos>0){c.fillText(fit(c,'施主榜第 '+data.pos+' 位',360,18,'-apple-system, PingFang SC, sans-serif'),232,270)}
if(data.msg){px(c,64,352,W-128,150,'#1e1e2e');px(c,68,356,W-136,142,'#ffffff');c.font='22px -apple-system, PingFang SC, sans-serif';c.fillStyle='#1e1e2e';wrap(c,'「'+data.msg+'」',88,378,W-176,36)}
c.font='20px Pixel, sans-serif';c.fillStyle='#1e1e2e';c.fillText('★ THANK YOU ★',64,540);
c.font='18px -apple-system, PingFang SC, sans-serif';c.fillStyle='#4a4954';c.fillText('行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。',64,586);
c.font='18px -apple-system, PingFang SC, sans-serif';c.fillStyle='#4a4954';c.fillText({{T "行行好,赏口饭吃。用币安 Pay 投币施舍,留一句话上功德簿。"}},64,586);
px(c,64,640,W-128,60,'#1e1e2e');px(c,68,644,W-136,52,'#ffcc00');c.fillStyle='#1e1e2e';c.textBaseline='middle';c.fillText(fit(c,data.url.replace(/^https?:\/\//,''),W-176,22,'Pixel, sans-serif'),84,670);
c.textBaseline='top';c.font='16px Pixel, sans-serif';c.fillStyle='#4a4954';c.fillText('#赛博丐帮',64,740);
c.textBaseline='top';c.font='16px Pixel, sans-serif';c.fillStyle='#4a4954';c.fillText({{T "#赛博丐帮"}},64,740);
var u=cv.toDataURL('image/png');document.getElementById('shareImg').src=u;document.getElementById('shareDl').href=u;document.getElementById('sharebox').hidden=false;b.textContent='重新生成';b.disabled=false;
})}
})})();
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env python3
"""把模板里的中文包成 {{T "…"}},并打印 key 清单。
用法:python3 tools/i18n_wrap.py --dry templates/site.html (只列 key)
python3 tools/i18n_wrap.py templates/*.html (原地改写)
规则:只处理标签之间的文本节点和 placeholder/title/aria-label/alt/content 属性;
文本里夹着 {{…}} 动作时按动作切开,每段中文各自包一层。
"""
import re, sys
CJK = re.compile(r'[一-鿿]')
ACTION = re.compile(r'\{\{.*?\}\}', re.S)
ATTR = re.compile(r'\b(placeholder|title|aria-label|alt|content|data-tip)="([^"{}]*[一-鿿][^"{}]*)"')
keys = []
def esc(s):
return s.replace('\\', '\\\\').replace('"', '\\"')
def wrap_segment(seg):
"""seg 是不含 {{}} 与 <> 的纯文本;把其中的中文串(含中英混排的整句)包起来,保留首尾空白。"""
if not CJK.search(seg):
return seg
lead = len(seg) - len(seg.lstrip())
trail = len(seg) - len(seg.rstrip())
core = seg.strip()
if not core:
return seg
keys.append(core)
return seg[:lead] + '{{T "' + esc(core) + '"}}' + seg[len(seg) - trail:] if trail else seg[:lead] + '{{T "' + esc(core) + '"}}'
def wrap_text(text):
"""标签之间的文本,可能含 {{…}}。"""
if not CJK.search(text):
return text
out, pos = [], 0
for m in ACTION.finditer(text):
out.append(wrap_segment(text[pos:m.start()]))
out.append(m.group(0))
pos = m.end()
out.append(wrap_segment(text[pos:]))
return ''.join(out)
def process(src):
# 跳过 <script>…</script> 与 <style>…</style>(里面的中文单独手工处理)
parts = re.split(r'(<script\b.*?</script>|<style\b.*?</style>)', 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()