14 Commits

Author SHA1 Message Date
RTAkland
6db23a3e28 feat: update README.md 2022-01-14 18:41:46 +08:00
RTAkland
5bed020e65 feat: remove something useless 2022-01-14 18:31:25 +08:00
RTAkland
506bb81f44 feat: add GUI 2022-01-14 18:30:34 +08:00
RTAkland
3a0902509a feat: add gui 2022-01-14 18:30:11 +08:00
RTAkland
704158bc64 feat: update gui insert 2022-01-14 18:22:24 +08:00
RTAkland
f6f97a0785 feat: update gui insert 2022-01-14 18:22:06 +08:00
RTAkland
b41be502f2 feat: fix bug 2022-01-01 15:34:45 +08:00
RTAkland
cc8bed1890 feat: update README.md 2022-01-01 15:33:20 +08:00
RTAkland
9174e11ecd feat: fix bug 2022-01-01 15:32:38 +08:00
RTAkland
31ea638770 feat: update version 2021-12-26 14:13:52 +08:00
RTAkland
11244734fd feat: update version 2021-12-26 14:13:31 +08:00
RTAkland
9cbd3b5063 feat: fix a bug 2021-12-26 14:13:09 +08:00
RTAkland
3622b094fd feat: add 404 page 2021-12-26 14:12:40 +08:00
RTAkland
4c73240fe9 feat: update language files 2021-12-26 14:12:24 +08:00
12 changed files with 200 additions and 34 deletions

View File

@@ -6,9 +6,39 @@
# @File Name: QWeather.py # @File Name: QWeather.py
import sys import threading
from core import qweather from core import qweather
from tkinter import messagebox
from lib.buildGUIClass import tk
from lib.buildGUIClass import root
from lib.buildGUIClass import Features
def on_closing():
if messagebox.askokcancel('Exit', 'Confirm exit?'):
Features().quit_()
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(qweather.main()) b1 = tk.Button(root,
text='Click to run QWeather',
command=threading.Thread(target=qweather.main, name='main').start)
b1.place(x=45, y=300)
b2 = tk.Button(root,
text='Exit the main program',
command=on_closing)
b2.place(x=275, y=300)
l1 = tk.Label(root,
text='更多功能敬请期待\nEnjoy this ~',)
l1.place(x=530, y=70)
information = """
已知问题:
1.开启QWeather主程序后退出只会退出界面主程序并不会退出
2.webservice.py 的输出并不会被插入到GUI界面里
* 更多问题待发现...
"""
l2 = tk.Label(root,
text=information)
l2.place(x=140, y=350)
root.protocol('WM_DELETE_WINDOW', on_closing)
root.mainloop()

View File

@@ -1,7 +1,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/MarkusJoe/QWeather"> <a href="https://github.com/MarkusJoe/QWeather">
<img src="https://img.shields.io/badge/Python-3.10.x-blue.svg" alt="PythonVersion"> <img src="https://img.shields.io/badge/Python-3.10.x-blue.svg" alt="PythonVersion">
<img src="https://img.shields.io/badge/release-3.2.0-green.svg" alt="QWeatherVersion"> <img src="https://img.shields.io/badge/release-4.0.0-green.svg" alt="QWeatherVersion">
<img src="https://img.shields.io/badge/LINCESE-Apache2.0-orange.svg" alt="LICENSE"> <img src="https://img.shields.io/badge/LINCESE-Apache2.0-orange.svg" alt="LICENSE">
</a> </a>
</p> </p>
@@ -13,9 +13,14 @@
<i style="text-align: center;"><a href="https://www.qweather.com/">QWeather Official Website</a></i>\ <i style="text-align: center;"><a href="https://www.qweather.com/">QWeather Official Website</a></i>\
<i style="text-align: center;"><a href="https://dev.qweather.com/">QWeather Development Platform</a></i> <i style="text-align: center;"><a href="https://dev.qweather.com/">QWeather Development Platform</a></i>
> GUI问题: 无法填写城市位置, 清手动打开./res/china_city_list.xlsx 进行手动查询
> 并填写至`requests-settings` > `location`
> `only-view-settings` > `city-name` 也需手动填写
</div> </div>
<div align="center"> <div align="center">
<b><i>当前分支: GUI, 为界面分支, 仍存在bug以及一些问题<br></i></b>
<b><i>当前分支版本为重构后的版本重构前版本请在before分支中查看<br>(重构前版本不再更新,最新版本为v2.9.0)</i></b><br> <b><i>当前分支版本为重构后的版本重构前版本请在before分支中查看<br>(重构前版本不再更新,最新版本为v2.9.0)</i></b><br>
<b><i><a href="https://markusjoe.github.io/" target="_blank">点击跳转到帮助文档</a></i></b> <b><i><a href="https://markusjoe.github.io/" target="_blank">点击跳转到帮助文档</a></i></b>
</div> </div>
@@ -37,6 +42,7 @@
- [x] 在网页上快速查看天气 - [x] 在网页上快速查看天气
- [x] 在邮件html内附带一句一言 - [x] 在邮件html内附带一句一言
- [ ] ~~推送到QQ(咕咕咕)~~ - [ ] ~~推送到QQ(咕咕咕)~~
- [x] GUI界面 (无法填写城市位置, 清手动打开./res/china_city_list.xlsx 进行手动查询)
### 问题汇总 ### 问题汇总
#### Python 版本: #### Python 版本:

View File

@@ -110,6 +110,9 @@ client-settings:
# 可选: "True" "False" # 可选: "True" "False"
SSL: True SSL: True
# [必填/只能一个] enable GUI or disable GUI
enable-GUI: True
# [标识/不填] 仅作用户读取标识 # [标识/不填] 仅作用户读取标识
only-view-settings: only-view-settings:

View File

@@ -6,6 +6,7 @@
# @File Name: qweather.py # @File Name: qweather.py
import os
import sys import sys
import time import time
import argparse import argparse
@@ -16,6 +17,12 @@ from core.settings import change_settings
from core.read_config import read_config from core.read_config import read_config
from core.sendmail import Mail from core.sendmail import Mail
from lib.webservice import accept_requests from lib.webservice import accept_requests
from lib.buildGUIClass import InsertLog
language = Language()
settings = read_config()
processes = ProcessPoolExecutor(max_workers=3)
gui_log = InsertLog()
def check_time(): def check_time():
@@ -34,7 +41,10 @@ def check_time():
if local_time in time_list: if local_time in time_list:
Mail().dev_version() Mail().dev_version()
Logger.info(f'{language["mail_succeed"]}') Logger.info(f'{language["mail_succeed"]}')
gui_log.insert(f'{language["wait_seconds"]}')
Logger.info(f'{language["wait_seconds"]}') Logger.info(f'{language["wait_seconds"]}')
gui_log.insert(f'{language["mail_succeed"]}')
time.sleep(60) time.sleep(60)
case 'free': case 'free':
while True: while True:
@@ -43,7 +53,9 @@ def check_time():
if local_time in time_list: if local_time in time_list:
Mail().free_version() Mail().free_version()
Logger.info(f'{language["mail_succeed"]}') Logger.info(f'{language["mail_succeed"]}')
gui_log.insert(f'{language["wait_seconds"]}')
Logger.info(f'{language["wait_seconds"]}') Logger.info(f'{language["wait_seconds"]}')
gui_log.insert(f'{language["mail_succeed"]}')
time.sleep(60) time.sleep(60)
@@ -83,6 +95,16 @@ def main():
主程序 主程序
:return: :return:
""" """
Logger.info(f'{language["statement_1"]}')
gui_log.insert(f'{language["statement_1"]}')
Logger.info(f'{language["statement_2"]}')
gui_log.insert(f'{language["statement_2"]}')
Logger.info(f'{language["statement_3"]}')
gui_log.insert(f'{language["statement_3"]}')
Logger.info(f'{language["statement_4"]}')
gui_log.insert(f'{language["statement_4"]}')
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
arg_keywords = ['free', 'dev', 'warning', 'setting'] arg_keywords = ['free', 'dev', 'warning', 'setting']
parser.add_argument('-t', parser.add_argument('-t',
@@ -95,18 +117,22 @@ def main():
case 'free': case 'free':
Mail().free_version() Mail().free_version()
Logger.debug(f'{language["debug_done"]}') Logger.debug(f'{language["debug_done"]}')
gui_log.insert(f'{language["debug_done"]}')
sys.exit(0) sys.exit(0)
case 'dev': case 'dev':
Mail().dev_version() Mail().dev_version()
Logger.debug(f'{language["debug_done"]}') Logger.debug(f'{language["debug_done"]}')
gui_log.insert(f'{language["debug_done"]}')
sys.exit(0) sys.exit(0)
case 'warning': case 'warning':
Mail().warning_() Mail().warning_()
Logger.debug(f'{language["debug_done"]}') Logger.debug(f'{language["debug_done"]}')
gui_log.insert(f'{language["debug_done"]}')
sys.exit(0) sys.exit(0)
case 'setting': case 'setting':
change_settings() change_settings()
Logger.debug(f'{language["debug_done"]}') Logger.debug(f'{language["debug_done"]}')
gui_log.insert(f'{language["debug_done"]}')
case _: case _:
if check_config(): if check_config():
setting() setting()
@@ -116,7 +142,8 @@ def main():
processes.submit(check_time) processes.submit(check_time)
if settings[2]['webservice']: if settings[2]['webservice']:
Logger.info(f'{language["webservice_ip"]}:127.0.0.1:7898') Logger.info(f'{language["webservice_ip"]}:127.0.0.1:7898')
processes.submit(accept_requests()) gui_log.insert(f'{language["webservice_ip"]}:127.0.0.1:7898')
processes.submit(accept_requests)
time_count = 0 time_count = 0
while True: while True:
@@ -125,14 +152,3 @@ def main():
if time_count == 600: if time_count == 600:
Mail().warning_() Mail().warning_()
time_count = 0 time_count = 0
if __name__ != '__main__':
language = Language()
settings = read_config()
processes = ProcessPoolExecutor(max_workers=3)
Logger.info(f'{language["statement_1"]}')
Logger.info(f'{language["statement_2"]}')
Logger.info(f'{language["statement_3"]}')
Logger.info(f'{language["statement_4"]}')

View File

@@ -8,6 +8,9 @@
import pandas import pandas
from core.logger import Logger from core.logger import Logger
from core.language import Language from core.language import Language
from lib.buildGUIClass import InsertLog
gui_log = InsertLog()
def read_excel(kw: str): def read_excel(kw: str):
@@ -21,12 +24,14 @@ def read_excel(kw: str):
index_count = 0 index_count = 0
city_list = [] city_list = []
Logger.info(f'[Search]{language["reading_the_file"]}') Logger.info(f'[Search]{language["reading_the_file"]}')
gui_log.insert(f'[Search]{language["reading_the_file"]}')
df = pandas.read_excel(f'./res/china_city_list.xlsx') df = pandas.read_excel(f'./res/china_city_list.xlsx')
pandas.set_option('max_rows', None) # 读取xlsx文件不折叠 pandas.set_option('max_rows', None) # 读取xlsx文件不折叠
data_records = df.to_dict(orient='split') data_records = df.to_dict(orient='split')
for i in data_records['data']: for i in data_records['data']:
if kw in str(i): if kw in str(i):
Logger.info(f' {index_count} | {i[2]}-{i[4]}-{i[6]}') Logger.info(f' {index_count} | {i[2]}-{i[4]}-{i[6]}')
gui_log.insert(f' {index_count} | {i[2]}-{i[4]}-{i[6]}')
city = [index_count, i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9]] city = [index_count, i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9]]
index_count += 1 index_count += 1
city_list.append(city) city_list.append(city)

View File

@@ -17,6 +17,9 @@ from core.language import Language
from core.information import WeatherInfo from core.information import WeatherInfo
from core.read_config import read_config from core.read_config import read_config
from lib.hitokoto import hitokoto from lib.hitokoto import hitokoto
from lib.buildGUIClass import InsertLog
gui_log = InsertLog()
class Mail: class Mail:
@@ -209,8 +212,10 @@ class Mail:
self.smtp.login(self.sender, self.password) # 登录 self.smtp.login(self.sender, self.password) # 登录
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
Logger.info(f'{self.language["mail_succeed"]}') Logger.info(f'{self.language["mail_succeed"]}')
gui_log.insert(f'{self.language["mail_succeed"]}')
except smtplib.SMTPException as e: # 处理错误 except smtplib.SMTPException as e: # 处理错误
Logger.critical(f'{self.language["mail_error"]}: {e}') Logger.critical(f'{self.language["mail_error"]}: {e}')
gui_log.insert(f'{self.language["mail_error"]}: {e}')
sys.exit(1) sys.exit(1)
def free_version(self): def free_version(self):
@@ -356,8 +361,10 @@ class Mail:
self.smtp.login(self.sender, self.password) # 登录 self.smtp.login(self.sender, self.password) # 登录
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
Logger.info(f'{self.language["mail_succeed"]}') Logger.info(f'{self.language["mail_succeed"]}')
Logger.info(f'{self.language["mail_succeed"]}')
except smtplib.SMTPException as e: # 处理错误 except smtplib.SMTPException as e: # 处理错误
Logger.critical(f'{self.language["mail_error"]}: {e}') Logger.critical(f'{self.language["mail_error"]}: {e}')
gui_log.insert(f'{self.language["mail_error"]}: {e}')
sys.exit(1) sys.exit(1)
def warning_(self): def warning_(self):
@@ -379,11 +386,14 @@ class Mail:
case 'update': case 'update':
status = '预警更新' status = '预警更新'
Logger.info(f'{self.language["new_warning"]}') Logger.info(f'{self.language["new_warning"]}')
gui_log.insert(f'{self.language["new_warning"]}')
case 'active': case 'active':
status = '已有灾害' status = '已有灾害'
Logger.info(f'{self.language["warning_updated"]}') Logger.info(f'{self.language["warning_updated"]}')
gui_log.insert(f'{self.language["warning_updated"]}')
case 'cancel': case 'cancel':
Logger.info(f'{self.language["warning_canceled"]}') Logger.info(f'{self.language["warning_canceled"]}')
gui_log.insert(f'{self.language["warning_canceled"]}')
mail_html = f""" mail_html = f"""
<!DOCTYPE html> <!DOCTYPE html>
@@ -434,6 +444,8 @@ class Mail:
self.smtp.login(self.sender, self.password) # 登录 self.smtp.login(self.sender, self.password) # 登录
self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送 self.smtp.sendmail(self.sender, self.receiver, self.message.as_string()) # 发送
Logger.info(f'{self.language["mail_succeed"]}') Logger.info(f'{self.language["mail_succeed"]}')
gui_log.insert(f'{self.language["mail_succeed"]}')
except smtplib.SMTPException as e: # 处理错误 except smtplib.SMTPException as e: # 处理错误
Logger.critical(f'{self.language["mail_error"]}: {e}') Logger.critical(f'{self.language["mail_error"]}: {e}')
gui_log.insert(f'{self.language["mail_error"]}: {e}')
sys.exit(1) sys.exit(1)

View File

@@ -11,7 +11,13 @@ import getpass
from core.logger import Logger from core.logger import Logger
from core.language import Language from core.language import Language
from core.read_excel import read_excel from core.read_excel import read_excel
from core.read_config import read_config
from ruamel.yaml import YAML from ruamel.yaml import YAML
from lib.buildGUIClass import InsertLog
from lib.buildGUIClass import var_command
gui_log = InsertLog()
gui = read_config()[2]['enable-GUI']
def change_settings(): def change_settings():
@@ -22,8 +28,11 @@ def change_settings():
language = Language() language = Language()
Logger.info(f'[Modify]{language["change_setting"]}') Logger.info(f'[Modify]{language["change_setting"]}')
gui_log.insert(f'[Modify]{language["change_setting"]}')
Logger.info(f'[Modify]{language["fill_the_config"]}') Logger.info(f'[Modify]{language["fill_the_config"]}')
gui_log.insert(f'[Modify]{language["fill_the_config"]}')
Logger.info(f'[Modify]{language["input_a_city_name"]}') Logger.info(f'[Modify]{language["input_a_city_name"]}')
gui_log.insert(f'[Modify]{language["input_a_city_name"]}')
while True: while True:
time.sleep(0.3) time.sleep(0.3)
city_name = input('-->') city_name = input('-->')
@@ -38,17 +47,24 @@ def change_settings():
break break
searched_city = read_excel(city_name) searched_city = read_excel(city_name)
Logger.info(f'[Modify]{language["user_input"]}:[{city_name}]') Logger.info(f'[Modify]{language["user_input"]}:[{city_name}]')
gui_log.insert(f'[Modify]{language["user_input"]}:[{city_name}]')
Logger.info(f'[Modify]{language["select_a_index"]}') Logger.info(f'[Modify]{language["select_a_index"]}')
gui_log.insert(f'[Modify]{language["select_a_index"]}')
if not searched_city: if not searched_city:
Logger.error(f'[Modify]{language["no_result"]}') Logger.error(f'[Modify]{language["no_result"]}')
gui_log.insert(f'[Modify]{language["no_result"]}')
sys.exit(1) sys.exit(1)
time.sleep(0.3) time.sleep(0.3)
while True: while True:
try: try:
time.sleep(0.3) time.sleep(0.3)
# if not gui:
user_input = input('-->') user_input = input('-->')
# else:
# user_input = var_command.get()
if user_input == 'q': if user_input == 'q':
Logger.info(f'[Exit]{language["exit"]}') Logger.info(f'[Exit]{language["exit"]}')
gui_log.insert(f'[Exit]{language["exit"]}')
sys.exit(1) sys.exit(1)
index = searched_city[int(user_input)] index = searched_city[int(user_input)]
with open('./config.yml', 'r', encoding='utf-8') as of: with open('./config.yml', 'r', encoding='utf-8') as of:
@@ -60,11 +76,15 @@ def change_settings():
with open('./config.yml', 'w', encoding='utf-8') as wf: with open('./config.yml', 'w', encoding='utf-8') as wf:
YAML().dump(data, wf) YAML().dump(data, wf)
Logger.info(f'[Write]{language["write_successfully"]}:config.yml') Logger.info(f'[Write]{language["write_successfully"]}:config.yml')
gui_log.insert(f'[Write]{language["write_successfully"]}:config.yml')
break break
except (IndexError, ValueError) as e: except (IndexError, ValueError) as e:
Logger.info(e) Logger.info(e)
gui_log.insert(e)
Logger.error(f'[Write]{language["input_type_error"]}') Logger.error(f'[Write]{language["input_type_error"]}')
gui_log.insert(f'[Write]{language["input_type_error"]}')
continue continue
finally: finally:
Logger.info(f'[Exit]{language["exit"]}') Logger.info(f'[Exit]{language["exit"]}')
gui_log.insert(f'[Exit]{language["exit"]}')
sys.exit(0) sys.exit(0)

58
lib/buildGUIClass.py Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python3
# -- coding:utf-8 --
# @Author: markushammered@gmail.com
# @Development Tool: PyCharm
# @Create Time: 2022/1/9
# @File Name: buildGUIClass.py
import tkinter
import tkinter as tk
root = tk.Tk()
root.title('QWeather client')
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 700
wh = 490
x = (sw - ww) / 2
y = (sh - wh) / 2
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
root.minsize(700, 490)
root.maxsize(700, 490)
log_label = tk.Label(root, text='Log information')
log_label.place(x=170, y=4)
log_text = tk.Text(root, width=55, height=15)
log_text.place(x=30, y=30)
var_command = tk.StringVar()
class InsertLog:
def __init__(self):
self.log_text = log_text
def insert(self, msg: str):
"""
insert the information to gui(Text)
:param msg: information
:return:
"""
if '\n' not in msg:
msg = msg + '\n'
self.log_text.configure(state=tkinter.NORMAL) # writable
self.log_text.insert('insert', msg) # insert information
self.log_text.configure(state=tkinter.DISABLED) # readable
class Features:
def __init__(self):
self.root = root
self.tk = tk
self.log_text = log_text
def quit_(self):
"""
quit gui
:return:
"""
self.root.destroy()
self.root.quit()

View File

@@ -12,11 +12,18 @@ from core.logger import Logger
from core.read_config import read_config from core.read_config import read_config
from core.information import WeatherInfo from core.information import WeatherInfo
from core.language import Language from core.language import Language
from lib.buildGUIClass import InsertLog
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) gui_log = InsertLog()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 7898)) try:
server.listen(5) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('0.0.0.0', 7898))
server.listen(5)
except OSError as e:
Logger.critical(e)
gui_log.insert(e)
language = Language() language = Language()
@@ -305,22 +312,23 @@ def process_requests(c, a):
try: try:
data = str(c.recv(1024)).split(':')[0][6:][:-17] data = str(c.recv(1024)).split(':')[0][6:][:-17]
html = build_html() html = build_html()
if data == '/' or '': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断 if data == '/': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a) c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8'))
c.sendto(html.encode('utf-8'), a) c.send(html.encode('utf-8'))
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
else: # 继续判断用户请求的文件是否存在 gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
try: try:
with open(f'.{data}', 'rb') as f: with open(f'./{data}', 'rb') as f:
c.sendto('HTTP1.1/ 200 OK\r\n\r\n'.encode('utf-8'), a) c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8'))
c.sendto(f.read(), a) c.send(f.read())
Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
except FileNotFoundError: gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}')
c.sendto(f'HTTP1.1/ 404 Not Found\r\n\r\n{html}'.encode('utf-8'), a) except FileNotFoundError:
with open('./res/basic-resources/404.html', 'r') as not_found:
c.send(f'HTTP/1.1 404 Not Found\r\n\r\n{not_found.read()}'.encode('utf-8'))
except BrokenPipeError: except BrokenPipeError:
Logger.error(f'{language["connection_speed_too_fast"]}') Logger.error(f'{language["connection_speed_too_fast"]}')
except IOError: gui_log.insert(f'{language["connection_speed_too_fast"]}')
Logger.error(f'{language["an_io_error"]}')
finally: finally:
c.close() c.close()
return return

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>QWeather|网页查看天气服务</title>
</head>
<body>
<i><b><p style="text-align: center; color: red">404 File Not Found</p></b></i>
</body>
</html>

View File

@@ -34,7 +34,6 @@
"exit": "Exited.", "exit": "Exited.",
"webservice_ip": "Local webservice ip", "webservice_ip": "Local webservice ip",
"connection_speed_too_fast": "Connection speed is too fast", "connection_speed_too_fast": "Connection speed is too fast",
"an_io_error": "An IO error.",
"noname": "No name.", "noname": "No name.",
"hitokoto": "Get hitokoto successfully.", "hitokoto": "Get hitokoto successfully.",
"get_resource": "Get resource", "get_resource": "Get resource",

View File

@@ -33,7 +33,6 @@
"exit": "已退出", "exit": "已退出",
"webservice_ip": "webservice地址", "webservice_ip": "webservice地址",
"connection_speed_too_fast": "连接速度过快", "connection_speed_too_fast": "连接速度过快",
"an_io_error": "一个IO错误",
"noname": "佚名", "noname": "佚名",
"hitokoto": "一言获取成功", "hitokoto": "一言获取成功",
"get_resource": "获取资源", "get_resource": "获取资源",