package main

import (
	tb "gopkg.in/telebot.v3"
)

var LocaleAlias = map[string]string{
	"zh-hans": "zh",
	"zh-hant": "zh",
}

var LocaleMap = map[string]map[string]string{
	"zh": {
		"system.unexpected":      "â�Œ æ— æ³•å®Œæˆ�ä»»åŠ¡ï¼Œè¯·æ£€æŸ¥æœ�åŠ¡å™¨é”™è¯¯æ—¥å¿—",
		"system.notsend":         "â�Œ å�‘é€�æ¶ˆæ�¯å¤±è´¥",
		"system.wrongUsage":      "â�Œ ä½¿ç”¨æ–¹æ³•ä¸�å¯¹å•¦ï¼�è¦�è¿™ä¹ˆç”¨å‘¢: `%s`",
		"system.unexpectedError": "â�Œ å�‘ç”Ÿäº†æ„�å¤–: %s",

		"cmd.getToken":       "*ğŸ”� ç”Ÿæˆ�æˆ�åŠŸ*\n\nç¾¤ç»„å��ç§°: `%s`\nç¾¤ç»„ ID: `%d`\nAPI ä»¤ç‰Œ: `%s`\nå›�è°ƒç­¾å��: `%s`",
		"cmd.zc.notAllowed":  "å½“å‰�ç¾¤ç»„ä¸�å…�è®¸äº’ç›¸è‡­å˜´å“¦ ~",
		"cmd.zc.indeed":      "ç¡®å®�",
		"cmd.zc.cantBan":     "æˆ‘æ‹¿å®ƒæ²¡åŠ�æ³•å‘¢ ...",
		"cmd.zc.cooldown10":  "ğŸ˜  ä½ è‡ªå·±å…ˆæ¼±æ¼±å�£å‘¢ï¼Œä¸�è¦�è¿�ç»­è‡­åˆ«äººå“¦ï¼�æ‰£ 10 åˆ†è­¦å‘Šä¸€ä¸‹",
		"cmd.zc.cooldown":    "ğŸ˜³ ç”¨æŒ‡ä»¤å¯¹çº¿æ˜¯ä¸�å¯¹çš„ï¼Œè¯·å¤§å®¶éƒ½å†·é�™ä¸‹å‘¢ï½�",
		"cmd.zc.exec":        "ğŸ‘® %s, æ‚¨è¢«çƒ­å¿ƒçš„ %s è­¦å‘Šäº† âš ï¸�ï¼Œè¯·æ³¨æ„�ç®¡ç�†å¥½è‡ªå·±çš„è¡Œä¸ºï¼�æš‚æ—¶æ‰£é™¤ %d åˆ†ä½œä¸ºè­¦å‘Šï¼Œå¦‚æ�œæ‚¨çš„åˆ†æ•°ä½�äº� %d åˆ†å°†è¢«ç›´æ�¥ç¦�è¨€ã€‚è‹¥æ‚¨è§‰å¾—è¿™æ˜¯æ�¶æ„�ä¸¾æŠ¥ï¼Œè¯·ç�†æ€§å¯¹å¾…ï¼Œå¹¶è�”ç³»ç¾¤ç®¡ç�†å‘˜å¤„ç�†ã€‚",
		"cmd.zc.noAnonymous": "ğŸ˜  åŒ¿å��å°±ä¸�è¦�ä¹±å•µå•µå•¦ï¼�å�­äº†ä¸ªå�­å�­äº†ä¸ªå�­å�­äº†ä¸ªå�­ ...",

		"cmd.ey.selfReport":  "ğŸ‘® ä¸¾æŠ¥è‡ªå·±ï¼Ÿé‚£æ²¡åŠ�æ³•...å�ªå¥½æŠŠä½  ğŸ«’ å�Šå°�æ—¶å“¦ï½�",
		"cmd.ey.notSuccess":  "ğŸ˜­ å‘œå‘œå‘œï¼Œå°�ä¸�æ�‰ ï½�",
		"cmd.ey.unexpected":  "ğŸ˜  å�­äº†ä¸ªå�­å�­äº†ä¸ªå�­å�­äº†ä¸ªå�­ ï½�",
		"cmd.ey.killChannel": "ğŸ‘® å¥½çš„ï¼�è¿™å°±æŠŠè¿™ä¸ªé¢‘é�“å°�æ�‰å•¦ï½� PS: %s çš„ä¸»äººï¼Œå¦‚æ�œæ‚¨è§‰å¾—è¿™æ˜¯æ�¶æ„�ä¸¾æŠ¥ï¼Œè¯·èµ¶å¿«è�”ç³»ç®¡ç�†å‘˜è§£å°�å“¦ ï½�ï¼‰",
		"cmd.ey.killBot":     "ğŸ‘® å¥½çš„ï¼�è¿™å°±æŠŠè¿™ä¸ªæœºå™¨äººå°�ç¦�å�Šå°�æ—¶ï½� PS: %s çš„ä¸»äººï¼Œå¦‚æ�œæ‚¨è§‰å¾—è¿™æ˜¯æ�¶æ„�ä¸¾æŠ¥ï¼Œè¯·èµ¶å¿«è�”ç³»ç®¡ç�†å‘˜è§£å°�å“¦ ï½�ï¼‰",
		"cmd.ey.cooldown5":   "ğŸ˜  æ¶ˆå�œä¸€ä¸‹æ¶ˆå�œä¸€ä¸‹ï¼Œä¸¾æŠ¥å¤ªå¤šæ¬¡å•¦ï¼Œæ‰£ 5 åˆ†ç¼“ä¸€ç¼“",
		"cmd.ey.exec":        "ğŸ‘® %s, æ‚¨è¢«çƒ­å¿ƒç¾¤å�‹ %s æŠ¥å‘Šæœ‰å�‘é€�æ�¶æ„�è¨€è®ºçš„å«Œç–‘ âš ï¸�ï¼Œè¯·æ³¨æ„�è‡ªå·±çš„å�‘è¨€å“¦ï¼�æš‚æ—¶ç¦�è¨€å�Šå°�æ—¶å¹¶æ‰£é™¤ %d åˆ†ä½œä¸ºè­¦å‘Šï¼Œä¸¾æŠ¥è€… %d åˆ†å¥–åŠ±å·²åˆ°è´¦ã€‚è‹¥æ‚¨è§‰å¾—è¿™æ˜¯æ�¶æ„�ä¸¾æŠ¥ï¼Œå�¯ä»¥å‘¼å��å°�ä¼™ä¼´ä»¬å…¬æŠ•ä¸ºæ‚¨è§£å°�ï¼ˆç´¯è®¡æ»¡ %d ç¥¨å�¯ä»¥è§£å°�å¹¶æŠµæ¶ˆæ‰£åˆ†ï¼‰ï¼Œæˆ–è€…ç›´æ�¥è�”ç³»ç¾¤ç®¡ç�†å‘˜å¤„ç�†ã€‚",
		"cmd.ey.duplicated":  "ğŸ‘® ä»–å·²ç»�è¢«æ£€å¯Ÿå®˜å¸¦èµ°å•¦ï¼Œä¸�è¦�é�­å°¸å•¦ ï½�",

		"cmd.privateSession":          "ğŸ‘€ è¯·å›�å¤�è¿™åˆ™æ¶ˆæ�¯ä¸€ä¸ªæ–‡ä»¶æ�¥ä¸ºç¾¤ç»„ `%s`(%d) è®¾ç½® {%s} å“¦ï½�",
		"cmd.privateSession.sended":   "âœ”ï¸� å»ºç«‹ä¼šè¯�æˆ�åŠŸï¼Œè¯·æŸ¥çœ‹ç§�è�Šï½�",
		"cmd.privateChatFirst":        "â�Œ è¯·å…ˆç§�è�Šæˆ‘ç„¶å��å†�è¿�è¡Œè¿™ä¸ªå‘½ä»¤å“¦",
		"cmd.noPerm":                  "â�Œ æ‚¨æ²¡æœ‰ä½¿ç”¨è¿™ä¸ªå‘½ä»¤çš„æ�ƒé™�å‘¢",
		"cmd.mustReply":               "â�Œ è¯·åœ¨ç¾¤ç»„å†…å›�å¤�ä¸€ä¸ªæœ‰æ•ˆç”¨æˆ·ä½¿ç”¨è¿™ä¸ªå‘½ä»¤å“¦ ï½�",
		"cmd.noGroupPerm":             "â�Œ æ‚¨æ²¡æœ‰æ�ƒé™�ï¼Œäº¦æˆ–æ˜¯æ‚¨æœªå†�å¯¹åº”ç¾¤ç»„ä½¿ç”¨è¿™ä¸ªå‘½ä»¤",
		"cmd.noMiaoPerm":              "â�Œ æ‚¨æ²¡æœ‰å–µç»„æ�ƒé™�ï¼Œäº¦æˆ–æ˜¯æ‚¨æœªå†�å¯¹åº”ç¾¤ç»„ä½¿ç”¨è¿™ä¸ªå‘½ä»¤",
		"cmd.mustReplyChannelOrInput": "â�Œ è¯·å›�å¤�ä¸€åˆ™è½¬å�‘çš„é¢‘é�“æ¶ˆæ�¯æˆ–è€…æ‰‹åŠ¨åŠ ä¸Šé¢‘é�“ id ï½�",
		"cmd.mustInGroup":             "â�Œ è¯·åœ¨ç¾¤ç»„å�‘é€�è¿™æ�¡å‘½ä»¤å“¦ ï½�",
		"cmd.startSuGrant":            "âœ”ï¸� æ�ˆæ�ƒæˆ�åŠŸï¼Œæ‚¨ç�°åœ¨å�¯ä»¥æŠŠæˆ‘æ·»åŠ åˆ°ç›®æ ‡ç¾¤ç»„ä¸­ï¼Œå¹¶åœ¨ç¾¤ç»„ä¸­å�‘é€� /su_add_group å¼€å�¯ç®¡ç�†æ¨¡å¼� ï½�",
		"cmd.addToGroup":              "â�• æ·»åŠ åˆ°ç»„|https://t.me/%s?startgroup=",

		"cmd.misc.version":       "ğŸ‘€ å½“å‰�ç‰ˆæœ¬ä¸º: %s",
		"cmd.misc.replyid.chat":  "*ç¾¤ç»„ ID:* `%d`\n*å›�å¤�åŒ¿å��ç¾¤ ID:* `%d`\n*å›�å¤�åŒ¿å��ç¾¤ç±»å�‹:* `%s`",
		"cmd.misc.replyid.user":  "*ç¾¤ç»„ ID:* `%d`\n*å›�å¤�ç”¨æˆ· ID:* `%d`\n*å›�å¤�ç”¨æˆ·è¯­è¨€:* `%s`\n*å›�å¤�ç”¨æˆ·çŠ¶æ€�:* `%v`\n*å›�å¤�ç”¨æˆ·éªŒè¯�çŠ¶æ€�:* `%v`",
		"cmd.misc.id.chat":       "*ç¾¤ç»„ ID:* `%d`\n*åŒ¿å��ç¾¤ ID:* `%d`\n*åŒ¿å��ç¾¤ç±»å�‹:* `%s`",
		"cmd.misc.id.user":       "*ç¾¤ç»„ ID:* `%d`\n*ç”¨æˆ· ID:* `%d`\n*ç”¨æˆ·è¯­è¨€:* `%s`\n*ç”¨æˆ·çŠ¶æ€�:* `%v`\n*éªŒè¯�çŠ¶æ€�:* `%v`",
		"cmd.misc.ping.1":        "ğŸ”— ä¸� Telegram ä¼ºæœ�å™¨çš„å»¶è¿Ÿçº¦ä¸º:\n\næœºå™¨äºº DC: `%dms`",
		"cmd.misc.ping.2":        "ğŸ”— ä¸� Telegram ä¼ºæœ�å™¨çš„å»¶è¿Ÿçº¦ä¸º:\n\næœºå™¨äºº DC: `%dms`\nç¾¤ç»„ DC: `%dms`",
		"cmd.misc.user.notExist": "â�Œ ç”¨æˆ·è®°å½•ä¸�å­˜åœ¨",
		"cmd.misc.noChange":      "ğŸ‘€ å½“å‰�åˆ—è¡¨æ²¡æœ‰å�‘ç”Ÿå�˜åŒ–ï¼Œæ— éœ€åˆ·æ–° ï½�",
		"cmd.misc.outOfRange":    "ğŸ‘€ æ²¡æœ‰æ›´å¤šè®°å½•äº†å‘¢ ï½�",
		"cmd.misc.prevPage":      "â¬†ï¸� ä¸Šä¸€é¡µ",
		"cmd.misc.atPage":        "ç¬¬ %d é¡µ",
		"cmd.misc.nextPage":      "â¬‡ï¸� ä¸‹ä¸€é¡µ",
		"cmd.misc.get.success":   "âœ”ï¸� *è¯»å�–æˆ�åŠŸå•¦ ~*\n\n*é”®: *`%v`\n*å€¼: *`%v`",
		"cmd.misc.set.success":   "âœ”ï¸� *ä¿®æ”¹æˆ�åŠŸå•¦ ~*\n\n*å�Ÿå§‹å€¼: *`%v`\n*ä¿®æ”¹å��: *`%s`",

		"cmd.credit.logHead":  "ğŸ“– `%d` ç§¯åˆ†è®°å½•:\n\n%s",
		"cmd.credit.notFound": "â�Œ æœªèƒ½æ‰¾åˆ°è¿™é¡¹çºªå½•",
		"cmd.credit.details":  "ğŸ“– ç§¯åˆ†ç»†åˆ™:\n\n`ID:` `%v`\n`ç”¨æˆ·ID:` `%v`\n`ç§¯åˆ†:` `%v`\n`å�Ÿå› :` `%v`\n`ç»†åˆ™:` `%v`\n`æ“�ä½œè€…:` `%v`\n`è§¦å�‘æ—¶é—´:` `%v`",

		"grant.assign.success":  "âœ”ï¸� TA å·²ç»�æˆ�ä¸ºç®¡ç�†å‘˜å•¦ ï½�",
		"grant.assign.failure":  "â�Œ TA å·²ç»�æ˜¯ç®¡ç�†å‘˜å•¦ ï½�",
		"grant.dismiss.success": "âœ”ï¸� å·²å°† TA çš„ç®¡ç�†å‘˜ç§»é™¤ ï½�",
		"grant.dismiss.failure": "â�Œ TA æœ¬æ�¥å°±ä¸�æ˜¯ç®¡ç�†å‘˜å‘¢ ï½�",

		"policy.importSuccess":    "âœ”ï¸� å¯¼å…¥ç¾¤ç»„ç­–ç•¥æˆ�åŠŸ",
		"policy.exportSuccess":    "âœ”ï¸� å¯¼å‡ºç¾¤ç»„ç­–ç•¥æˆ�åŠŸï¼Œè¯·åœ¨ç§�è�ŠæŸ¥çœ‹ç»“æ�œ",
		"policy.importError":      "â�Œ æ— æ³•ä¸‹è½½ç¾¤ç»„ç­–ç•¥ï¼Œè¯·ç¡®å®šæ‚¨ä¸Šä¼ çš„æ–‡ä»¶æ ¼å¼�æ­£ç¡®ä¸”å°�äº� 10MB",
		"policy.importParseError": "â�Œ è§£æ��ç¾¤ç»„ç­–ç•¥é”™è¯¯ï¼Œè¯·ç¡®å®šæ‚¨ä¸Šä¼ çš„æ–‡ä»¶æ ¼å¼�æ­£ç¡®",

		"policy.rule.limit.peruser":         "â�Œ è¿™ä¸ªè§„åˆ™å·²ç»�è§¦å�‘è¿‡äº†ï¼Œä¸�èƒ½å†�è§¦å�‘äº†å“¦",
		"policy.rule.limit.peruserinterval": "â�Œ æ‚¨å·²ç»�åˆ°è¾¾æœ¬æ—¶æ®µçš„è§„åˆ™è§¦å�‘æ•°é‡�ä¸Šé™�ï¼Œè¯·ç¨�å��å†�è¯•",
		"policy.rule.limit.peruserday":      "â�Œ æ‚¨æœ¬æ—¥çš„è§„åˆ™è§¦å�‘æ•°é‡�ä¸Šé™�ï¼Œè¯·æ˜�æ—¥å†�è¯•",

		"forward.ban.success":   "âœ”ï¸� TA å·²ç»�è¢«æˆ‘å°�æ�‰å•¦ ï½�",
		"forward.ban.failure":   "â�Œ TA å·²ç»�è¢«å°�ç¦�è¿‡å•¦ ï½�",
		"forward.unban.success": "âœ”ï¸� TA å·²ç»�è¢«æˆ‘è§£å°�å•¦ ï½�",
		"forward.unban.failure": "â�Œ TA è¿˜æ²¡æœ‰è¢«å°�ç¦�å“¦ ï½�",

		"credit.set.invalid":      "â�Œ ä½¿ç”¨æ–¹æ³•é”™è¯¯ï¼š/setcredit <UserId:Optional> <Credit>",
		"credit.add.invalid":      "â�Œ ä½¿ç”¨æ–¹æ³•é”™è¯¯ï¼š/addcredit <UserId:Optional> <Credit>",
		"credit.set.success":      "âœ”ï¸� è®¾ç½®æˆ�åŠŸï¼ŒTA çš„ç§¯åˆ†ä¸º: %d",
		"credit.importSuccess":    "âœ”ï¸� å¯¼å…¥ %d æ�¡æˆ�åŠŸï¼Œæ‚¨å�¯ä»¥è¾“å…¥ /creditrank æŸ¥çœ‹å¯¼å…¥å��ç§¯åˆ†è¯¦æƒ…",
		"credit.exportSuccess":    "âœ”ï¸� å¯¼å‡ºæˆ�åŠŸï¼Œè¯·åœ¨ç§�è�ŠæŸ¥çœ‹ç»“æ�œ",
		"credit.importError":      "â�Œ æ— æ³•ä¸‹è½½ç§¯åˆ†å¤‡ä»½ï¼Œè¯·ç¡®å®šæ‚¨ä¸Šä¼ çš„æ–‡ä»¶æ ¼å¼�æ­£ç¡®ä¸”å°�äº� 20MBï¼Œå¤§æ–‡ä»¶è¯·è�”ç³»ç®¡ç�†å‘˜æ‰‹åŠ¨å¯¼å…¥",
		"credit.importParseError": "â�Œ è§£æ��ç§¯åˆ†å¤‡ä»½é”™è¯¯ï¼Œè¯·ç¡®å®šæ‚¨ä¸Šä¼ çš„æ–‡ä»¶æ ¼å¼�æ­£ç¡®",
		"credit.check.success":    "ğŸ‘€ `%s`, TA å½“å‰�çš„ç§¯åˆ†ä¸º: %d",
		"credit.check.my":         "ğŸ‘€ `%s`, æ‚¨å½“å‰�çš„ç§¯åˆ†ä¸º: %d",
		"credit.rank.info":        "#å¼€æ¦œ å½“å‰�çš„ç§¯åˆ†å¢™ä¸º: \n\n",
		"credit.lottery.info":     "ğŸ�‰ æ�­å–œä»¥ä¸‹ç”¨æˆ·ä¸­å¥–ï¼š\n\n",

		"transfer.invalidParam": "â�Œ é”™è¯¯çš„ç”¨æ³•ï¼Œè¯·å›�å¤�ä¸€ä¸ªç”¨æˆ· /transfer <ç§¯åˆ†é¢�åº¦> æ�¥å®Œæˆ�ç§¯åˆ†è½¬ç§»",
		"transfer.success":      "âœ”ï¸� æ‚¨å·²æˆ�åŠŸå�‘ TA è½¬ç§»äº† %d ç§¯åˆ†",
		"transfer.noBalance":    "â�Œ æ‚¨æ²¡æœ‰è¶³å¤Ÿçš„ä½™é¢�å“¦",

		"spoiler.invalid": "â�Œ ä½¿ç”¨æ–¹æ³•é”™è¯¯ï¼š/set_antispoiler <on|off>",
		"spoiler.success": "âœ”ï¸� å·²ç»�è®¾ç½®å¥½å��Â·å��å‰§é€�æ¶ˆæ�¯å•¦ `(Status=%v)` ï½�",

		"su.group.addSuccess":   "âœ”ï¸� å·²å°†è¯¥ç»„åŠ å…¥ç§¯åˆ†ç»Ÿè®¡ ï½�",
		"su.group.addDuplicate": "â�Œ è¯¥ç»„å·²ç»�å¼€å�¯ç§¯åˆ†ç»Ÿè®¡å•¦ ï½�",
		"su.group.delSuccess":   "âœ”ï¸� å·²å°†è¯¥ç»„ç§»é™¤ç§¯åˆ†ç»Ÿè®¡ ï½�",
		"su.group.delDuplicate": "â�Œ è¯¥ç»„å°šæœªå¼€å�¯ç§¯åˆ†ç»Ÿè®¡å“¦ ï½�",

		// not support yet
		"rp.complete":     "ğŸ§§ *ç§¯åˆ†çº¢åŒ…*\n\nå°�ä¼™ä¼´ä»¬æ‰‹é€Ÿéƒ½å¤ªå¿«å•¦ï¼Œ`%s`çš„å¤§çº¢åŒ…å·²è¢«ç“œåˆ†å¹²å‡€ï¼Œæ²¡æŠ¢åˆ°çš„å°�ä¼™ä¼´ä»¬è¯·æœŸå¾…ä¸‹æ¬¡çš„æ´»åŠ¨å“¦ï½�",
		"rp.guessLeft":    "çŒœçŒœçœ‹è¿˜å‰©å¤šå°‘ï¼Ÿ",
		"rp.text":         "ğŸ§§ *ç§¯åˆ†çº¢åŒ…*\n\n``%så�‘çº¢åŒ…å•¦ï¼�å¤§å®¶å¿«æŠ¢å“¦ï½�\n\nå‰©ä½™ç§¯åˆ†: `%s`\nå‰©ä½™æ•°é‡�: `%d`",
		"rp.text.captcha": "\n\n*è¯·é€‰æ‹©ä¸�ä¸Šå›¾ç›¸ç¬¦çš„éªŒè¯�ç �æ�¥æŠ¢çº¢åŒ…å“¦ï½�*",
		"rp.lucky":        "\n\næ�­å–œæ‰‹æ°”ç�‹ `%s` è�·å¾—äº† `%d` åˆ† ğŸ�‰ ~",

		"rp.admin":              "ç®¡ç�†å‘˜-",
		"rp.set.invalid":        "â�Œ ä½¿ç”¨æ–¹æ³•ä¸�æ­£ç¡®å‘¢ï¼Œè¯·è¾“å…¥ /redpacket `<æ€»åˆ†æ•°>` `<çº¢åŒ…ä¸ªæ•°>` æ�¥å�‘çº¢åŒ…å“¦ï½�\n\nå¤‡æ³¨ï¼šçº¢åŒ…æ€»åˆ†éœ€åœ¨ 1 ~ 100,000 ä¹‹é—´ï¼Œçº¢åŒ…ä¸ªæ•°éœ€åœ¨ 1 ~ 100 ä¹‹é—´ï¼Œä¸”çº¢åŒ…å¤§å°�ä¸�èƒ½ä½�äº�å�‚ä¸�äººæ•°å“¦ï½�",
		"rp.set.noEnoughCredit": "â�Œ æ‚¨çš„ç§¯åˆ†ä¸�å¤Ÿå�‘è¿™ä¸ªçº¢åŒ…å“¦ï¼Œè¯·åœ¨åŠªåŠ›èµšç§¯åˆ†å�§ï½�",

		"gp.ban.success":   "ğŸ�‰ æ�­å–œ `%s` è�·å¾—ç¦�è¨€å¤§ç¤¼åŒ…ï¼Œå�¯å–œå�¯è´ºå�¯å–œå�¯è´ºï¼�",
		"gp.ban.failure":   "â�Œ æ‚¨æ²¡æœ‰åŠ�æ³•ç¦�è¨€ TA å‘¢",
		"gp.unban.success": "ğŸ�‰ æ�­å–œ `%s` é‡�æ–°è�·å¾—äº†è‡ªç”± ï½�",
		"gp.unban.failure": "â�Œ æ‚¨æ²¡æœ‰åŠ�æ³•è§£ç¦� TA å‘¢",
		"gp.kick.success":  "ğŸ�‰ æ�­å–œ `%s` è¢«è¸¢å‡ºå�»å•¦ï¼�",
		"gp.kick.failure":  "â�Œ æ‚¨æ²¡æœ‰è¸¢æ�‰ TA å‘¢",

		"channel.set.cancel":           "âœ”ï¸� å·²ç»�å�–æ¶ˆåŠ ç¾¤é¢‘é�“éªŒè¯�å•¦ ï½�",
		"channel.set.success":          "âœ”ï¸� å·²ç»�è®¾ç½®å¥½åŠ ç¾¤é¢‘é�“éªŒè¯�å•¦ `(Join=%v, Msg=%v)` ï½�",
		"channel.bot.permit":           "ğŸ‘� æ¬¢è¿� %s åŠ å…¥ç¾¤ç»„ï¼Œå·²ä¸ºæœºå™¨äººè‡ªåŠ¨æ”¾è¡Œ ï½�",
		"channel.user.alreadyFollowed": "ğŸ‘� æ¬¢è¿� %s åŠ å…¥ç¾¤ç»„ï¼Œæ‚¨å·²å…³æ³¨é¢‘é�“è‡ªåŠ¨æ”¾è¡Œ ï½�",
		"channel.request":              "[ğŸ�‰](tg://user?id=%d) æ¬¢è¿� `%s`ï¼Œæ‚¨è¿˜æ²¡æœ‰å…³æ³¨æœ¬ç¾¤ç»„å…³è�”çš„é¢‘é�“å“¦ï¼Œæ‚¨æœ‰ %d ç§’æ—¶é—´éªŒè¯�è‡ªå·± ï½� è¯·ç‚¹å‡»ä¸‹é�¢æŒ‰é’®è·³è½¬åˆ°é¢‘é�“å…³æ³¨å��å†�å›�æ�¥éªŒè¯�ä»¥è§£é™¤å�‘è¨€é™�åˆ¶ ï½�",
		"channel.cannotSendMsg":        "â�Œ æ— æ³•å�‘é€�éªŒè¯�æ¶ˆæ�¯ï¼Œè¯·ç®¡ç�†å‘˜æ£€æŸ¥ç¾¤ç»„æ�ƒé™� ï½�",
		"channel.cannotBanUser":        "â�Œ æ— æ³•å®Œæˆ�éªŒè¯�æµ�ç¨‹ï¼Œè¯·ç®¡ç�†å‘˜æ£€æŸ¥æœºå™¨äººå°�ç¦�æ�ƒé™� ï½�",
		"channel.cannotCheckChannel":   "â�Œ æ— æ³•æ£€æµ‹ç”¨æˆ·æ˜¯å�¦åœ¨ç›®æ ‡é¢‘é�“å†…ï¼Œè¯·ç®¡ç�†å‘˜æ£€æŸ¥æœºå™¨äººæ�ƒé™� ï½�",
		"channel.pattern.kicked":       "\u200d [TA](tg://user?id=%d) çš„å��å­—å‘½ä¸­äº†å¹¿å‘Šè§„åˆ™ï¼Œå·²è‡ªåŠ¨æ”¾é€� 15 ç§’ã€‚å¦‚æ�œæœ‰è¯¯æ�€è¯·è�”ç³»ç®¡ç�†å‘˜å¤„ç�† ï½�",
		"channel.kicked":               "ğŸ‘€ [TA](tg://user?id=%d) æ²¡æœ‰åœ¨è§„å®šæ—¶é—´å†…å®Œæˆ�éªŒè¯�ï¼Œå·²ç»�è¢«æˆ‘å¸¦èµ°å•¦ ï½�",
		"channel.kicked.underAttack":   "âš ï¸� [TA](tg://user?id=%d) ç”±äº�åœ¨é£�æ�§æ¨¡å¼�ä¸‹ç”³è¯·åŠ å…¥ç¾¤ç»„ï¼Œå·²è¢«è‡ªåŠ¨éš”ç¦» ï½�",

		"locale.set": "âœ”ï¸� è®¾ç½®æˆ�åŠŸï¼Œå½“å‰�ç¾¤ç»„çš„é»˜è®¤è¯­è¨€ä¸º: %s ï½�",
		"locale.get": "ğŸ‘€ å½“å‰�ç¾¤ç»„çš„é»˜è®¤è¯­è¨€ä¸º: %s ï½�",

		// not support yet
		"btn.rp.draw":         "ğŸ¤� æˆ‘è¦�æŠ¢çº¢åŒ…|rp?r=%d",
		"btn.rp.draw.captcha": "%s|rp?c=%s&r=%d",
		"btn.notFair":         "ğŸ˜  è¿™ä¸�å…¬å¹³ (%d)|vote?u=%d&s=%d",

		"btn.adminPanel":    "ğŸš© è§£å°�[ç®¡ç�†]|unban?u=%d&s=%d||ğŸš® æ¸…é€€[ç®¡ç�†]|kick?u=%d&s=%d",
		"btn.channel.step1": "ğŸ‘‰ ç¬¬ä¸€æ­¥ï¼šå…³æ³¨é¢‘é�“ ğŸ‘ˆ|%s",
		"btn.channel.step2": "ğŸ‘‰ ç¬¬äºŒæ­¥ï¼šç‚¹æˆ‘éªŒè¯� ğŸ‘ˆ|check?u=%d",

		"cb.unblock.byadmin": "\n\nTA å·²è¢«ç®¡ç�†å‘˜è§£å°� ğŸ‘Š",
		"cb.kicked.byadmin":  "\n\nTA å·²è¢«ç®¡ç�†å‘˜è¸¢å‡ºç¾¤è�Š ğŸ¦¶",
		"cb.unblock.byvote":  "\n\näº�å¤šå��ç”¨æˆ·æŠ•ç¥¨å��å†³å®šï¼Œè¯¥ç”¨æˆ·ä¸�æ˜¯æ�¶æ„�å¹¿å‘Šï¼Œç”¨æˆ·å·²è§£å°�ï¼Œç§¯åˆ†å·²å�Ÿè·¯è¿”å›�ã€‚",

		"cb.unban.success":                "âœ”ï¸� å·²è§£é™¤å°�ç¦�ï¼Œè¯·æ‚¨æ‰‹åŠ¨å¤„ç�†å��ç»­äº‹å®œ ~",
		"cb.unban.failure":                "â�Œ è§£å°�å¤±è´¥ï¼ŒTA å�¯èƒ½å·²ç»�è¢«è§£å°�æˆ–è€…å·²ç»�é€€ç¾¤å•¦ ~",
		"cb.kick.success":                 "âœ”ï¸� å·²å°† TA é€�å‡ºç¾¤ç•™å­¦å�»å•¦ ~",
		"cb.kick.failure":                 "â�Œ è¸¢å‡ºå¤±è´¥ï¼Œå�¯èƒ½ TA å·²ç»�é€€ç¾¤å•¦ ~",
		"cb.validate.success":             "âœ”ï¸� éªŒè¯�æˆ�åŠŸï¼Œæ¬¢è¿�æ‚¨çš„åŠ å…¥ ~",
		"cb.validate.success.cannotUnban": "â�Œ éªŒè¯�æˆ�åŠŸï¼Œä½†æ˜¯è§£ç¦�å¤±è´¥ï¼Œè¯·è�”ç³»ç®¡ç�†å‘˜å¤„ç�† ~",
		"cb.validate.failure":             "â�Œ éªŒè¯�å¤±è´¥ï¼Œè¯·ç¡®è®¤è‡ªå·±å·²ç»�åŠ å…¥å¯¹åº”ç¾¤ç»„ ~",
		"cb.validate.others":              "ğŸ˜  äººå®¶çš„éªŒè¯�ä¸�è¦�ä¹±ç‚¹å“¦ï¼�ï¼�ï¼�",
		"cb.vote.success":                 "âœ”ï¸� æŠ•ç¥¨æˆ�åŠŸï¼Œæ„Ÿè°¢æ‚¨çš„å�‚ä¸� ~",
		"cb.vote.failure":                 "â�Œ æ‚¨å·²ç»�å�‚ä¸�è¿‡æŠ•ç¥¨äº†ï¼Œè¯·ä¸�è¦�å¤šæ¬¡æŠ•ç¥¨å“¦ ~",
		"cb.vote.notExists":               "â�Œ æŠ•ç¥¨æ—¶é—´å·²è¿‡ï¼Œè¯·è�”ç³»ç®¡ç�†å‘˜å¤„ç�† ~",
		"cb.rp.nothing":                   "ğŸ�¢ æ‚¨çš„è¿�æ°”ä¹Ÿå¤ªå·®å•¦ï¼�ä»€ä¹ˆéƒ½æ²¡æœ‰æŠ½åˆ°å“¦...",
		"cb.rp.get.1":                     "ğŸ�‰ æ�­å–œè�·å¾— ",
		"cb.rp.get.2":                     " ç§¯åˆ†ï¼Œç§¯åˆ†å·²ç»�å®�æ—¶åˆ°è´¦ï½�",
		"cb.rp.captchaInvalid":            "â�Œ éªŒè¯�ç �éªŒè¯�å¤±è´¥ï¼Œæ‚¨æ— æ³•é¢†å�–çº¢åŒ…å’¯ï½�",
		"cb.rp.duplicated":                "â�Œ æ‚¨å·²ç»�å�‚ä¸�è¿‡è¿™æ¬¡æ´»åŠ¨äº†ï¼Œä¸�èƒ½å¤ªè´ªå¿ƒå“¦ï¼�",
		"cb.rp.notExists":                 "â�Œ æŠ½å¥–æ´»åŠ¨å·²ç»�ç»“æ�Ÿå•¦ï¼�è¯·æœŸå¾…ä¸‹ä¸€æ¬¡æ´»åŠ¨ï½�",
		"cb.lottery.start":                "ğŸ�‰ æ´»åŠ¨å·²ç¡®è®¤ï¼Œè¯·å�·å�¬ç¾¤å�‹è¸Šè·ƒå�‚ä¸�å“¦ï¼�",
		"cb.lottery.enroll":               "ğŸ�‰ å�‚ä¸�æˆ�åŠŸ ~ è¯·è€�å¿ƒç­‰å¾…å¼€å¥–å‘€ ~",
		"cb.lottery.noEnoughCredit":       "â�Œ ä½ çš„ç§¯åˆ†ä¸�æ»¡è¶³æ´»åŠ¨è¦�æ±‚å“¦ï¼�",
		"cb.lottery.checkFailed":          "â�Œ è¯·åŠ ç¾¤å��å†�å�‚ä¸�æ´»åŠ¨å“¦ï¼�",
		"cb.notMiaoAdmin":                 "â�Œ è¯·ä¸�è¦�ä¹±ç�©å–µç»„ç®¡ç�†å‘˜æŒ‡ä»¤ï¼�",
		"cb.notAdmin":                     "â�Œ è¯·ä¸�è¦�ä¹±ç�©ç®¡ç�†å‘˜æŒ‡ä»¤ï¼�",
		"cb.noEvent":                      "â�Œ æœªæ‰¾åˆ°è¿™ä¸ªæ´»åŠ¨ï¼Œè¯·è�”ç³»ç®¡ç�†å‘˜è§£å†³ï¼�",
		"cb.notParsed":                    "â�Œ æŒ‡ä»¤è§£æ��å‡ºé”™ï¼Œè¯·è�”ç³»ç®¡ç�†å‘˜è§£å†³ ~",
		"cb.validationError":              "â�Œ æŒ‡ä»¤éªŒè¯�å¤±è´¥ï¼Œè¯·ä¸�è¦�ä¹±ç�©å›�è°ƒæŒ‡ä»¤ ~",
		"cb.disabled":                     "â�Œ è¿™ä¸ªç¾¤ç»„è¿˜æ²¡æœ‰è¢«æ�ˆæ�ƒå“¦ ~",
	},
	"en": {
		"system.unexpected":      "â�Œ Cannot fulfill the task, please check logs",
		"system.notsend":         "â�Œ Cannot send the message",
		"system.wrongUsage":      "â�Œ Wrong usage: `%s`",
		"system.unexpectedError": "â�Œ Unexpected error: %s",

		"cmd.getToken":       "*ğŸ”� Generate Success*\n\nGroup Name: `%s`\nGroup ID: `%d`\nAPI Token: `%s`\nCallback Sign: `%s`",
		"cmd.zc.notAllowed":  "Warn is not permitted in this group",
		"cmd.zc.indeed":      "INDEED",
		"cmd.zc.cantBan":     "Well, I have nothing to do with it ...",
		"cmd.zc.cooldown10":  "ğŸ˜  DO NOT TALK LIKE SHIT, YOU WILL BE PUNISHED BY 10 POINTS",
		"cmd.zc.cooldown":    "ğŸ˜³ Calm down, calm down ...",
		"cmd.zc.exec":        "ğŸ‘® %s, you are warned by %s âš ï¸�, please do not be too aggressive! You are punished by %d credit points. If your credit is below %d, you would be restricted in this group. Please contact group admin if you think the judgement is a mistake.",
		"cmd.zc.noAnonymous": "ğŸ˜  PLEASE WELL BEHAVE WHEN YOU ARE ANONYMOUS ...",

		"cmd.ey.selfReport":  "ğŸ‘® Yeah, you know what you are doing. You are restricted for half an hour.",
		"cmd.ey.notSuccess":  "ğŸ˜­ Wwww, I cannot do that.",
		"cmd.ey.unexpected":  "ğŸ˜  Ba Le Ge Ba, Ba Le Ge Ba Ba Ba Ba ï½�",
		"cmd.ey.killChannel": "ğŸ‘® This channel has been banned, PS: if the owner of %s finds it a mistake, please contact the group admin asap.",
		"cmd.ey.killBot":     "ğŸ‘® This bot has been restricted for half an hour, PS: if the owner of %s finds it a mistake, please contact the group admin asap.",
		"cmd.ey.cooldown5":   "ğŸ˜  DO NOT TALK LIKE SHIT, YOU WILL BE PUNISHED BY 5 POINTS",
		"cmd.ey.exec":        "ğŸ‘® %s, you are reported by %s to shot spam into the group âš ï¸�, please well behave! You are punished by %d credit points and the reporter has gained %d points. Please contact group admin if you think the judgement is a mistake, or you could ask other %d members to vote to help to undo this punishment.",
		"cmd.ey.duplicated":  "ğŸ‘® The user has already been banned.",

		"cmd.privateSession":          "ğŸ‘€ Please reply a config file to this message to assign `%s`(%d) a new {%s} config ~",
		"cmd.privateSession.sended":   "âœ”ï¸� Establishing a session successfully, please refer to the private chat ï½�",
		"cmd.privateChatFirst":        "â�Œ Please start me in the private chat before using this command.",
		"cmd.noPerm":                  "â�Œ You are not permitted to use this command.",
		"cmd.mustReply":               "â�Œ Please reply this command to a valid user is a valid group.",
		"cmd.noGroupPerm":             "â�Œ You are not authorized to use this command, or the group is not set up yet by admin.",
		"cmd.noMiaoPerm":              "â�Œ You are not authorized to use this miao-perm command, or the group is not set up yet by admin.",
		"cmd.mustReplyChannelOrInput": "â�Œ Please reply this command to a forwarded channel message, or pass in the channel id as a parameter.",
		"cmd.mustInGroup":             "â�Œ Please send this command in a group chat.",
		"cmd.startSuGrant":            "âœ”ï¸� User authorized. Now I am able to guard your group. Please add me into your group and send /su_add_group in that group to start.",
		"cmd.addToGroup":              "â�• Add Me to Group|https://t.me/%s?startgroup=",

		"cmd.misc.version":       "ğŸ‘€ Current Version: %s",
		"cmd.misc.replyid.chat":  "*Chat ID:* `%d`\n*Reply SenderChat ID:* `%d`\n*Reply SenderChat Type:* `%s`",
		"cmd.misc.replyid.user":  "*Chat ID:* `%d`\n*Reply User ID:* `%d`\n*Reply User Locale:* `%s`",
		"cmd.misc.id.chat":       "*Chat ID:* `%d`\n*SenderChat ID:* `%d`\n*SenderChat Type:* `%s`",
		"cmd.misc.id.user":       "*Chat ID:* `%d`\n*User ID:* `%d`\n*User Locale:* `%s`",
		"cmd.misc.ping.1":        "ğŸ”— Telegram Server Transmission Delay:\n\nBot DC: `%dms`",
		"cmd.misc.ping.2":        "ğŸ”— Telegram Server Transmission Delay:\n\nBot DC: `%dms`\nGroup DC: `%dms`",
		"cmd.misc.user.notExist": "â�Œ The credit info of the user does not exist",
		"cmd.misc.noChange":      "ğŸ‘€ The list is not modified.",
		"cmd.misc.outOfRange":    "ğŸ‘€ The list is out of range.",
		"cmd.misc.prevPage":      "â¬†ï¸� Last",
		"cmd.misc.atPage":        "# %d",
		"cmd.misc.nextPage":      "â¬‡ï¸� Next",
		"cmd.misc.get.success":   "âœ”ï¸� *Read Success ~*\n\n*Key: *`%v`\n*Value: *`%v`",
		"cmd.misc.set.success":   "âœ”ï¸� *Write Success ~*\n\n*Original: *`%v`\n*Modified: *`%s`",

		"cmd.credit.logHead":  "ğŸ“– `%d` Logs:\n\n%s",
		"cmd.credit.notFound": "â�Œ Cannot find the record.",
		"cmd.credit.details":  "ğŸ“– Log Details:\n\n`ID:` `%v`\n`User ID:` `%v`\n`Credit:` `%v`\n`Reason:` `%v`\n`Notes:` `%v`\n`Operator:` `%v`\n`Time:` `%v`",

		"grant.assign.success":  "âœ”ï¸� The user is promoted ï½�",
		"grant.assign.failure":  "â�Œ The user does not need to be promoted ï½�",
		"grant.dismiss.success": "âœ”ï¸� The user is dismissed ï½�",
		"grant.dismiss.failure": "â�Œ The user does not need to be dismissed ï½�",

		"policy.importSuccess":    "âœ”ï¸� Group policy imported.",
		"policy.exportSuccess":    "âœ”ï¸� Group policy exported, please check the result in the private chat.",
		"policy.importError":      "â�Œ Unable to fetch the file, please make sure the file is valid and less than 10MB.",
		"policy.importParseError": "â�Œ Unable to decode the file, please try again.",

		"policy.rule.limit.peruser":         "â�Œ You have reached the maximum hit of the rule.",
		"policy.rule.limit.peruserinterval": "â�Œ You have reached the rate limit of the rule.",
		"policy.rule.limit.peruserday":      "â�Œ You have reached the maximum hit today, please try again tomorrow.",

		"forward.ban.success":   "âœ”ï¸� The user has been banned ï½�",
		"forward.ban.failure":   "â�Œ The user was banned ï½�",
		"forward.unban.success": "âœ”ï¸� The user has been released ï½�",
		"forward.unban.failure": "â�Œ The user does not need to be released ï½�",

		"credit.set.invalid":      "â�Œ Invalid Params. Please refer to: /setcredit <UserId:Optional> <Credit>",
		"credit.add.invalid":      "â�Œ Invalid Params. Please refer to: /addcredit <UserId:Optional> <Credit>",
		"credit.set.success":      "âœ”ï¸� Success, the credit point of the user is: %d.",
		"credit.importSuccess":    "âœ”ï¸� Imported %d columnsï¼Œyou can check credit details with /creditrank.",
		"credit.exportSuccess":    "âœ”ï¸� Exported, please check the result in the private chat.",
		"credit.importError":      "â�Œ Unable to fetch the file, please make sure the file is valid and less than 20MB.",
		"credit.importParseError": "â�Œ Unable to decode the file, please try again.",
		"credit.check.success":    "ğŸ‘€ `%s` has %d credit points",
		"credit.check.my":         "ğŸ‘€ `%s`, you have %d credit points",
		"credit.rank.info":        "#RANK The credit rank of the group: \n\n",
		"credit.lottery.info":     "ğŸ�‰ Congrats to the following users:\n\n",

		"transfer.invalidParam": "â�Œ Invalid Params. Please reply a user with /transfer <amount> to transfer your credit.",
		"transfer.success":      "âœ”ï¸� You have transferred %d credit points to the user.",
		"transfer.noBalance":    "â�Œ You do not have enough balance to complete the transfer.",

		"spoiler.invalid": "â�Œ Invalid Params. Please refer to: /set_antispoiler <on|off>",
		"spoiler.success": "âœ”ï¸� Anti-spoiler settings has been updated `(Status=%v)` ï½�",

		"su.group.addSuccess":   "âœ”ï¸� The group is enrolled successfully ï½�",
		"su.group.addDuplicate": "â�Œ The group has already been enrolled ï½�",
		"su.group.delSuccess":   "âœ”ï¸� The group is quitted successfully ï½�",
		"su.group.delDuplicate": "â�Œ The group has not been enrolled yet ï½�",

		// not support yet
		// "rp.complete":  "ğŸ§§ *ç§¯åˆ†çº¢åŒ…*\n\nå°�ä¼™ä¼´ä»¬æ‰‹é€Ÿéƒ½å¤ªå¿«å•¦ï¼Œ`%s`çš„å¤§çº¢åŒ…å·²è¢«ç“œåˆ†å¹²å‡€ï¼Œæ²¡æŠ¢åˆ°çš„å°�ä¼™ä¼´ä»¬è¯·æœŸå¾…ä¸‹æ¬¡çš„æ´»åŠ¨å“¦ï½�",
		// "rp.guessLeft": "çŒœçŒœçœ‹è¿˜å‰©å¤šå°‘ï¼Ÿ",
		// "rp.text":      "ğŸ§§ *ç§¯åˆ†çº¢åŒ…*\n\n``%så�‘çº¢åŒ…å•¦ï¼�å¤§å®¶å¿«æŠ¢å“¦ï½�\n\nå‰©ä½™ç§¯åˆ†: `%s`\nå‰©ä½™æ•°é‡�: `%d`",
		// "rp.text.captcha": "\n\n*è¯·é€‰æ‹©ä¸�ä¸Šå›¾ç›¸ç¬¦çš„éªŒè¯�ç �æ�¥æŠ¢çº¢åŒ…å“¦ï½�*",
		// "rp.lucky":     "\n\næ�­å–œæ‰‹æ°”ç�‹ `%s` è�·å¾—äº† `%d` åˆ† ğŸ�‰ ~",

		"rp.admin":              "Admin ",
		"rp.set.invalid":        "â�Œ Invalid Params. Please refer to: /redpacket `<Total Credit>` `<Num of Share>`\n\nPS: Total Credit should be with in 1 and 100,000. Number of Share should be with in 1 and 100 and no less than the Total Credit.",
		"rp.set.noEnoughCredit": "â�Œ You do not have that much credit to send this redpacket.",

		"gp.ban.success":   "ğŸ�‰ Congrats to `%s` to be restricted!",
		"gp.ban.failure":   "â�Œ You cannot restrict the user.",
		"gp.unban.success": "ğŸ�‰ Congrats to `%s` to be released!",
		"gp.unban.failure": "â�Œ You cannot release the user.",
		"gp.kick.success":  "ğŸ�‰ Congrats to `%s` to be kicked!",
		"gp.kick.failure":  "â�Œ You cannot kick the user.",

		"channel.set.cancel":           "âœ”ï¸� Group MFC has been turned off ï½�",
		"channel.set.success":          "âœ”ï¸� Group MFC has been turned on `(Join=%v, Msg=%v)` ï½�",
		"channel.bot.permit":           "ğŸ‘� Welcome %s, bots are permitted to join by default ï½�",
		"channel.user.alreadyFollowed": "ğŸ‘� Welcome %s, you already followed the linked channel, you are all set ï½�",
		"channel.request":              "[ğŸ�‰](tg://user?id=%d) Welcome `%s`, you have not yet followed the linked channel of the group for multi-factor CAPTCHA purpose. Please join the channel within %d seconds to prove you are not a robot ï½�",
		"channel.cannotSendMsg":        "â�Œ Cannot send the verification message, please check my permission ï½�",
		"channel.cannotBanUser":        "â�Œ Cannot complete the CAPTCHA, please check my permission ï½�",
		"channel.cannotCheckChannel":   "â�Œ Cannot read the user list of targetted channel, please make sure the bot has enough permission in the channel ï½�",
		"channel.pattern.kicked":       "\u200d [The user's](tg://user?id=%d) name has been marked as fraud. If you believe this is a mistake, please contact group admin for help ï½�",
		"channel.kicked":               "ğŸ‘€ [The user](tg://user?id=%d) did not pass the MFC verification, so it is banned ï½�",
		"channel.kicked.underAttack":   "âš ï¸� [The user's](tg://user?id=%d) request is automatically declined due to some emergency circumstances.",

		"locale.set": "âœ”ï¸� The default language of this group has been changed to: %s ï½�",
		"locale.get": "ğŸ‘€ The default language of this group is: %s ï½�",

		// not support yet
		// "btn.rp.draw": "ğŸ¤� æˆ‘è¦�æŠ¢çº¢åŒ…|rp?r=%d",
		// "btn.rp.draw.captcha": "%s|rp?c=%s&r=%d",
		// "btn.notFair": "ğŸ˜  è¿™ä¸�å…¬å¹³ (%d)|vote?u=%d&s=%d",

		"btn.adminPanel":    "ğŸš© UNBAN [ADMIN]|unban?u=%d&s=%d||ğŸš® KICK [ADMIN]|kick?u=%d&s=%d",
		"btn.channel.step1": "ğŸ‘‰ 1ST: JOIN THE CHANNEL ğŸ‘ˆ|%s",
		"btn.channel.step2": "ğŸ‘‰ 2ND: RELEASE ME ğŸ‘ˆ|check?u=%d",

		"cb.unblock.byadmin": "\n\nThe user is unbanned by admin ğŸ‘Š",
		"cb.kicked.byadmin":  "\n\nThe user has been kicked ğŸ¦¶",
		"cb.unblock.byvote":  "\n\nThe user is voted to be innocent, the credit punishment is reverted.",

		"cb.unban.success":                "âœ”ï¸� User is unbanned ~",
		"cb.unban.failure":                "â�Œ User cannot be unbanned ~",
		"cb.kick.success":                 "âœ”ï¸� User is kicked ~",
		"cb.kick.failure":                 "â�Œ User cannot be kicked ~",
		"cb.validate.success":             "âœ”ï¸� Verified. Welcome to the group ~",
		"cb.validate.success.cannotUnban": "â�Œ Verified, yet I cannot unban you. Please contact group admin for help ~",
		"cb.validate.failure":             "â�Œ Fail to verify. Please make sure you have followed the channel ~",
		"cb.validate.others":              "ğŸ˜  DO NOT PLAY CAPTCHA OF OTHERS",
		"cb.vote.success":                 "âœ”ï¸� Voted. Thanks for your participation ~",
		"cb.vote.failure":                 "â�Œ Duplicated vote ~",
		"cb.vote.notExists":               "â�Œ The vote has been closed ~",
		"cb.rp.nothing":                   "ğŸ�¢ AHA you get nothing...",
		"cb.rp.get.1":                     "ğŸ�‰ You get ",
		"cb.rp.get.2":                     " credit points. Congrats ï½�",
		"cb.rp.captchaInvalid":            "â�Œ Wrong captcha code, you lose the change to get a redpacket ï½�",
		"cb.rp.duplicated":                "â�Œ Duplicated draw, DONT BE VORACIOUS ~",
		"cb.rp.notExists":                 "â�Œ The event is over, please engage next time ~",
		"cb.lottery.start":                "ğŸ�‰ The lottery is submitted.",
		"cb.lottery.enroll":               "ğŸ�‰ Enrolled. Thanks for your participation ~",
		"cb.lottery.noEnoughCredit":       "â�Œ Your credit points are not enough to enroll in the lottery.",
		"cb.lottery.checkFailed":          "â�Œ Please make sure you are in the group.",
		"cb.notMiaoAdmin":                 "â�Œ Do not play with the button!",
		"cb.notAdmin":                     "â�Œ Do not play with the button!",
		"cb.noEvent":                      "â�Œ The event is not found.",
		"cb.validationError":              "â�Œ The data is not validated.",
		"cb.notParsed":                    "â�Œ The event is invalid.",
		"cb.disabled":                     "â�Œ The group is not authorized.",
	},
}

const DEFAULT_LANG = "en"

func HasLocale(identifier string) bool {
	if _, ok := LocaleAlias[identifier]; ok {
		return true
	}
	if _, ok := LocaleMap[identifier]; ok {
		return true
	}
	return false
}

func Locale(identifier string, locale string) string {
	// process alias
	if alias, ok := LocaleAlias[locale]; ok && alias != "" {
		locale = alias
	}

	// find keywords
	if locales, ok := LocaleMap[locale]; ok && locales != nil {
		if text, ok := locales[identifier]; ok && text != "" {
			return text
		}
	}

	// fallback
	if text, ok := LocaleMap[DEFAULT_LANG][identifier]; ok && text != "" {
		return text
	}

	return identifier
}

func GetUserLocale(c *tb.Chat, u *tb.User) string {
	if u != nil && u.LanguageCode != "" && HasLocale(u.LanguageCode) {
		return u.LanguageCode
	}

	if c != nil {
		gc := GetGroupConfig(c.ID)
		if gc != nil && gc.Locale != "" && HasLocale(gc.Locale) {
			return gc.Locale
		}
	}

	return DEFAULT_LANG
}

func GetSenderLocale(m *tb.Message) string {
	user := m.Sender
	if m.UserJoined != nil {
		user = m.UserJoined
	}

	return GetUserLocale(m.Chat, user)
}

func GetSenderLocaleCallback(c *tb.Callback) string {
	return GetUserLocale(c.Message.Chat, c.Sender)
}
