localization.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. import os
  2. import json
  3. import re
  4. from modules import shared
  5. source_filename = "localization"
  6. local_data = {}
  7. local_id = ""
  8. localizations = {}
  9. localizations_dir = shared.cmd_opts.localizations_dir if "localizations_dir" in shared.cmd_opts else "localizations"
  10. def list_localizations(dirname):
  11. localizations.clear()
  12. for file in os.listdir(dirname):
  13. fn, ext = os.path.splitext(file)
  14. if ext.lower() != ".json":
  15. continue
  16. localizations[fn] = os.path.join(dirname, file)
  17. from modules import scripts
  18. for file in scripts.list_scripts("localizations", ".json"):
  19. fn, ext = os.path.splitext(file.filename)
  20. localizations[fn] = file.path
  21. list_localizations(localizations_dir)
  22. my_localization_data = {
  23. "Edit Model Basic Data": {
  24. "zh_TW": "編輯模型基礎資料",
  25. "ja": "モデルの基本データを編集する",
  26. "ko": "모델 기본 데이터 편집",
  27. "zh_CN": "编辑模型基础资料"
  28. },
  29. "You DID NOT load any model!": {
  30. "zh_TW": "你沒有載入模型!",
  31. "ja": "モデルを読み込んでいません!",
  32. "ko": "모델을 로드하지 않았습니다!",
  33. "zh_CN": "你没有加载模型!"
  34. },
  35. "Edit Model Trigger Words": {
  36. "zh_TW": "編輯模型觸發詞",
  37. "ja": "モデルトリガーワードの編集",
  38. "ko": "모델 트리거 단어 수정",
  39. "zh_CN": "编辑模型触发词"
  40. },
  41. "Enter your prompt word (trigger word/prompt/negative prompt)": {
  42. "zh_TW": "輸入你的提示詞 (觸發詞/提示詞/反向提示詞)",
  43. "ja": "プロンプトワードを入力してください (トリガーワード/プロンプト/否定プロンプト)",
  44. "ko": "프롬프트 단어 입력(트리거 단어/프롬프트/부정 프롬프트)",
  45. "zh_CN": "输入你的提示词 (触发词/提示词/反向提示词)"
  46. },
  47. "Categorys of prompt": {
  48. "zh_TW": "分類",
  49. "ja": "カテゴリー",
  50. "ko": "카테고리",
  51. "zh_CN": "分类"
  52. },
  53. "Apply data": {
  54. "zh_TW": "確定",
  55. "ja": "確認する",
  56. "ko": "확인하다",
  57. "zh_CN": "确定"
  58. },
  59. "Suggested weight": {
  60. "zh_TW": "建議權重",
  61. "ja": "推奨モデル重量",
  62. "ko": "권장 모델 무게",
  63. "zh_CN": "建议权重"
  64. },
  65. "Sorting": {
  66. "zh_TW": "打開排序功能選單",
  67. "ja": "ソート機能メニューを開く",
  68. "ko": "정렬 기능 메뉴 열기",
  69. "zh_CN": "打开排序功能选单"
  70. },
  71. "Negative prompt: please enter Y if this prompt is a negative prompt.": {
  72. "zh_TW": "反向提示詞: 為反向提詞時請輸入Y",
  73. "ja": "ネガティブプロンプト: このプロンプトが否定的なプロンプトである場合は、Y を入力してください。",
  74. "ko": "부정적인 프롬프트: 이 프롬프트가 부정적인 프롬프트인 경우 Y를 입력하십시오.",
  75. "zh_CN": "反向提示词: 为反向提词时请输入Y"
  76. },
  77. "Translate prompt words into:": {
  78. "zh_TW": "將提示詞翻譯為:",
  79. "ja": "プロンプトの単語を他の言語に翻訳する: ",
  80. "ko": "프롬프트 단어를 다른 언어로 번역: ",
  81. "zh_CN": "将提示词翻译为: "
  82. },
  83. "Easy editing": {
  84. "zh_TW": "簡易編輯",
  85. "ja": "簡単な編集",
  86. "ko": "쉬운 편집",
  87. "zh_CN": "一键编辑"
  88. },
  89. "Advanced editing": {
  90. "zh_TW": "進階編輯",
  91. "ja": "高度な編集",
  92. "ko": "고급 편집",
  93. "zh_CN": "高级编辑"
  94. },
  95. "Additional description": {
  96. "zh_TW": "額外描述",
  97. "ja": "追加説明",
  98. "ko": "추가 설명",
  99. "zh_CN": "额外描述"
  100. },
  101. "Additional description name": {
  102. "zh_TW": "額外描述名稱",
  103. "ja": "追加説明の名前",
  104. "ko": "추가 설명의 이름",
  105. "zh_CN": "额外描述名称"
  106. },
  107. "Description prompt": {
  108. "zh_TW": "描述提詞",
  109. "ja": "プロンプト",
  110. "ko": "설명 프롬프트",
  111. "zh_CN": "描述提词"
  112. },
  113. "Dedicated negative prompt": {
  114. "zh_TW": "專用反向提詞",
  115. "ja": "専用の否定プロンプト",
  116. "ko": "전용 네거티브 프롬프트",
  117. "zh_CN": "专用反向提词"
  118. },
  119. "Dedicated negative prompt name": {
  120. "zh_TW": "專用反向提詞名稱",
  121. "ja": "専用ネガティブプロンプトの名前",
  122. "ko": "전용 네거티브 프롬프트의 이름",
  123. "zh_CN": "专用反向提词名称"
  124. },
  125. "EX: draw a Mahiro": {
  126. "zh_TW": "EX: 叫出真尋",
  127. "ja": "EX: まひろを描く",
  128. "ko": "EX: XXX 그리기",
  129. "zh_CN": "EX: 叫出真寻"
  130. },
  131. "EX: Characteristics of Mahiro": {
  132. "zh_TW": "EX: 真尋的特徵",
  133. "ja": "EX: ひろの特徴",
  134. "ko": "EX: XXX 그리기",
  135. "zh_CN": "EX: 真寻的特征"
  136. },
  137. "EX: negative prompt for Mahiro": {
  138. "zh_TW": "EX: 真尋反向提詞",
  139. "ja": "EX: まひろに対する否定的なプロンプト",
  140. "ko": "EX: XXX에 대한 부정적인 프롬프트",
  141. "zh_CN": "EX: 真寻反向提词"
  142. },
  143. "Type": {
  144. "zh_TW": "類別",
  145. "ja": "タイプ",
  146. "ko": "유형",
  147. "zh_CN": "类别"
  148. },
  149. "Name": {
  150. "zh_TW": "名稱",
  151. "ja": "名前",
  152. "ko": "이름",
  153. "zh_CN": "名称"
  154. },
  155. "Model Path": {
  156. "zh_TW": "模型路徑",
  157. "ja": "モデルパス",
  158. "ko": "모델 경로",
  159. "zh_CN": "模型路径"
  160. },
  161. "name": {
  162. "zh_TW": "名稱",
  163. "ja": "名前",
  164. "ko": "이름",
  165. "zh_CN": "名称"
  166. },
  167. "Trigger Word": {
  168. "zh_TW": "模型觸發詞",
  169. "ja": "トリガーワード",
  170. "ko": "트리거 단어",
  171. "zh_CN": "模型触发词"
  172. },
  173. "Categorys": {
  174. "zh_TW": "種類",
  175. "ja": "カテゴリー",
  176. "ko": "카테고리",
  177. "zh_CN": "种类"
  178. },
  179. "Negative prompt": {
  180. "zh_TW": "反向提詞",
  181. "ja": "ネガティブプロンプト",
  182. "ko": "부정적인 프롬프트",
  183. "zh_CN": "反向提词"
  184. },
  185. "Remove duplicate prompts": {
  186. "zh_TW": "移除重複的提詞",
  187. "ja": "重複するプロンプトを削除する",
  188. "ko": "중복 프롬프트 제거",
  189. "zh_CN": "移除重复的提词"
  190. },
  191. "Remove empty prompts": {
  192. "zh_TW": "移除空白的提詞",
  193. "ja": "空のプロンプトを削除する",
  194. "ko": "빈 프롬프트 제거",
  195. "zh_CN": "移除空白的提词"
  196. },
  197. "Sort Order": {
  198. "zh_TW": "排序方式",
  199. "ja": "ソート順",
  200. "ko": "정렬 순서",
  201. "zh_CN": "排序方式"
  202. },
  203. "Sort by title": {
  204. "zh_TW": "依標題排序",
  205. "ja": "タイトル順に並べ替える",
  206. "zh_CN": "依标题排序"
  207. },
  208. "Sort by prompt": {
  209. "zh_TW": "依提詞排序",
  210. "ja": "プロンプトで並べ替える",
  211. "ko": "프롬프트별로 정렬",
  212. "zh_CN": "依提词排序"
  213. },
  214. "Message": {
  215. "zh_TW": "訊息",
  216. "ja": "メッセージ",
  217. "ko": "메시지",
  218. "zh_CN": "消息"
  219. },
  220. "Batch import prompts": {
  221. "zh_TW": "批次導入提詞",
  222. "ja": "プロンプトの一括インポート",
  223. "ko": "프롬프트 일괄 가져 오기",
  224. "zh_CN": "批量导入提词"
  225. },
  226. "Read prompts from text boxes": {
  227. "zh_TW": "從文字框讀取提詞",
  228. "ja": "テキストボックスからプロンプトを読み取る",
  229. "ko": "텍스트 상자에서 프롬프트 읽기",
  230. "zh_CN": "从文字框读取提词"
  231. },
  232. "Download configuration files from CivitAI": {
  233. "zh_TW": "從CivitAI抓取設定檔",
  234. "ja": "CivitAIから設定ファイルをダウンロードする",
  235. "ko": "CivitAI에서 설정 파일 다운로드",
  236. "zh_CN": "从CivitAI抓取配置文件"
  237. },
  238. "Enter prompts (one line for one trigger words)": {
  239. "zh_TW": "輸入提詞 (一行為一組)",
  240. "ja": "プロンプトを入力する(1行に1つのトリガーワード)",
  241. "ko": "프롬프트 입력 (한 줄에 하나의 트리거 단어)",
  242. "zh_CN": "输入提词 (一行为一组)"
  243. },
  244. "Read failed, no model selected.": {
  245. "zh_TW": "讀取失敗,無選擇的模型。",
  246. "ja": "読み込みに失敗しました、モデルが選択されていません。",
  247. "ko": "로드 실패, 모델이 선택되지 않았습니다.",
  248. "zh_CN": "读取失败,无选择的模型。"
  249. },
  250. "CivitAI does not have this model, or it has been taken down.": {
  251. "zh_TW": "CivitAI沒有這個模型,或者已被下架。",
  252. "ja": "CivitAIにはこのモデルがないか、取り下げられました。",
  253. "ko": "CivitAI에는이 모델이 없거나 다운되었습니다.",
  254. "zh_CN": "CivitAI没有这个模型,或者已被下架。"
  255. },
  256. "Successfully downloaded model data from CivitAI.": {
  257. "zh_TW": "已成功從CivitAI抓取模型資料。",
  258. "ja": "CivitAIからモデルデータを正常にダウンロードしました。",
  259. "ko": "CivitAI에서 모델 데이터를 성공적으로 다운로드했습니다.",
  260. "zh_CN": "已成功从CivitAI抓取模型资料。"
  261. },
  262. "Save failed, no model selected.": {
  263. "zh_TW": "儲存失敗,無選擇的模型。",
  264. "ja": "モデルが選択されていませんので、保存に失敗しました。",
  265. "zh_CN": "保存失败,无选择的模型。"
  266. },
  267. "Load Successful": {
  268. "zh_TW": "讀取成功",
  269. "ja": "読み込み成功",
  270. "ko": "로드 성공",
  271. "zh_CN": "读取成功"
  272. },
  273. "Save complete": {
  274. "zh_TW": "儲存完成",
  275. "ja": "保存完了",
  276. "ko": "저장 완료",
  277. "zh_CN": "保存完成"
  278. },
  279. "Model not loaded.": {
  280. "zh_TW": "未載入模型。",
  281. "ja": "モデルが読み込まれていません。",
  282. "ko": "모델이 로드되지 않았습니다.",
  283. "zh_CN": "未加载模型。"
  284. },
  285. "HTTP ERROR": {
  286. "zh_TW": "HTTP錯誤",
  287. "ja": "HTTPエラー",
  288. "ko": "HTTP 오류",
  289. "zh_CN": "HTTP错误"
  290. },
  291. "hash calculate failed": {
  292. "zh_TW": "hash計算失敗",
  293. "ja": "ハッシュの計算に失敗しました。",
  294. "ko": "해시 계산 실패",
  295. "zh_CN": "hash计算失败"
  296. },
  297. "fail to load data": {
  298. "zh_TW": "資料讀取失敗",
  299. "ja": "データの読み込みに失敗しました。",
  300. "ko": "데이터 로드 실패",
  301. "zh_CN": "资料读取失败"
  302. },
  303. "error, content from CivitAI is None": {
  304. "zh_TW": "錯誤,CivitAI傳回資料為空",
  305. "ja": "エラー、CivitAIからのコンテンツがありません。",
  306. "ko": "오류, CivitAI에서 반환 된 콘텐츠가 없습니다.",
  307. "zh_CN": "错误,CivitAI传回资料为空"
  308. },
  309. "error, Can not connect to CivitAI.": {
  310. "zh_TW": "錯誤,無法連線到CivitAI",
  311. "ja": "エラー、CivitAIに接続できません。",
  312. "ko": "오류, CivitAI에 연결할 수 없습니다.",
  313. "zh_CN": "错误,无法连线到CivitAI"
  314. },
  315. "Successfully load trigger word from Dreambooth model.": {
  316. "zh_TW": "已成功從Dreambooth模型抓取觸發詞資料。",
  317. "ja": "Dreamboothモデルからトリガーワードを正常に読み込みました。",
  318. "ko": "Dreambooth 모델에서 트리거 단어를 성공적으로 로드했습니다.",
  319. "zh_CN": "已成功从Dreambooth模型抓取触发词资料。"
  320. },
  321. "trigger word not found.": {
  322. "zh_TW": "找不到模型觸發詞",
  323. "ja": "トリガーワードが見つかりません。",
  324. "ko": "트리거 단어를 찾을 수 없습니다.",
  325. "zh_CN": "找不到模型触发词"
  326. },
  327. "Show debug message": {
  328. "zh_TW": "顯示除錯Debug資訊。",
  329. "ja": "デバッグメッセージを表示",
  330. "zh_CN": "显示调试Debug信息。"
  331. },
  332. "Load trigger words from Dreambooth model": {
  333. "zh_TW": "從Dreambooth模型抓取觸發詞",
  334. "ja": "Dreamboothモデルからトリガーワードを読み込む",
  335. "zh_CN": "从Dreambooth模型抓取触发词"
  336. },
  337. "Force touch mode": {
  338. "zh_TW": "使用觸控模式",
  339. "ja": "タッチモードを強制する",
  340. "zh_CN": "使用触控模式"
  341. },
  342. "Model params": {
  343. "zh_TW": "建議的模型參數",
  344. "ja": "モデルのパラメーター",
  345. "zh_CN": "建议的模型参数"
  346. }
  347. }
  348. def load_localization(current_localization_name):
  349. global local_data
  350. global local_id
  351. local_id = current_localization_name
  352. fn = localizations.get(current_localization_name, None)
  353. if fn is not None:
  354. try:
  355. with open(fn, "r", encoding="utf8") as file:
  356. local_data = json.load(file)
  357. except Exception:
  358. print(f"Error loading localization from {fn}")
  359. def get_localize(msg):
  360. if msg in local_data.keys():
  361. return msg
  362. if msg in my_localization_data.keys():
  363. if local_id in my_localization_data[msg].keys():
  364. return my_localization_data[msg][local_id]
  365. prefix_id = re.sub(r"[_\-\s]+","_",local_id).split("_")[0]
  366. if prefix_id in my_localization_data[msg].keys():
  367. return my_localization_data[msg][prefix_id]
  368. return msg
  369. def get_localize_message(msg):
  370. if msg in local_data.keys():
  371. return local_data[msg]
  372. if msg in my_localization_data.keys():
  373. if local_id in my_localization_data[msg].keys():
  374. return my_localization_data[msg][local_id]
  375. prefix_id = re.sub(r"[_\-\s]+","_",local_id).split("_")[0]
  376. if prefix_id in my_localization_data[msg].keys():
  377. return my_localization_data[msg][prefix_id]
  378. return msg