Difficult-Rocket/Difficult_Rocket/utils/translate.py

177 lines
6.0 KiB
Python
Raw Normal View History

2021-09-08 23:38:34 +08:00
# -------------------------------
# Difficult Rocket
2022-06-27 16:51:14 +08:00
# Copyright © 2021-2022 by shenjackyuanjie 3695888@qq.com
2021-09-08 23:38:34 +08:00
# All rights reserved
# -------------------------------
2021-09-02 22:47:10 +08:00
"""
2022-11-26 21:48:55 +08:00
writen by shenjackyuanjie <3695888@qq.com>
2021-09-02 22:47:10 +08:00
mail: 3695888@qq.com
github: @shenjackyuanjie
gitee: @shenjackyuanjie
"""
2022-07-01 13:59:08 +08:00
import inspect
2022-11-26 21:48:55 +08:00
# import dataclasses
2022-07-01 13:59:08 +08:00
2022-11-26 21:48:55 +08:00
from typing import Union, Tuple, Any, Type, List, Dict, Hashable
2022-08-12 21:07:36 +08:00
from Difficult_Rocket import DR_runtime, DR_option
2022-04-26 22:05:58 +08:00
from Difficult_Rocket.utils import tools
2022-07-04 10:36:19 +08:00
from Difficult_Rocket.exception.language import *
2022-11-26 22:45:30 +08:00
2022-11-26 23:35:49 +08:00
class Translates:
2022-11-27 13:45:59 +08:00
def __init__(self,
value: Union[Dict[str, Any], list, tuple, str],
raise_error: bool = False,
2022-12-25 23:15:49 +08:00
get_list: List[str] = None,
error_get_list: List[str] = None,
2022-11-27 13:45:59 +08:00
final: bool = False):
"""
2022-12-25 23:15:49 +08:00
一个用于翻译的东西
2022-11-27 13:45:59 +08:00
:param value: 翻译键节点
:param raise_error: 是否抛出错误
:param get_list: 尝试获取的列表
:param final: 是否为翻译结果 (偷懒用的)
"""
2022-11-26 22:45:30 +08:00
self.value: Union[Dict[str, Any], list, tuple] = value
self.raise_error = raise_error
self.get_list = get_list or []
2022-12-25 23:15:49 +08:00
self.error_get_list = error_get_list or []
2022-11-26 23:35:49 +08:00
self.final = final
2022-11-26 22:45:30 +08:00
2022-12-25 23:15:49 +08:00
def __getitem__(self, item: Union[str, int, Hashable]) -> Union["Translates", str, int]:
2022-12-08 09:53:22 +08:00
"""
一坨答辩
:param item: 取用的内容/小天才
:return:
"""
2022-11-26 22:45:30 +08:00
cache_get_list = self.get_list.copy()
2022-12-25 23:15:49 +08:00
cache_error_get_list = self.error_get_list.copy()
2022-11-26 22:45:30 +08:00
cache_get_list.append(item)
try:
2022-12-08 09:53:22 +08:00
cache = self.value[item]
2022-12-25 23:15:49 +08:00
cache_get_list.append(item)
2022-11-26 22:45:30 +08:00
except (KeyError, TypeError):
2022-12-25 23:15:49 +08:00
# 出现问题
2022-11-26 22:45:30 +08:00
if DR_option.report_translate_no_found:
frame = inspect.currentframe()
last_frame = frame.f_back
if last_frame.f_code == self.__getattr__.__code__:
last_frame = last_frame.f_back
call_info = f'Translate Not Found at {last_frame.f_code.co_name} by {".".join(cache_get_list)} at:' \
f'{last_frame.f_code.co_filename}:{last_frame.f_lineno}'
print(call_info)
2022-12-25 23:15:49 +08:00
# 如果不抛出错误
if self.raise_error:
2022-11-27 13:45:59 +08:00
raise TranslateKeyNotFound(item_names=cache_get_list) from None
2022-12-25 23:15:49 +08:00
cache_error_get_list.append(item)
if self.final: # 如果已经是翻译结果
return Translates(value='.'.join(cache_get_list), raise_error=False, final=True, error_get_list=cache_error_get_list)
2022-11-27 13:45:59 +08:00
else:
2022-12-25 23:15:49 +08:00
if self.final:
return self
else:
return Translates(value=cache, raise_error=self.raise_error, get_list=cache_get_list)
2022-11-26 21:48:55 +08:00
2022-11-26 23:35:49 +08:00
def __getattr__(self, item: Union[str, Hashable]) -> Union["Translates"]:
2022-11-26 21:48:55 +08:00
if hasattr(object, item):
return getattr(object, item)
return self.__getitem__(item)
def __str__(self):
2022-12-25 23:15:49 +08:00
if self.final: # 如果是字符串
2022-12-22 10:54:28 +08:00
return f'{self.value}.{".".join(self.get_list)}'
2022-11-26 21:48:55 +08:00
return str(self.value)
2021-09-02 22:47:10 +08:00
2022-07-01 13:59:08 +08:00
class Tr:
"""
2022-08-16 13:25:44 +08:00
我不装了我就抄了tr
GOOD
2022-07-01 13:59:08 +08:00
"""
2022-12-08 09:53:22 +08:00
def __init__(self, language: str = None, raise_error: bool = False):
"""
诶嘿我抄的MCDR
:param language: Tr 所使用的的语言
:param raise_error: 解析失败的时候是否报错
"""
2022-11-27 13:45:59 +08:00
self.language_name = language or DR_runtime.language
self.translates: Dict = tools.load_file(f'configs/lang/{self.language_name}.toml')
2022-11-26 21:48:55 +08:00
self.default_translate: Dict = tools.load_file(f'configs/lang/{DR_runtime.default_language}.toml')
2022-12-08 09:53:22 +08:00
self.不抛出异常 = raise_error
def __call__(self, ):
...
2022-07-04 10:36:19 +08:00
2022-07-01 13:59:08 +08:00
2021-09-02 22:47:10 +08:00
class Lang:
"""
用于创建一个对应语言的翻译类
感谢Fallen的MCDR提供idea
https://github.com/Fallen-Breath/MCDReforged
可以用
lang['language'] = 'abc'
lang['lang'] = 'abc'
的方式直接更改并刷新翻译
lang.lang(xxx, xxx)来获取翻译过的值
2021-09-02 22:47:10 +08:00
"""
2021-09-05 00:50:05 +08:00
2022-08-12 21:07:36 +08:00
def __init__(self) -> None:
2022-11-26 21:48:55 +08:00
self.translates = tools.load_file(f'configs/lang/{DR_runtime.language}.toml')
self.default_translates = tools.load_file('configs/lang/zh-CN.toml')
2022-06-14 20:52:03 +08:00
self.直接返回原始数据 = True
2021-09-02 22:47:10 +08:00
def __str__(self) -> str:
2022-08-12 21:07:36 +08:00
return DR_option.language
2021-09-02 22:47:10 +08:00
2021-10-22 06:36:06 +08:00
def __getitem__(self, item) -> Union[int, str, list, dict]:
try:
2022-11-26 21:48:55 +08:00
return self.translates[item]
except KeyError:
try:
2022-11-26 21:48:55 +08:00
return self.default_translates[item]
except KeyError:
2022-08-12 21:07:36 +08:00
raise TranslateKeyNotFound(f'there\'s no key {item} in both {DR_option.language} and zh-CN')
2022-12-08 09:53:22 +08:00
def lang(self, *args) -> Union[int, str, list, dict, tuple]:
2022-07-04 10:36:19 +08:00
# frame = inspect.currentframe()
# # print("调用当前log的文件名:", frame.f_back.f_code.co_filename)
# objprint.objprint(frame.f_back.f_code,
# honor_existing=False,
# depth=2)
try:
2022-11-26 21:48:55 +08:00
result = self.translates
for option in args:
result = result[option]
return result
except KeyError:
try:
2022-11-26 21:48:55 +08:00
result = self.default_translates
for option in args:
result = result[option]
return result
except KeyError as e:
2022-06-14 20:52:03 +08:00
if self.直接返回原始数据:
return args
2022-11-26 21:48:55 +08:00
raise TranslateKeyNotFound(f'there\'s no key {args} in both {DR_option.language} and zh-CN') from e
2021-10-22 06:36:06 +08:00
def 翻译(self, *args) -> Union[int, str, list, dict]:
return self.lang(args)
2022-08-12 21:07:36 +08:00
def _update_lang(self) -> str:
"""
用于更新语言(内部调用)
2022-11-26 21:48:55 +08:00
:return: 设置完成后的语言
2022-08-12 21:07:36 +08:00
"""
2022-11-26 21:48:55 +08:00
self.translates = tools.load_file(f'configs/lang/{DR_option.language}.toml')
2022-08-12 21:07:36 +08:00
return DR_option.language
2022-08-12 21:07:36 +08:00
if not __name__ == '__main__':
tr = Lang()
2022-11-27 13:45:59 +08:00
else:
tr_ = Tr()