diff --git a/app_admin/utils.py b/app_admin/utils.py index 94d88ae..abb91bb 100644 --- a/app_admin/utils.py +++ b/app_admin/utils.py @@ -4,11 +4,12 @@ # #日期:2019/11/23 # 博客地址:zmister.com -import smtplib +from django.utils.translation import gettext_lazy as _ from django.conf import settings from email.mime.text import MIMEText from app_admin.models import SysSetting import random +import smtplib # 生成数字验证码 def generate_vcode(n=6): @@ -27,7 +28,7 @@ def send_email(to_email,vcode_str): username = SysSetting.objects.get(types='email', name='username').value pwd = SysSetting.objects.get(types='email', name='pwd').value ssl = SysSetting.objects.get(types='email',name='smtp_ssl').value - print(smtp_host,smtp_port,send_emailer,username,pwd) + # print(smtp_host,smtp_port,send_emailer,username,pwd) msg_from = send_emailer # 发件人邮箱 passwd = dectry(pwd) # 发件人邮箱密码 @@ -36,8 +37,8 @@ def send_email(to_email,vcode_str): s = smtplib.SMTP_SSL(smtp_host, int(smtp_port)) # 发件箱邮件服务器及端口号 else: s = smtplib.SMTP(smtp_host, int(smtp_port)) - subject = "MrDoc - 重置密码验证码" - content = "你的验证码为:{},验证码30分钟内有效!".format(vcode_str) + subject = _("MrDoc - 重置密码验证码") + content = _("你的验证码为:{},验证码30分钟内有效!".format(vcode_str)) msg = MIMEText(content, _subtype='html', _charset='utf-8') msg['Subject'] = subject @@ -48,7 +49,7 @@ def send_email(to_email,vcode_str): s.sendmail(msg_from, msg_to, msg.as_string()) return True except smtplib.SMTPException as e: - print(repr(e)) + # print(repr(e)) return False finally: s.quit() diff --git a/app_admin/views.py b/app_admin/views.py index 4a995be..47fd821 100644 --- a/app_admin/views.py +++ b/app_admin/views.py @@ -6,18 +6,18 @@ from django.contrib.auth.models import User # Django默认用户模型 from django.contrib.auth.decorators import login_required # 登录需求装饰器 from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页 -from app_admin.decorators import superuser_only,open_register from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q from django.urls import reverse -import datetime -import requests +from django.utils.translation import gettext_lazy as _ +from app_admin.decorators import superuser_only,open_register from app_doc.models import * from app_admin.models import * from app_admin.utils import * -import traceback from loguru import logger import re +import datetime +import requests # 返回验证码图片 @@ -33,8 +33,8 @@ def check_code(request): request.session["CheckCode"] = code return HttpResponse(stream.getvalue(), content_type="image/png") except Exception as e: - logger.exception("生成验证码图片异常") - return HttpResponse("请求异常:{}".format(repr(e))) + logger.exception(_("生成验证码图片异常")) + return HttpResponse(_("请求异常:{}".format(repr(e)))) # 登录视图 @@ -54,7 +54,7 @@ def log_in(request): if (len(require_login_check_code) > 0) and (require_login_check_code[0].value == 'on'): checkcode = request.POST.get("check_code", None) if checkcode != request.session['CheckCode'].lower(): - errormsg = '验证码错误!' + errormsg = _('验证码错误!') return render(request, 'login.html', locals()) if username != '' and pwd != '': user = authenticate(username=username,password=pwd) @@ -63,17 +63,17 @@ def log_in(request): login(request,user) return redirect('/') else: - errormsg = '用户被禁用!' + errormsg = _('用户被禁用!') return render(request, 'login.html', locals()) else: - errormsg = '用户名或密码错误!' + errormsg = _('用户名或密码错误!') return render(request, 'login.html', locals()) else: - errormsg = '用户名或密码错误!' + errormsg = _('用户名或密码错误!') return render(request, 'login.html', locals()) except Exception as e: logger.exception("登录异常") - return HttpResponse('请求出错') + return HttpResponse(_('请求出错')) # 注册视图 @@ -97,7 +97,7 @@ def register(request): try: register_code_value = RegisterCode.objects.get(code=register_code,status=1) except ObjectDoesNotExist: - errormsg = '注册码无效!' + errormsg = _('注册码无效!') return render(request, 'register.html', locals()) # 判断是否输入了用户名、邮箱和密码 if username and email and password: @@ -105,22 +105,22 @@ def register(request): email_exit = User.objects.filter(email=email) username_exit = User.objects.filter(username=username) if email_exit.count() > 0: # 验证电子邮箱 - errormsg = '此电子邮箱已被注册!' + errormsg = _('此电子邮箱已被注册!') return render(request, 'register.html', locals()) elif username_exit.count() > 0: # 验证用户名 - errormsg = '用户名已被使用!' + errormsg = _('用户名已被使用!') return render(request, 'register.html', locals()) elif re.match('^[0-9a-z]+$',username) is False: - errormsg = '用户名只能为英文数字组合' + errormsg = _('用户名只能为英文数字组合') return render(request, 'register.html', locals()) elif len(username) < 5: - errormsg = '用户名必须大于等于5位!' + errormsg = _('用户名必须大于等于5位!') return render(request, 'register.html', locals()) elif len(password) < 6: # 验证密码长度 - errormsg = '密码必须大于等于6位!' + errormsg = _('密码必须大于等于6位!') return render(request, 'register.html', locals()) elif checkcode != request.session['CheckCode'].lower(): # 验证验证码 - errormsg = "验证码错误" + errormsg = _("验证码错误") return render(request, 'register.html', locals()) else: # 创建用户 @@ -148,13 +148,13 @@ def register(request): login(request, user) return redirect('/') else: - errormsg = '用户被禁用,请联系管理员!' + errormsg = _('用户被禁用,请联系管理员!') return render(request, 'register.html', locals()) else: - errormsg = '请输入正确的电子邮箱格式!' + errormsg = _('请输入正确的电子邮箱格式!') return render(request, 'register.html', locals()) else: - errormsg = "请检查输入值" + errormsg = _("请检查输入值") return render(request, 'register.html', locals()) @@ -171,7 +171,7 @@ def log_out(request): resp.delete_cookie(c) return resp except Exception as e: - logger.exception("注销异常") + logger.exception(_("注销异常")) return redirect(request.META['HTTP_REFERER']) @@ -192,18 +192,18 @@ def forget_pwd(request): user = User.objects.get(email=email) user.set_password(new_pwd) user.save() - errormsg = "修改密码成功,请返回登录!" + errormsg = _("修改密码成功,请返回登录!") return render(request, 'forget_pwd.html', locals()) else: - errormsg = "验证码已过期" + errormsg = _("验证码已过期") return render(request, 'forget_pwd.html', locals()) except ObjectDoesNotExist: - logger.error("邮箱不存在:{}".format(email)) - errormsg = "验证码或邮箱错误" + logger.error(_("邮箱不存在:{}".format(email))) + errormsg = _("验证码或邮箱错误") return render(request, 'forget_pwd.html', locals()) except Exception as e: logger.exception("修改密码异常") - errormsg = "验证码或邮箱错误" + errormsg = _("验证码或邮箱错误") return render(request,'forget_pwd.html',locals()) @@ -228,14 +228,14 @@ def send_email_vcode(request): verification_code = vcode_str, expire_time = expire_time ) - return JsonResponse({'status':True,'data':'发送成功'}) + return JsonResponse({'status':True,'data':_('发送成功')}) else: - return JsonResponse({'status':False,'data':'发送验证码出错,请重试!'}) + return JsonResponse({'status':False,'data':_('发送验证码出错,请重试!')}) else: - return JsonResponse({'status':False,'data':'电子邮箱不存在!'}) + return JsonResponse({'status':False,'data':_('电子邮箱不存在!')}) else: - return JsonResponse({'status':False,'data':'方法错误'}) + return JsonResponse({'status':False,'data':_('方法错误')}) # 后台管理 - 仪表盘 @@ -303,7 +303,7 @@ def admin_user(request): table_data.append(item) return JsonResponse({'code':0,'data':table_data,"count": user_data.count()}) else: - return JsonResponse({'code':1,'msg':'方法错误'}) + return JsonResponse({'code':1,'msg':_('方法错误')}) # 后台管理 - 创建用户 @@ -319,10 +319,10 @@ def admin_create_user(request): '@' in email and re.match(r'^[0-9a-z]',username) and len(username) >= 5 : # 不允许电子邮箱重复 if User.objects.filter(email = email).count() > 0: - return JsonResponse({'status':False,'data':'电子邮箱不可重复'}) + return JsonResponse({'status':False,'data':_('电子邮箱不可重复')}) # 不允许重复的用户名 if User.objects.filter(username = username).count() > 0: - return JsonResponse({'status': False,'data':'用户名不可重复'}) + return JsonResponse({'status': False,'data':_('用户名不可重复')}) try: if user_type == 0: user = User.objects.create_user( @@ -340,11 +340,11 @@ def admin_create_user(request): user.save() return JsonResponse({'status':True}) except Exception as e: - return JsonResponse({'status':False,'data':'系统异常'}) + return JsonResponse({'status':False,'data':_('系统异常')}) else: - return JsonResponse({'status':False,'data':'请检查参数'}) + return JsonResponse({'status':False,'data':_('请检查参数')}) else: - return HttpResponse('方法不允许') + return HttpResponse(_('方法不允许')) # 后台管理 - 修改密码 @@ -361,16 +361,16 @@ def admin_change_pwd(request): user = User.objects.get(id=int(user_id)) user.set_password(password) user.save() - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) else: - return JsonResponse({'status':False,'data':'两个密码不一致'}) + return JsonResponse({'status':False,'data':_('两个密码不一致')}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) except Exception as e: print(repr(e)) - return JsonResponse({'status':False,'data':'请求错误'}) + return JsonResponse({'status':False,'data':_('请求错误')}) else: - return JsonResponse({'status':False,'data':'方法错误'}) + return JsonResponse({'status':False,'data':_('方法错误')}) # 后台管理 - 删除用户 @@ -389,11 +389,11 @@ def admin_del_user(request): top_doc=colloa.project.id,create_user=user ).update(create_user=colloa.project.create_user) user.delete() - return JsonResponse({'status':True,'data':'删除成功'}) + return JsonResponse({'status':True,'data':_('删除成功')}) except Exception as e: - return JsonResponse({'status':False,'data':'删除出错'}) + return JsonResponse({'status':False,'data':_('删除出错')}) else: - return JsonResponse({'status':False,'data':'方法错误'}) + return JsonResponse({'status':False,'data':_('方法错误')}) # 后台管理 - 文集管理 @@ -492,8 +492,8 @@ def admin_project_istop(request): Project.objects.filter(id=project_id).update(is_top=is_top) return JsonResponse({'status':True}) except: - logger.exception("置顶文集出错") - return JsonResponse({'status':False,'data':'执行出错'}) + logger.exception(_("置顶文集出错")) + return JsonResponse({'status':False,'data':_('执行出错')}) # 后台管理 - 文档管理 @@ -645,7 +645,7 @@ def admin_register_code(request): try: all_cnt = int(request.POST.get('all_cnt',1)) # 注册码的最大使用次数 if all_cnt <= 0: - return JsonResponse({'status': False, 'data': '最大使用次数不可为负数'}) + return JsonResponse({'status': False, 'data': _('最大使用次数不可为负数')}) is_code = False while is_code is False: code_str = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' @@ -661,24 +661,24 @@ def admin_register_code(request): all_cnt = all_cnt, create_user = request.user ) - return JsonResponse({'status':True,'data':'新增成功'}) + return JsonResponse({'status':True,'data':_('新增成功')}) except Exception as e: - logger.exception("生成注册码异常") - return JsonResponse({'status': False,'data':'系统异常'}) + logger.exception(_("生成注册码异常")) + return JsonResponse({'status': False,'data':_('系统异常')}) elif int(types) == 2: code_id = request.POST.get('code_id',None) try: register_code = RegisterCode.objects.get(id=int(code_id)) register_code.delete() - return JsonResponse({'status':True,'data':'删除成功'}) + return JsonResponse({'status':True,'data':_('删除成功')}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'注册码不存在'}) + return JsonResponse({'status':False,'data':_('注册码不存在')}) except: - return JsonResponse({'status':False,'data':'系统异常'}) + return JsonResponse({'status':False,'data':_('系统异常')}) else: - return JsonResponse({'status':False,'data':'类型错误'}) + return JsonResponse({'status':False,'data':_('类型错误')}) else: - return JsonResponse({'status': False,'data':'方法错误'}) + return JsonResponse({'status': False,'data':_('方法错误')}) # 普通用户修改密码 @@ -695,15 +695,15 @@ def change_pwd(request): user = User.objects.get(id=request.user.id) user.set_password(password) user.save() - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) else: - return JsonResponse({'status':False,'data':'密码不得少于6位数'}) + return JsonResponse({'status':False,'data':_('密码不得少于6位数')}) else: - return JsonResponse({'status':False,'data':'两个密码不一致'}) + return JsonResponse({'status':False,'data':_('两个密码不一致')}) except Exception as e: - return JsonResponse({'status':False,'data':'修改出错'}) + return JsonResponse({'status':False,'data':_('修改出错')}) else: - return HttpResponse('方法错误') + return HttpResponse(_('方法错误')) # 后台管理 - 应用设置 @@ -827,7 +827,6 @@ def admin_setting(request): defaults={'value':enable_login_check_code,'types':'basic'} ) - return render(request,'app_admin/admin_setting.html',locals()) # 邮箱设置 elif types == 'email': @@ -948,69 +947,69 @@ def admin_center_menu(request): menu_data = [ { "id": 1, - "title": "仪表盘", + "title": _("仪表盘"), "type": 1, "icon": "layui-icon layui-icon-console", "href": reverse('admin_overview'), }, { "id": 2, - "title": "文集管理", + "title": _("文集管理"), "type": 1, "icon": "layui-icon layui-icon-list", "href": reverse('project_manage'), }, { "id": 3, - "title": "文档管理", + "title": _("文档管理"), "type": 1, "icon": "layui-icon layui-icon-form", "href": reverse('doc_manage'), }, { "id": 4, - "title": "文档模板管理", + "title": _("文档模板管理"), "type": 1, "icon": "layui-icon layui-icon-templeate-1", "href": reverse('doctemp_manage'), }, { "id": 5, - "title": "注册码管理", + "title": _("注册码管理"), "type": 1, "icon": "layui-icon layui-icon-component", "href": reverse('register_code_manage'), }, { "id": 6, - "title": "用户管理", + "title": _("用户管理"), "type": 1, "icon": "layui-icon layui-icon-user", "href": reverse('user_manage'), }, { "id": 7, - "title": "站点设置", + "title": _("站点设置"), "type": 1, "icon": "layui-icon layui-icon-set", "href": reverse('sys_setting'), }, { "id": "common", - "title": "使用帮助", + "title": _("使用帮助"), "icon": "layui-icon layui-icon-template-1", "type": 0, "href": "", "children": [{ "id": 701, - "title": "安装说明", + "title": _("安装说明"), "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_blank", "href": "http://mrdoc.zmister.com/project-7/" }, { "id": 702, - "title": "使用说明", + "title": _("使用说明"), "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_blank", diff --git a/app_api/auth_app.py b/app_api/auth_app.py index 4b7bb69..fa2f1bf 100644 --- a/app_api/auth_app.py +++ b/app_api/auth_app.py @@ -5,6 +5,7 @@ # 博客地址:zmister.com from django.contrib.auth.models import User +from django.utils.translation import gettext_lazy as _ from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from app_api.models import * @@ -45,8 +46,8 @@ class AppMustAuth(BaseAuthentication): # token 是有效的,返回一个元组 return user_obj.user, token # request.user, request.auth else: - raise AuthenticationFailed('无效的token') + raise AuthenticationFailed(_('无效的token')) # return None else: - raise AuthenticationFailed('请求的URL中必须携带token参数') + raise AuthenticationFailed(_('请求的URL中必须携带token参数')) # return None \ No newline at end of file diff --git a/app_api/permissions_app.py b/app_api/permissions_app.py index cd53f50..efe394a 100644 --- a/app_api/permissions_app.py +++ b/app_api/permissions_app.py @@ -8,7 +8,7 @@ from rest_framework.permissions import BasePermission,SAFE_METHODS class AppPermission(BasePermission): - message = '只有VIP才能访问' + message = _('只有VIP才能访问') def has_permission(self, request, view): # vip才有访问权限 diff --git a/app_api/views.py b/app_api/views.py index 70e8eba..3f4922a 100644 --- a/app_api/views.py +++ b/app_api/views.py @@ -4,16 +4,17 @@ from django.views.decorators.csrf import csrf_exempt # CSRF装饰器 from django.views.decorators.http import require_http_methods,require_safe,require_GET from django.contrib.auth.decorators import login_required # 登录需求装饰器 from django.core.exceptions import PermissionDenied,ObjectDoesNotExist -from app_api.models import UserToken -from app_doc.models import Project,Doc,Image -import time,hashlib -import traceback,json from django.conf import settings -from app_doc.util_upload_img import upload_generation_dir,base_img_upload -from loguru import logger from django.contrib.auth import authenticate,login,logout # 认证相关方法 from django.contrib.auth.models import User # Django默认用户模型 from django.shortcuts import render,redirect +from django.utils.translation import gettext_lazy as _ +from app_doc.util_upload_img import upload_generation_dir,base_img_upload +from app_api.models import UserToken +from app_doc.models import Project,Doc,Image +from loguru import logger +import time,hashlib +import traceback,json # MrDoc 基于用户的Token访问API模块 # 用户通过该url获取服务器时间戳,便于接口访问 @@ -40,18 +41,18 @@ def oauth0(request): nowtime = int (time.time()) # 时间戳失效时间,默认为3600,可以改短,如30,严格点5秒,如果使用5秒,请求前,需要通过get_timestamp获取服务器时间戳,否则因为和服务器时间差导致无法验证通过 if (nowtime - int(timestamp)) > 3600 : - raise ValueError('链接已失效,请从合法路径访问,或联系管理员!') + raise ValueError(_('链接已失效,请从合法路径访问,或联系管理员!')) # 2、获取userid的Token user = User.objects.get(username=username) if user is None: - raise ValueError('请求用户出错!') + raise ValueError(_('请求用户出错!')) ID = user.id State = user.is_active if State == 1 and ID is not None: usertoken = UserToken.objects.get(user_id=ID) token = usertoken.token else: - raise ValueError('非法用户!') + raise ValueError(_('非法用户!')) # 3、 验证hash的正确性 final_str = str(randstr) + str(timestamp) + str(username) + token @@ -63,14 +64,14 @@ def oauth0(request): newurl = unquote(redirecturl) return redirect(newurl) else: - raise ValueError('验证失败,可能是用户名或Token不正确!详情请联系管理员!') + raise ValueError(_('验证失败,可能是用户名或Token不正确!详情请联系管理员!')) else: - raise ValueError('关键字验证失败,请联系管理员!部分关键字为空') + raise ValueError(_('关键字验证失败,请联系管理员!部分关键字为空')) except ValueError as e: errormsg = e return render(request, 'app_api/api404.html', locals()) except : - errormsg = "API接口运行出错!" + errormsg = _("API接口运行出错!") return render(request, 'app_api/api404.html', locals()) else: return JsonResponse({'status':False,'data':'Nothing Here'}) @@ -84,11 +85,10 @@ def manage_token(request): try: token = UserToken.objects.get(user=request.user).token # 查询用户Token except ObjectDoesNotExist: - token = '你还没有生成过Token!' + token = _('你还没有生成过Token!') except: if settings.DEBUG: - print(traceback.print_exc()) - logger.exception("Token管理页面异常") + logger.exception(_("Token管理页面异常")) return render(request,'app_api/manage_token.html',locals()) elif request.method == 'POST': try: @@ -105,8 +105,8 @@ def manage_token(request): ) return JsonResponse({'status':True,'data':token_str}) except: - logger.exception("用户Token生成异常") - return JsonResponse({'status':False,'data':'生成出错,请重试!'}) + logger.exception(_("用户Token生成异常")) + return JsonResponse({'status':False,'data':_('生成出错,请重试!')}) # 获取文集 @@ -126,10 +126,10 @@ def get_projects(request): project_list.append(item) return JsonResponse({'status':True,'data':project_list}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'token无效'}) + return JsonResponse({'status':False,'data':_('token无效')}) except: - logger.exception("token获取文集异常") - return JsonResponse({'status':False,'data':'系统异常'}) + logger.exception(_("token获取文集异常")) + return JsonResponse({'status':False,'data':_('系统异常')}) # 获取文集下的文档列表 @@ -154,10 +154,10 @@ def get_docs(request): doc_list.append(item) return JsonResponse({'status': True, 'data': doc_list}) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': 'token无效'}) + return JsonResponse({'status': False, 'data': _('token无效')}) except: - logger.exception("token获取文集异常") - return JsonResponse({'status': False, 'data': '系统异常'}) + logger.exception(_("token获取文集异常")) + return JsonResponse({'status': False, 'data': _('系统异常')}) # 获取单篇文档 @@ -181,10 +181,10 @@ def get_doc(request): } return JsonResponse({'status': True, 'data': item}) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': 'token无效'}) + return JsonResponse({'status': False, 'data': _('token无效')}) except: logger.exception("token获取文集异常") - return JsonResponse({'status': False, 'data': '系统异常'}) + return JsonResponse({'status': False, 'data': _('系统异常')}) # 新建文集 @@ -206,10 +206,10 @@ def create_project(request): ) return JsonResponse({'status': True, 'data': 'ok'}) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': 'token无效'}) + return JsonResponse({'status': False, 'data': _('token无效')}) except: - logger.exception("token创建文集异常") - return JsonResponse({'status':False,'data':'系统异常'}) + logger.exception(_("token创建文集异常")) + return JsonResponse({'status':False,'data':_('系统异常')}) # 新建文档 @@ -237,12 +237,12 @@ def create_doc(request): ) return JsonResponse({'status': True, 'data': 'ok'}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': 'token无效'}) + return JsonResponse({'status': False, 'data': _('token无效')}) except: - logger.exception("token创建文档异常") - return JsonResponse({'status':False,'data':'系统异常'}) + logger.exception(_("token创建文档异常")) + return JsonResponse({'status':False,'data':_('系统异常')}) # 上传图片 @@ -263,7 +263,7 @@ def upload_img(request): return JsonResponse(result) # return HttpResponse(json.dumps(result), content_type="application/json") except ObjectDoesNotExist: - return JsonResponse({'success': 0, 'data': 'token无效'}) + return JsonResponse({'success': 0, 'data': _('token无效')}) except: - logger.exception("token上传图片异常") - return JsonResponse({'success':0,'data':'上传出错'}) \ No newline at end of file + logger.exception(_("token上传图片异常")) + return JsonResponse({'success':0,'data':_('上传出错')}) \ No newline at end of file diff --git a/app_api/views_app.py b/app_api/views_app.py index e74fc66..15b9ba5 100644 --- a/app_api/views_app.py +++ b/app_api/views_app.py @@ -10,6 +10,7 @@ from django.contrib.auth import authenticate from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q from django.conf import settings +from django.utils.translation import gettext_lazy as _ from rest_framework.views import APIView from app_api.models import AppUserToken from rest_framework.response import Response @@ -86,12 +87,12 @@ class LoginView(APIView): res['username'] = username else: res['code'] = 2 - res["error"] = '账号被禁用' + res["error"] = _('账号被禁用') else: # 登陆失败 res["code"] = 1 - res["error"] = "用户名或密码错误" + res["error"] = _("用户名或密码错误") return Response(res) @@ -337,16 +338,16 @@ class ProjectView(APIView): return Response(resp) else: resp['code'] = 5 - resp['data'] = '参数不正确' + resp['data'] = _('参数不正确') return Response(resp) except Exception as e: - logger.exception("创建文集出错") + logger.exception(_("创建文集出错")) resp['code'] = 4 - resp['data'] = '系统异常请稍后再试' + resp['data'] = _('系统异常请稍后再试') return Response(resp) else: resp['code'] = 6 - resp['data'] = '请登录后操作' + resp['data'] = _('请登录后操作') return Response(resp) # 修改文集 @@ -372,14 +373,14 @@ class ProjectView(APIView): # return Response(resp) else: resp['code'] = 2 - resp['data'] = '非法请求' + resp['data'] = _('非法请求') # return Response(resp) except ObjectDoesNotExist: resp['code'] = 1 - resp['data'] = '资源未找到' + resp['data'] = _('资源未找到') # return Response(resp) except Exception as e: - logger.exception("修改文集出错") + logger.exception(_("修改文集出错")) resp['code'] = 4 # return Response(resp) else: @@ -409,14 +410,14 @@ class ProjectView(APIView): # return Response(resp) else: resp['code'] = 5 - resp['data'] = '参数错误' + resp['data'] = _('参数错误') # return Response(resp) except ObjectDoesNotExist: resp['code'] = 1 - resp['data'] = '资源未找到' + resp['data'] = _('资源未找到') # return Response(resp) except Exception as e: - logger.exception("API文集删除异常") + logger.exception(_("API文集删除异常")) resp['code'] = 4 # return Response(resp) else: @@ -481,7 +482,7 @@ class DocView(APIView): resp = {'code':0,'data':serializer.data} return Response(resp) elif doc_format == 'html': - logger.info("返回HTML") + logger.info(_("返回HTML")) # return Response({'status':'html'}) return render(request,'app_api/single_doc_detail.html',locals()) else: @@ -532,12 +533,12 @@ class DocView(APIView): ) return Response({'code':0,'data':{'pro':project,'doc':doc.id}}) else: - return Response({'code':2,'data':'无权操作此文集'}) + return Response({'code':2,'data':_('无权操作此文集')}) else: - return Response({'code':5,'data':'请确认文档标题、文集正确'}) + return Response({'code':5,'data':_('请确认文档标题、文集正确')}) except Exception as e: - logger.exception("api新建文档异常") - return Response({'status':4,'data':'请求出错'}) + logger.exception(_("api新建文档异常")) + return Response({'status':4,'data':_('请求出错')}) # 修改文档 def put(self, request): @@ -572,14 +573,14 @@ class DocView(APIView): modify_time = datetime.datetime.now(), status = status ) - return Response({'code': 0,'data':'修改成功'}) + return Response({'code': 0,'data':_('修改成功')}) else: - return Response({'code':2,'data':'未授权请求'}) + return Response({'code':2,'data':_('未授权请求')}) else: - return Response({'code': 5,'data':'参数错误'}) + return Response({'code': 5,'data':_('参数错误')}) except Exception as e: - logger.exception("api修改文档出错") - return Response({'code':4,'data':'请求出错'}) + logger.exception(_("api修改文档出错")) + return Response({'code':4,'data':_('请求出错')}) # 删除文档 def delete(self, request): @@ -611,14 +612,14 @@ class DocView(APIView): Doc.objects.filter(parent_doc__in=chr_doc_ids).update(status=3, modify_time=datetime.datetime.now()) # 修改下级文档的下级文档状态 - return Response({'code': 0, 'data': '删除完成'}) + return Response({'code': 0, 'data': _('删除完成')}) else: - return Response({'code': 2, 'data': '非法请求'}) + return Response({'code': 2, 'data': _('非法请求')}) else: - return Response({'code': 5, 'data': '参数错误'}) + return Response({'code': 5, 'data': _('参数错误')}) except Exception as e: - logger.exception("api删除文档出错") - return Response({'code': 4, 'data': '请求出错'}) + logger.exception(_("api删除文档出错")) + return Response({'code': 4, 'data': _('请求出错')}) # 文档模板视图 @@ -635,7 +636,7 @@ class DocTempView(APIView): serializer = DocTempSerializer(doctemp) resp = {'code': 0, 'data': serializer.data} else: - resp = {'code':2,'data':'无权操作'} + resp = {'code':2,'data':_('无权操作')} else: doctemps = DocTemp.objects.filter(create_user=request.user) page = PageNumberPagination() @@ -644,7 +645,7 @@ class DocTempView(APIView): resp = {'code':0,'data':serializer.data,'count':doctemps.count()} return Response(resp) else: - return Response({'code': 6, 'data': '请登录'}) + return Response({'code': 6, 'data': _('请登录')}) def post(self, request): try: @@ -658,14 +659,14 @@ class DocTempView(APIView): create_user=request.user ) doctemp.save() - return Response({'code':0,'data':'创建成功'}) + return Response({'code':0,'data':_('创建成功')}) else: - return Response({'code':5,'data':'模板标题不能为空'}) + return Response({'code':5,'data':_('模板标题不能为空')}) else: - return Response({'code':6,'data':'请登录'}) + return Response({'code':6,'data':_('请登录')}) except Exception as e: - logger.exception("api创建文档模板出错") - return Response({'code':4,'data':'请求出错'}) + logger.exception(_("api创建文档模板出错")) + return Response({'code':4,'data':_('请求出错')}) def put(self, request): try: @@ -679,14 +680,14 @@ class DocTempView(APIView): doctemp.name = name doctemp.content = content doctemp.save() - return Response({'code':0,'data':'修改成功'}) + return Response({'code':0,'data':_('修改成功')}) else: - return Response({'code':2,'data':'非法操作'}) + return Response({'code':2,'data':_('非法操作')}) else: - return Response({'code':5,'data':'参数错误'}) + return Response({'code':5,'data':_('参数错误')}) except Exception as e: - logger.exception("api修改文档模板出错") - return Response({'code':4,'data':'请求出错'}) + logger.exception(_("api修改文档模板出错")) + return Response({'code':4,'data':_('请求出错')}) def delete(self, request): try: @@ -695,14 +696,14 @@ class DocTempView(APIView): doctemp = DocTemp.objects.get(id=doctemp_id) if request.user == doctemp.create_user: doctemp.delete() - return Response({'code': 0, 'data': '删除完成'}) + return Response({'code': 0, 'data': _('删除完成')}) else: - return Response({'code': 2, 'data': '非法请求'}) + return Response({'code': 2, 'data': _('非法请求')}) else: - return Response({'code': 5, 'data': '参数错误'}) + return Response({'code': 5, 'data': _('参数错误')}) except Exception as e: - logger.exception("api删除文档模板出错") - return Response({'code': 4, 'data': '请求出错'}) + logger.exception(_("api删除文档模板出错")) + return Response({'code': 4, 'data': _('请求出错')}) # 图片视图 @@ -742,7 +743,7 @@ class ImageView(APIView): result = base_img_upload(base_img, dir_name, request.user) resp = {'code': 0, 'data': result['url']} else: - resp = {"code": 5, "message": "出错信息"} + resp = {"code": 5, "message": _("出错信息")} return Response(resp) # 删除 @@ -750,7 +751,7 @@ class ImageView(APIView): img_id = request.data.get('id', '') img = Image.objects.get(id=img_id) if img.user != request.user: - return Response({'code': 2, 'data': '未授权请求'}) + return Response({'code': 2, 'data': _('未授权请求')}) file_path = settings.BASE_DIR + img.file_path is_exist = os.path.exists(file_path) if is_exist: @@ -768,8 +769,8 @@ class ImageGroupView(APIView): group_list = [] all_cnt = Image.objects.filter(user=request.user).count() non_group_cnt = Image.objects.filter(group_id=None,user=request.user).count() - group_list.append({'group_name': '全部图片', 'group_cnt': all_cnt, 'group_id': 0}) - group_list.append({'group_name': '未分组', 'group_cnt': non_group_cnt, 'group_id': -1}) + group_list.append({'group_name': _('全部图片'), 'group_cnt': all_cnt, 'group_id': 0}) + group_list.append({'group_name': _('未分组'), 'group_cnt': non_group_cnt, 'group_id': -1}) groups = ImageGroup.objects.filter(user=request.user) # 查询所有分组 for group in groups: group_cnt = Image.objects.filter(group_id=group).count() @@ -781,27 +782,27 @@ class ImageGroupView(APIView): group_list.append(item) return Response({'code': 0, 'data': group_list}) except: - return Response({'code': 4, 'data': '出现错误'}) + return Response({'code': 4, 'data': _('出现错误')}) def post(self, request): group_name = request.data.get('group_name', '') - if group_name not in ['', '默认分组', '未分组']: + if group_name not in ['', _('默认分组'), _('未分组')]: ImageGroup.objects.create( user=request.user, group_name=group_name ) return Response({'code': 0, 'data': 'ok'}) else: - return Response({'code': 5, 'data': '名称无效'}) + return Response({'code': 5, 'data': _('名称无效')}) def put(self, request): group_name = request.data.get("group_name", '') - if group_name not in ['', '默认分组', '未分组']: + if group_name not in ['', _('默认分组'), _('未分组')]: group_id = request.POST.get('group_id', '') ImageGroup.objects.filter(id=group_id,user=request.user).update(group_name=group_name) return Response({'code': 0, 'data': 'ok'}) else: - return Response({'code': 5, 'data': '名称无效'}) + return Response({'code': 5, 'data': _('名称无效')}) def delete(self, request): try: @@ -811,7 +812,7 @@ class ImageGroupView(APIView): group.delete() # 删除分组 return Response({'code': 0, 'data': 'ok'}) except: - return Response({'code': 4, 'data': '删除错误'}) + return Response({'code': 4, 'data': _('删除错误')}) # 附件视图 @@ -864,7 +865,7 @@ class AttachmentView(APIView): attachment_size = self.sizeFormat(attachment.size) # 限制附件大小在50mb以内 if attachment.size > 52428800: - return Response({'code': False, 'data': '文件大小超出限制'}) + return Response({'code': False, 'data': _('文件大小超出限制')}) # 限制附件为ZIP格式文件 if attachment_name.endswith('.zip'): a = Attachment.objects.create( @@ -875,9 +876,9 @@ class AttachmentView(APIView): ) return Response({'code': 0, 'data': {'name': attachment_name, 'url': a.file_path.name}}) else: - return Response({'code': 5, 'data': '不支持的格式'}) + return Response({'code': 5, 'data': _('不支持的格式')}) else: - return Response({'code': 5, 'data': '无效文件'}) + return Response({'code': 5, 'data': _('无效文件')}) def delete(self, request): attach_id = request.data.get('attach_id', '') diff --git a/app_doc/import_utils.py b/app_doc/import_utils.py index 956b6af..3b3b36a 100644 --- a/app_doc/import_utils.py +++ b/app_doc/import_utils.py @@ -5,7 +5,7 @@ # 博客地址:zmister.com # 文集导入相关方法 - +from django.utils.translation import gettext_lazy as _ from app_doc.models import Doc,Project,Image from app_doc.util_upload_img import upload_generation_dir from django.db import transaction @@ -93,7 +93,7 @@ class ImportZipProject(): except: - logger.error("未发现yaml文件") + logger.error(_("未发现yaml文件")) project_name = zip_file_path[:-4].split('/')[-1] project_desc = '' project_role = 1 @@ -147,7 +147,7 @@ class ImportZipProject(): create_user=create_user ) except: - logger.exception("解析导入文件异常") + logger.exception(_("解析导入文件异常")) # 回滚事务 transaction.savepoint_rollback(save_id) @@ -157,7 +157,7 @@ class ImportZipProject(): os.remove(zip_file_path) return project.id except: - logger.exception("删除临时文件异常") + logger.exception(_("删除临时文件异常")) return None # 处理MD内容中的静态文件 @@ -201,7 +201,7 @@ class ImportZipProject(): user=create_user, file_path=new_media_filename, file_name=str(time.time())+'.'+file_suffix, - remark='本地上传', + remark=_('本地上传'), ) md_content = md_content.replace(media_filename, new_media_filename) else: @@ -238,7 +238,7 @@ class ImportDocxDoc(): user=self.create_user, file_path=new_media_filename, file_name=file_time_name + '.' + file_suffix, - remark='本地上传', + remark=_('本地上传'), ) with open(new_media_file_path, 'wb') as f: f.write(image_bytes.read()) @@ -266,7 +266,7 @@ class ImportDocxDoc(): return {'status':True,'data':result} except: os.remove(self.docx_file_path) - return {'status':False,'data':'读取异常'} + return {'status':False,'data':_('读取异常')} if __name__ == '__main__': imp = ImportZipProject() diff --git a/app_doc/report_html2pdf.py b/app_doc/report_html2pdf.py index c05ffa3..6f86fee 100644 --- a/app_doc/report_html2pdf.py +++ b/app_doc/report_html2pdf.py @@ -12,6 +12,7 @@ from selenium.webdriver.support.expected_conditions import staleness_of from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.utils import ChromeType from django.conf import settings +from django.utils.translation import gettext_lazy as _ import sys import json import base64 diff --git a/app_doc/report_utils.py b/app_doc/report_utils.py index 7f77c16..7fbc050 100644 --- a/app_doc/report_utils.py +++ b/app_doc/report_utils.py @@ -5,6 +5,7 @@ # 博客地址:zmister.com # MrDoc文集文档导出相关功能代码 from django.conf import settings +from django.utils.translation import gettext_lazy as _ import subprocess import datetime,time import re @@ -172,6 +173,48 @@ class ReportMD(): return md_content +# 批量导出文集Markdown压缩包 +class ReportMdBetch(): + def __init__(self,username,project_id_list): + self.project_list = project_id_list + self.username = username + # 判断MD导出临时文件夹是否存在 + if os.path.exists(settings.MEDIA_ROOT + "/reportmd_temp") is False: + os.mkdir(settings.MEDIA_ROOT + "/reportmd_temp") + + # 判断用户名+日期文件夹是否存在 + self.report_file_path = settings.MEDIA_ROOT + "/reportmd_temp/{}_{}".format( + self.username,datetime.datetime.strftime(datetime.datetime.now(),"%y%m%d%H%M%S") + ) + is_fold = os.path.exists(self.report_file_path) + if is_fold is False: + os.mkdir(self.report_file_path) + + def work(self): + # 遍历文集列表,打包每一个文集 + project_file_list = [] + for project_id in self.project_list: + report_func = ReportMD(project_id=project_id) + report_project_zip = report_func.work() + project_file_list.append(report_project_zip) + + # 遍历打包好的文集列表,将其移入统一文件夹 + for file in project_file_list: + shutil.move(file,self.report_file_path) + + # 压缩打包文集合集文件夹 + md_file = shutil.make_archive( + base_name=self.report_file_path, + format='zip', + root_dir=self.report_file_path + ) + # print(md_file) + # 删除文件夹 + shutil.rmtree(self.report_file_path) + + return "{}.zip".format(self.report_file_path) + + # 导出EPUB @logger.catch() class ReportEPUB(): @@ -224,7 +267,7 @@ class ReportEPUB(): for iframe in iframe_tag: iframe_src = iframe.get('src') iframe.name = 'p' - iframe.string = "本格式不支持iframe视频显示,视频地址为:{}".format(iframe_src) + iframe.string = _("本格式不支持iframe视频显示,视频地址为:{}".format(iframe_src)) # 替换HTML文本中静态文件的相对链接为绝对链接 for src in src_tag: @@ -255,7 +298,7 @@ class ReportEPUB(): 'id': 0, 'link': 'Text/toc_summary.xhtml', 'pid': 0, - 'title': '目录' + 'title': _('目录') } ] nav_str = '''''' @@ -770,7 +813,7 @@ class ReportPDF(): try: convert('file://'+temp_file_path,report_file_path) except: - logger.exception("生成PDF出错") + logger.exception(_("生成PDF出错")) return False # 处理PDF文件 if os.path.exists(report_file_path): diff --git a/app_doc/templatetags/doc_filter.py b/app_doc/templatetags/doc_filter.py index 4211254..926ebdd 100644 --- a/app_doc/templatetags/doc_filter.py +++ b/app_doc/templatetags/doc_filter.py @@ -1,7 +1,9 @@ # coding:utf-8 # 文档自定义模板过滤器 -from app_doc.models import * + from django import template +from django.utils.translation import gettext_lazy as _ +from app_doc.models import * import re register = template.Library() @@ -27,7 +29,7 @@ def is_colla_pro(pro,user): if p.exists(): return '' else: - return '【协作】' + return _('【协作】') # 获取文档的上级文档名称 @register.filter(name='get_doc_parent') @@ -35,7 +37,7 @@ def get_doc_parent(value): if int(value) != 0: return Doc.objects.get(id=int(value)) else: - return '无上级文档' + return _('无上级文档') # 获取文档的下一篇文档 @register.filter(name='get_doc_next') @@ -91,8 +93,7 @@ def get_doc_next(value): # print("下一篇:", next_doc.id, next_doc) return next_doc.id except Exception as e: - import traceback - print(traceback.print_exc()) + pass # 获取文档的上一篇文档 @register.filter(name='get_doc_previous') diff --git a/app_doc/templatetags/project_filter.py b/app_doc/templatetags/project_filter.py index 3db4d7d..ecb49db 100644 --- a/app_doc/templatetags/project_filter.py +++ b/app_doc/templatetags/project_filter.py @@ -2,6 +2,7 @@ # 文档自定义模板过滤器 from app_doc.models import * from django import template +from django.utils.translation import gettext_lazy as _ register = template.Library() @@ -16,7 +17,7 @@ def get_doc_count(value): def get_new_doc(value): new_doc = Doc.objects.filter(top_doc=int(value),status=1).order_by('-modify_time')[:3] if new_doc is None: - new_doc = '它还没有文档……' + new_doc = _('它还没有文档……') return new_doc # 获取文集的EPUB开放导出状态 diff --git a/app_doc/util_upload_img.py b/app_doc/util_upload_img.py index 6fc5b63..abe09b9 100644 --- a/app_doc/util_upload_img.py +++ b/app_doc/util_upload_img.py @@ -3,6 +3,7 @@ from django.http import HttpResponse from django.conf import settings from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required # 登录需求装饰器 +from django.utils.translation import gettext_lazy as _ import datetime,time,json,base64,os,uuid from app_doc.models import Image,ImageGroup,Attachment from app_admin.models import SysSetting @@ -53,7 +54,7 @@ def ice_save_file(file_obj,user): # 判断附件格式 is_images = ["jpg", "jpeg", "gif", "png", "bmp", "webp"] if file_suffix.lower() not in allow_suffix: - return {"error": "文件格式不允许"} + return {"error": _("文件格式不允许")} if file_suffix.lower() == 'blob': # 粘贴上传直接默认为png就行 file_suffix = 'png' @@ -77,7 +78,7 @@ def ice_save_file(file_obj,user): user=user, file_path=file_url, file_name=file_name, - remark="iceEditor上传" + remark=_("iceEditor上传") ) else : @@ -90,7 +91,7 @@ def ice_save_file(file_obj,user): ) return {"error":0, "name": str(file_obj),'url':file_url} - return {"error": "文件存储异常"} + return {"error": _("文件存储异常")} # ice_url图片上传 @@ -118,7 +119,7 @@ def ice_url_img_upload(url,user): user=user, file_path=file_url, file_name=file_name, - remark='iceurl粘贴上传', + remark=_('iceurl粘贴上传'), ) resp_data = {"error":0, "name": file_name,'url':file_url} return resp_data @@ -165,7 +166,7 @@ def upload_img(request): else: result = url_img_upload(url_img,dir_name,request.user) else: - result = {"success": 0, "message": "上传出错"} + result = {"success": 0, "message": _("上传出错")} return HttpResponse(json.dumps(result), content_type="application/json") @@ -187,7 +188,7 @@ def img_upload(files, dir_name, user, group_id=None): file_suffix = files.name.split(".")[-1] # 提取图片格式 # 判断图片格式 if file_suffix.lower() not in allow_suffix: - return {"success": 0, "message": "图片格式不正确"} + return {"success": 0, "message": _("图片格式不正确")} # 判断图片的大小 try: @@ -197,7 +198,7 @@ def img_upload(files, dir_name, user, group_id=None): # print(repr(e)) allow_img_size = 10485760 if files.size > allow_img_size: - return {"success": 0, "message": "图片大小超出{}MB".format(allow_img_size / 1048576)} + return {"success": 0, "message": _("图片大小超出{}MB".format(allow_img_size / 1048576))} relative_path = upload_generation_dir(dir_name) file_name = files.name.replace(file_suffix,'').replace('.','') + '_' +str(int(time.time())) + '.' + file_suffix @@ -213,10 +214,10 @@ def img_upload(files, dir_name, user, group_id=None): user=user, file_path=file_url, file_name=file_name, - remark='本地上传', + remark=_('本地上传'), group = group_id, ) - return {"success": 1, "url": file_url,'message':'上传图片成功'} + return {"success": 1, "url": file_url,'message':_('上传图片成功')} # base64编码图片上传 @@ -236,9 +237,9 @@ def base_img_upload(files,dir_name, user): user = user, file_path = file_url, file_name=file_name, - remark = '粘贴上传', + remark = _('粘贴上传'), ) - return {"success": 1, "url": file_url, 'message': '上传图片成功'} + return {"success": 1, "url": file_url, 'message': _('上传图片成功')} # url图片上传 @@ -263,7 +264,7 @@ def url_img_upload(url,dir_name,user): user=user, file_path=file_url, file_name=file_name, - remark='粘贴上传', + remark=_('粘贴上传'), ) resp_data = { 'msg': '', diff --git a/app_doc/views.py b/app_doc/views.py index 5e200f7..2209779 100644 --- a/app_doc/views.py +++ b/app_doc/views.py @@ -14,6 +14,7 @@ from django.contrib.auth.models import User from django.db.models import Q from django.db import transaction from django.utils.html import strip_tags +from django.utils.translation import gettext_lazy as _ from loguru import logger from app_doc.report_utils import * from app_admin.models import UserOptions,SysSetting @@ -302,11 +303,11 @@ def create_project(request): project.save() return JsonResponse({'status':True,'data':{'id':project.id,'name':project.name,'role':project.role}}) else: - return JsonResponse({'status':False,'data':'文集名称不能为空!'}) + return JsonResponse({'status':False,'data':_('文集名称不能为空!')}) except Exception as e: - logger.exception("创建文集出错") - return JsonResponse({'status':False,'data':'出现异常,请检查输入值!'}) + logger.exception(_("创建文集出错")) + return JsonResponse({'status':False,'data':_('出现异常,请检查输入值!')}) # 文集页 @require_http_methods(['GET']) @@ -383,7 +384,7 @@ def project_index(request,pro_id): return render(request,'app_doc/project_doc_search.html',locals()) return render(request, 'app_doc/project.html', locals()) except Exception as e: - logger.exception("文集页访问异常") + logger.exception(_("文集页访问异常")) return render(request,'404.html') @@ -421,12 +422,12 @@ def modify_project(request): project.is_watermark = is_watermark project.watermark_value = watermark_value project.save() - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) except Exception as e: - logger.exception("修改文集出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("修改文集出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 修改文集权限 @@ -470,7 +471,7 @@ def modify_project_role(request,pro_id): # return render(request, 'app_doc/manage/manage_project_role.html', locals()) return JsonResponse({'status':True,'data':'ok'}) except: - return JsonResponse({'status':False,'data':'出错'}) + return JsonResponse({'status':False,'data':_('出错')}) else: return Http404 @@ -492,10 +493,10 @@ def check_viewcode(request): obj.set_cookie('viewcode-{}'.format(project_id),viewcode) return obj else: - errormsg = "访问码错误" + errormsg = _("访问码错误") return render(request, 'app_doc/check_viewcode.html', locals()) except Exception as e: - logger.exception("验证文集访问码出错") + logger.exception(_("验证文集访问码出错")) return render(request,'404.html') @@ -521,7 +522,7 @@ def del_project(request): pro.delete() return JsonResponse({'status':True}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) elif range == 'multi': pros = pro_id.split(",") try: @@ -536,15 +537,15 @@ def del_project(request): projects.delete() return JsonResponse({'status': True, 'data': 'ok'}) except Exception: - logger.exception("异常") - return JsonResponse({'status': False, 'data': '无指定内容'}) + logger.exception(_("异常")) + return JsonResponse({'status': False, 'data': _('无指定内容')}) else: - return JsonResponse({'status': False, 'data': '类型错误'}) + return JsonResponse({'status': False, 'data': _('类型错误')}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) except Exception as e: - logger.exception("删除文集出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("删除文集出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 管理文集 @@ -672,12 +673,12 @@ def manage_project_doc_sort(request,pro_id): try: sort_data = json.loads(sort_data) except Exception: - return JsonResponse({'status': False, 'data': '文档参数错误'}) + return JsonResponse({'status': False, 'data': _('文档参数错误')}) try: pro = Project.objects.get(id=project_id) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': '没有匹配的文集'}) + return JsonResponse({'status': False, 'data': _('没有匹配的文集')}) # 查询文集的协作者 pro_colla = ProjectCollaborator.objects.filter(project=pro, user=request.user, role=1) @@ -704,7 +705,7 @@ def manage_project_doc_sort(request,pro_id): return JsonResponse({'status': True, 'data': 'ok'}) else: - return JsonResponse({'status':False,'data':'无权操作'}) + return JsonResponse({'status':False,'data':_('无权操作')}) # 修改文集前台下载权限 @login_required() @@ -772,7 +773,7 @@ def manage_project_collaborator(request,pro_id): try: types = int(types) except: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) # 添加文集协作者 if int(types) == 0: colla_user = request.POST.get('username','') @@ -780,18 +781,18 @@ def manage_project_collaborator(request,pro_id): user = User.objects.filter(username=colla_user) if user.exists(): if user[0] == project[0].create_user: # 用户为文集的创建者 - return JsonResponse({'status':False,'data':'文集创建者无需添加'}) + return JsonResponse({'status':False,'data':_('文集创建者无需添加')}) elif ProjectCollaborator.objects.filter(user=user[0],project=project[0]).exists(): - return JsonResponse({'status':False,'data':'用户已存在'}) + return JsonResponse({'status':False,'data':_('用户已存在')}) else: ProjectCollaborator.objects.create( project = project[0], user = user[0], role = role if role in ['1',1] else 0 ) - return JsonResponse({'status':True,'data':'添加成功'}) + return JsonResponse({'status':True,'data':_('添加成功')}) else: - return JsonResponse({'status':False,'data':'用户不存在'}) + return JsonResponse({'status':False,'data':_('用户不存在')}) # 删除文集协作者 elif int(types) == 1: username = request.POST.get('username','') @@ -799,10 +800,10 @@ def manage_project_collaborator(request,pro_id): user = User.objects.get(username=username) pro_colla = ProjectCollaborator.objects.get(project=project[0],user=user) pro_colla.delete() - return JsonResponse({'status':True,'data':'删除成功'}) + return JsonResponse({'status':True,'data':_('删除成功')}) except: - logger.exception("删除协作者出错") - return JsonResponse({'status':False,'data':'删除出错'}) + logger.exception(_("删除协作者出错")) + return JsonResponse({'status':False,'data':_('删除出错')}) # 修改协作权限 elif int(types) == 2: username = request.POST.get('username', '') @@ -811,13 +812,13 @@ def manage_project_collaborator(request,pro_id): user = User.objects.get(username=username) pro_colla = ProjectCollaborator.objects.filter(project=project[0], user=user) pro_colla.update(role=role) - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) except: - logger.exception("修改协作权限出错") - return JsonResponse({'status':False,'data':'修改失败'}) + logger.exception(_("修改协作权限出错")) + return JsonResponse({'status':False,'data':_('修改失败')}) else: - return JsonResponse({'status':False,'data':'无效的类型'}) + return JsonResponse({'status':False,'data':_('无效的类型')}) # 我协作的文集 @@ -857,7 +858,7 @@ def manage_project_transfer(request,pro_id): return JsonResponse({'status':True,'data':'ok'}) except: - return JsonResponse({'status':False,'data':'用户不存在'}) + return JsonResponse({'status':False,'data':_('用户不存在')}) # 文档浏览页 @@ -921,7 +922,7 @@ def doc(request,pro_id,doc_id): if doc.status == 0 and doc.create_user != request.user: raise ObjectDoesNotExist elif doc.status == 0 and doc.create_user == request.user: - doc.name = '【预览草稿】'+ doc.name + doc.name = _('【预览草稿】')+ doc.name except ObjectDoesNotExist: return render(request, '404.html') @@ -935,9 +936,9 @@ def doc(request,pro_id,doc_id): # project_docs = Doc.objects.filter(top_doc=doc.top_doc, parent_doc=0, status=1).order_by('sort') return render(request,'app_doc/doc.html',locals()) else: - return HttpResponse('参数错误') + return HttpResponse(_('参数错误')) except Exception as e: - logger.exception("文集浏览出错") + logger.exception(_("文集浏览出错")) return render(request,'404.html') @@ -959,14 +960,14 @@ def create_doc(request): editor_mode = int(eid) try: - editor_type = "新建文档" + editor_type = _("新建文档") pid = request.GET.get('pid',-999) project_list = Project.objects.filter(create_user=request.user) # 自己创建的文集列表 colla_project_list = ProjectCollaborator.objects.filter(user=request.user) # 协作的文集列表 doctemp_list = DocTemp.objects.filter(create_user=request.user).values('id','name','create_time') return render(request, 'app_doc/editor/create_doc.html', locals()) except Exception as e: - logger.exception("访问创建文档页面出错") + logger.exception(_("访问创建文档页面出错")) return render(request,'404.html') elif request.method == 'POST': try: @@ -1020,27 +1021,27 @@ def create_doc(request): return JsonResponse({'status': True, 'data': {'pro': project, 'doc': doc.id}}) except Exception as e: - logger.exception("创建文档异常") + logger.exception(_("创建文档异常")) # 回滚事务 transaction.savepoint_rollback(save_id) transaction.savepoint_commit(save_id) - return JsonResponse({'status': False, 'data': '创建失败'}) + return JsonResponse({'status': False, 'data': _('创建失败')}) else: - return JsonResponse({'status':False,'data':'无权操作此文集'}) + return JsonResponse({'status':False,'data':_('无权操作此文集')}) else: - return JsonResponse({'status':False,'data':'请确认文档标题、文集正确'}) + return JsonResponse({'status':False,'data':_('请确认文档标题、文集正确')}) except Exception as e: logger.exception("创建文档出错") - return JsonResponse({'status':False,'data':'请求出错'}) + return JsonResponse({'status':False,'data':_('请求出错')}) else: - return JsonResponse({'status':False,'data':'方法不允许'}) + return JsonResponse({'status':False,'data':_('方法不允许')}) # 修改文档 @login_required() @require_http_methods(['GET',"POST"]) def modify_doc(request,doc_id): - editor_type = "修改文档" + editor_type = _("修改文档") if request.method == 'GET': try: doc = Doc.objects.get(id=doc_id) # 查询文档信息 @@ -1071,7 +1072,7 @@ def modify_doc(request,doc_id): else: return render(request,'403.html') except Exception as e: - logger.exception("修改文档页面访问出错") + logger.exception(_("修改文档页面访问出错")) return render(request,'404.html') elif request.method == 'POST': try: @@ -1150,21 +1151,21 @@ def modify_doc(request,doc_id): tag = Tag.objects.get_or_create(name=t, create_user=request.user) DocTag.objects.get_or_create(tag=tag[0], doc=doc) - return JsonResponse({'status': True, 'data': '修改成功'}) + return JsonResponse({'status': True, 'data': _('修改成功')}) except: - logger.exception("修改文档异常") + logger.exception(_("修改文档异常")) # 回滚事务 transaction.savepoint_rollback(save_id) transaction.savepoint_commit(save_id) - return JsonResponse({'status': False, 'data': '修改失败'}) + return JsonResponse({'status': False, 'data': _('修改失败')}) else: - return JsonResponse({'status':False,'data':'未授权请求'}) + return JsonResponse({'status':False,'data':_('未授权请求')}) else: - return JsonResponse({'status': False,'data':'参数错误'}) + return JsonResponse({'status': False,'data':_('参数错误')}) except Exception as e: - logger.exception("修改文档出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("修改文档出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 删除文档 - 软删除 - 进入回收站 @@ -1183,7 +1184,7 @@ def del_doc(request): try: project = Project.objects.get(id=doc.top_doc) # 查询文档所属的文集 except ObjectDoesNotExist: - logger.error("文档{}的所属文集不存在。".format(doc_id)) + logger.error(_("文档{}的所属文集不存在。".format(doc_id))) project = 0 # 获取文档所属文集的协作信息 pro_colla = ProjectCollaborator.objects.filter(project=project,user=request.user) @@ -1208,25 +1209,25 @@ def del_doc(request): chr_doc.update(status=3,modify_time=datetime.datetime.now()) # 修改下级文档的状态为删除 Doc.objects.filter(parent_doc__in=chr_doc_ids).update(status=3,modify_time=datetime.datetime.now()) # 修改下级文档的下级文档状态 - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status': True, 'data': _('删除完成')}) else: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) elif range == 'multi': docs = doc_id.split(",") try: Doc.objects.filter(id__in=docs,create_user=request.user).update(status=3,modify_time=datetime.datetime.now()) Doc.objects.filter(parent_doc__in=docs).update(status=3,modify_time=datetime.datetime.now()) - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status': True, 'data': _('删除完成')}) except: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) else: - return JsonResponse({'status': False, 'data': '类型错误'}) + return JsonResponse({'status': False, 'data': _('类型错误')}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) except Exception as e: - logger.exception("删除文档出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("删除文档出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 管理文档 @@ -1338,20 +1339,20 @@ def move_doc(request): project = Project.objects.get(id=int(pro_id)) # 自己的文集 colla = ProjectCollaborator.objects.filter(project=project, user=request.user) # 协作文集 if (project.create_user is not request.user) and (colla.count()): # 请求者不是文集创建者和协作者返回错误 - return JsonResponse({'status':False,'data':'文集无权限'}) + return JsonResponse({'status':False,'data':_('文集无权限')}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文集不存在'}) + return JsonResponse({'status':False,'data':_('文集不存在')}) # 判断文档是否存在 try: doc = Doc.objects.get(id=int(doc_id),create_user=request.user) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文档不存在'}) + return JsonResponse({'status':False,'data':_('文档不存在')}) # 判断上级文档是否存在 try: if parent_id != '0': parent = Doc.objects.get(id=int(parent_id),create_user=request.user) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'上级文档不存在'}) + return JsonResponse({'status':False,'data':_('上级文档不存在')}) # 复制文档 if move_type == '0': copy_doc = Doc.objects.create( @@ -1376,8 +1377,8 @@ def move_doc(request): Doc.objects.filter(parent_doc=doc_id).update(parent_doc=0) return JsonResponse({'status':True,'data':{'pro_id':pro_id,'doc_id':doc_id}}) except: - logger.exception("移动文档异常") - return JsonResponse({'status':False,'data':'移动文档失败'}) + logger.exception(_("移动文档异常")) + return JsonResponse({'status':False,'data':_('移动文档失败')}) # 包含下级文档一起移动 elif move_type == '2': try: @@ -1391,10 +1392,10 @@ def move_doc(request): Doc.objects.filter(parent_doc=child.id).update(top_doc=int(pro_id)) return JsonResponse({'status': True, 'data':{'pro_id':pro_id,'doc_id':doc_id}}) except: - logger.exception("移动包含下级的文档异常") - return JsonResponse({'status': False, 'data': '移动文档失败'}) + logger.exception(_("移动包含下级的文档异常")) + return JsonResponse({'status': False, 'data': _('移动文档失败')}) else: - return JsonResponse({'status':False,'data':'移动类型错误'}) + return JsonResponse({'status':False,'data':_('移动类型错误')}) # 查看对比文档历史版本 @@ -1416,7 +1417,7 @@ def diff_doc(request,doc_id,his_id): else: return render(request, '403.html') except Exception as e: - logger.exception("文档历史版本页面访问出错") + logger.exception(_("文档历史版本页面访问出错")) return render(request, '404.html') elif request.method == 'POST': @@ -1429,12 +1430,12 @@ def diff_doc(request,doc_id,his_id): if history.doc == doc: return JsonResponse({'status':True,'data':history.pre_content}) else: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) except Exception as e: - logger.exception("文档历史版本获取出错") - return JsonResponse({'status':False,'data':'获取异常'}) + logger.exception(_("文档历史版本获取出错")) + return JsonResponse({'status':False,'data':_('获取异常')}) # 管理文档历史版本 @@ -1455,16 +1456,16 @@ def manage_doc_history(request,doc_id): historys = paginator.page(paginator.num_pages) return render(request, 'app_doc/manage/manage_doc_history.html', locals()) except Exception as e: - logger.exception("管理文档历史版本页面访问出错") + logger.exception(_("管理文档历史版本页面访问出错")) return render(request, '404.html') elif request.method == 'POST': try: history_id = request.POST.get('history_id','') DocHistory.objects.filter(id=history_id,doc=doc_id,create_user=request.user).delete() - return JsonResponse({'status':True,'data':'删除成功'}) + return JsonResponse({'status':True,'data':_('删除成功')}) except: - logger.exception("操作文档历史版本出错") - return JsonResponse({'status':False,'data':'出现异常'}) + logger.exception(_("操作文档历史版本出错")) + return JsonResponse({'status':False,'data':_('出现异常')}) # 文档回收站 @@ -1501,7 +1502,7 @@ def doc_recycle(request): else: colla_user_role = 0 except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': '文档不存在'}) + return JsonResponse({'status': False, 'data': _('文档不存在')}) # 如果请求用户为文档创建者、高级权限的协作者、文集的创建者,可以操作 if (request.user == doc.create_user) or (colla_user_role == 1) or (request.user == project.create_user): # 还原文档 @@ -1519,10 +1520,10 @@ def doc_recycle(request): # 删除文档 doc.delete() else: - return JsonResponse({'status':False,'data':'无效请求'}) - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status':False,'data':_('无效请求')}) + return JsonResponse({'status': True, 'data': _('删除完成')}) else: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) # 清空回收站 elif types == 'empty': docs = Doc.objects.filter(status=3,create_user=request.user) @@ -1532,16 +1533,16 @@ def doc_recycle(request): DocShare.objects.filter(doc=doc).delete() DocTag.objects.filter(doc=doc).delete() docs.delete() - return JsonResponse({'status': True, 'data': '清空成功'}) + return JsonResponse({'status': True, 'data': _('清空成功')}) # 还原回收站 elif types == 'restoreAll': Doc.objects.filter(status=3,create_user=request.user).update(status=0) - return JsonResponse({'status': True, 'data': '还原成功'}) + return JsonResponse({'status': True, 'data': _('还原成功')}) else: - return JsonResponse({'status': False, 'data': '参数错误'}) + return JsonResponse({'status': False, 'data': _('参数错误')}) except Exception as e: - logger.exception("处理文档出错") - return JsonResponse({'status': False, 'data': '请求出错'}) + logger.exception(_("处理文档出错")) + return JsonResponse({'status': False, 'data': _('请求出错')}) # 一键发布文档 @@ -1560,7 +1561,7 @@ def fast_publish_doc(request): else: colla_user_role = 0 except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': '文档不存在'}) + return JsonResponse({'status': False, 'data': _('文档不存在')}) # 判断请求者是否有权限(文档创建者、文集创建者、文集高级协作者) # 如果请求用户为文档创建者、高级权限的协作者、文集的创建者,可以删除 if (request.user == doc.create_user) or (colla_user_role == 1) or (request.user == project.create_user): @@ -1568,12 +1569,12 @@ def fast_publish_doc(request): doc.status = 1 doc.modify_time = datetime.datetime.now() doc.save() - return JsonResponse({'status':True,'data':'发布成功'}) + return JsonResponse({'status':True,'data':_('发布成功')}) except: - logger.exception("文档一键发布失败") - return JsonResponse({'status':False,'data':'发布失败'}) + logger.exception(_("文档一键发布失败")) + return JsonResponse({'status':False,'data':_('发布失败')}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) # 私密文档分享 @@ -1636,7 +1637,7 @@ def share_doc(request): } return JsonResponse({'status':True,'data':data}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文档不存在'}) + return JsonResponse({'status':False,'data':_('文档不存在')}) # 验证文档分享码 @@ -1662,7 +1663,7 @@ def share_doc_check(request): obj.set_cookie('sharedoc-{}'.format(doc_token),share_value) return obj else: - errormsg = "分享码错误" + errormsg = _("分享码错误") return render(request, 'app_doc/share/share_check.html', locals()) @@ -1716,7 +1717,7 @@ def manage_doc_share(request): share.delete() return JsonResponse({'status':True,'data':'ok'}) except: - return JsonResponse({'status':False,'data':'无指定内容'}) + return JsonResponse({'status':False,'data':_('无指定内容')}) elif range == "multi": tokens = token.split(",") try: @@ -1724,9 +1725,9 @@ def manage_doc_share(request): share.delete() return JsonResponse({'status':True,'data':'ok'}) except: - return JsonResponse({'status':False,'data':'无指定内容'}) + return JsonResponse({'status':False,'data':_('无指定内容')}) else: - return JsonResponse({'status':False,'data':'类型错误'}) + return JsonResponse({'status':False,'data':_('类型错误')}) # 修改 elif types == '3': token = request.POST.get("token",'') @@ -1741,7 +1742,7 @@ def manage_doc_share(request): share_type = 0 if value == '0' else 1 DocShare.objects.filter(token=token).update(share_type=share_type) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) return JsonResponse({'status':True,'data':'ok'}) @@ -1750,7 +1751,7 @@ def manage_doc_share(request): @require_http_methods(['GET',"POST"]) def create_doctemp(request): if request.method == 'GET': - editor_type = "新建文档模板" + editor_type = _("新建文档模板") # 获取用户的编辑器模式 try: user_opt = UserOptions.objects.get(user=request.user) @@ -1772,10 +1773,10 @@ def create_doctemp(request): doctemp.save() return JsonResponse({'status':True,'data':doctemp.id}) else: - return JsonResponse({'status':False,'data':'模板标题不能为空'}) + return JsonResponse({'status':False,'data':_('模板标题不能为空')}) except Exception as e: - logger.exception("创建文档模板出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("创建文档模板出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 修改文档模板 @@ -1783,7 +1784,7 @@ def create_doctemp(request): @require_http_methods(['GET',"POST"]) def modify_doctemp(request,doctemp_id): if request.method == 'GET': - editor_type = '修改文档模板' + editor_type = _('修改文档模板') try: doctemp = DocTemp.objects.get(id=doctemp_id) if request.user.id == doctemp.create_user.id: @@ -1796,9 +1797,9 @@ def modify_doctemp(request,doctemp_id): doctemps = DocTemp.objects.filter(create_user=request.user) return render(request,'app_doc/editor/modify_doctemp.html',locals()) else: - return HttpResponse('非法请求') + return HttpResponse(_('非法请求')) except Exception as e: - logger.exception("访问文档模板修改页面出错") + logger.exception(_("访问文档模板修改页面出错")) return render(request, '404.html') elif request.method == 'POST': try: @@ -1811,14 +1812,14 @@ def modify_doctemp(request,doctemp_id): doctemp.name = name doctemp.content = content doctemp.save() - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) else: - return JsonResponse({'status':False,'data':'非法操作'}) + return JsonResponse({'status':False,'data':_('非法操作')}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) except Exception as e: - logger.exception("修改文档模板出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("修改文档模板出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 删除文档模板 @@ -1830,14 +1831,14 @@ def del_doctemp(request): doctemp = DocTemp.objects.get(id=doctemp_id) if request.user.id == doctemp.create_user.id: doctemp.delete() - return JsonResponse({'status':True,'data':'删除完成'}) + return JsonResponse({'status':True,'data':_('删除完成')}) else: - return JsonResponse({'status':False,'data':'非法请求'}) + return JsonResponse({'status':False,'data':_('非法请求')}) else: - return JsonResponse({'status': False, 'data': '参数错误'}) + return JsonResponse({'status': False, 'data': _('参数错误')}) except Exception as e: - logger.exception("删除文档模板出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("删除文档模板出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 管理文档模板 @@ -1872,7 +1873,7 @@ def manage_doctemp(request): doctemps = paginator.page(paginator.num_pages) return render(request, 'app_doc/manage/manage_doctemp.html', locals()) except Exception as e: - logger.exception("管理文档模板页面访问出错") + logger.exception(_("管理文档模板页面访问出错")) return render(request, '404.html') @@ -1886,10 +1887,10 @@ def get_doctemp(request): content = DocTemp.objects.get(id=int(doctemp_id)).serializable_value('content') return JsonResponse({'status':True,'data':content}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) except Exception as e: - logger.exception("获取指定文档模板出错") - return JsonResponse({'status':False,'data':'请求出错'}) + logger.exception(_("获取指定文档模板出错")) + return JsonResponse({'status':False,'data':_('请求出错')}) # 获取指定文集的所有文档 @@ -1925,7 +1926,7 @@ def get_pro_doc(request): item_list.append(item) return JsonResponse({'status':True,'data':list(item_list)}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) # 获取指定文集的文档树数据 @@ -1987,7 +1988,7 @@ def get_pro_doc_tree(request): doc_list.append(top_item) return JsonResponse({'status':True,'data':doc_list}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) # 404页面 @@ -2011,10 +2012,10 @@ def report_md(request): md_file = "/media/reportmd_temp/"+ md_file_filename # 拼接相对链接 return JsonResponse({'status':True,'data':md_file}) else: - return JsonResponse({'status':False,'data':'无权限'}) + return JsonResponse({'status':False,'data':_('无权限')}) except Exception as e: - logger.exception("导出文集MD文件出错") - return JsonResponse({'status':False,'data':'文集不存在'}) + logger.exception(_("导出文集MD文件出错")) + return JsonResponse({'status':False,'data':_('文集不存在')}) # 生成文集文件 - 个人中心 - 文集管理 @@ -2109,8 +2110,8 @@ def genera_project_file(request): return JsonResponse({'status': True, 'data': epub_file}) except Exception as e: - logger.exception("生成EPUB出错") - return JsonResponse({'status': False, 'data': '生成出错'}) + logger.exception(_("生成EPUB出错")) + return JsonResponse({'status': False, 'data': _('生成出错')}) # 导出PDF elif report_type in ['pdf']: try: @@ -2118,7 +2119,7 @@ def genera_project_file(request): project_id=project.id ).work() if report_project is False: - return JsonResponse({'status':False,'data':'生成出错'}) + return JsonResponse({'status':False,'data':_('生成出错')}) report_file_path = report_project.split('media', maxsplit=1)[-1] # 导出文件的路径 pdf_file = '/media' + report_file_path # 文件相对路径 # 查询文集是否存在导出文件 @@ -2142,20 +2143,20 @@ def genera_project_file(request): return JsonResponse({'status': True, 'data': pdf_file}) except Exception as e: - logger.exception("生成出错") - return JsonResponse({'status': False, 'data': '生成出错'}) + logger.exception(_("生成出错")) + return JsonResponse({'status': False, 'data': _('生成出错')}) else: - return JsonResponse({'status': False, 'data': '不支持的类型'}) + return JsonResponse({'status': False, 'data': _('不支持的类型')}) # 不允许被导出 else: - return JsonResponse({'status':False,'data':'无权限导出'}) + return JsonResponse({'status':False,'data':_('无权限导出')}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文集不存在'}) + return JsonResponse({'status':False,'data':_('文集不存在')}) except Exception as e: - logger.exception("生成文集文件出错") - return JsonResponse({'status':False,'data':'系统异常'}) + logger.exception(_("生成文集文件出错")) + return JsonResponse({'status':False,'data':_('系统异常')}) # 获取文集前台导出文件 @@ -2226,31 +2227,31 @@ def report_file(request): try: report_project = ProjectReportFile.objects.get(project=project,file_type='epub') except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'无可用文件,请联系文集创建者'}) + return JsonResponse({'status':False,'data':_('无可用文件,请联系文集创建者')}) # print(report_project) return JsonResponse({'status': True, 'data': report_project.file_path}) except Exception as e: - return JsonResponse({'status': False, 'data': '导出出错'}) + return JsonResponse({'status': False, 'data': _('导出出错')}) # 导出PDF elif report_type in ['pdf']: try: try: report_project = ProjectReportFile.objects.get(project=project,file_type='pdf') except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'无可用文件,请联系文集创建者'}) + return JsonResponse({'status':False,'data':_('无可用文件,请联系文集创建者')}) # print(report_project) return JsonResponse({'status': True, 'data': report_project.file_path}) except Exception as e: - return JsonResponse({'status': False, 'data': '导出出错'}) + return JsonResponse({'status': False, 'data': _('导出出错')}) else: - return JsonResponse({'status': False, 'data': '不支持的类型'}) + return JsonResponse({'status': False, 'data': _('不支持的类型')}) else: - return JsonResponse({'status':False,'data':'无权限导出'}) + return JsonResponse({'status':False,'data':_('无权限导出')}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文集不存在'}) + return JsonResponse({'status':False,'data':_('文集不存在')}) except Exception as e: - logger.exception("获取文集前台导出文件出错") - return JsonResponse({'status':False,'data':'系统异常'}) + logger.exception(_("获取文集前台导出文件出错")) + return JsonResponse({'status':False,'data':_('系统异常')}) # 图片素材管理 @@ -2281,7 +2282,7 @@ def manage_image(request): images.group = g_id return render(request,'app_doc/manage/manage_image.html',locals()) except: - logger.exception("图片素材管理出错") + logger.exception(_("图片素材管理出错")) return render(request,'404.html') elif request.method == 'POST': try: @@ -2293,7 +2294,7 @@ def manage_image(request): if range == 'single': img = Image.objects.get(id=img_id) if img.user != request.user: - return JsonResponse({'status': False, 'data': '未授权请求'}) + return JsonResponse({'status': False, 'data': _('未授权请求')}) file_path = settings.BASE_DIR+img.file_path is_exist = os.path.exists(file_path) if is_exist: @@ -2304,7 +2305,7 @@ def manage_image(request): for i in imgs: img = Image.objects.get(id=i) if img.user != request.user: - logger.error("图片{}非法删除".format(i)) + logger.error(_("图片{}非法删除".format(i))) break file_path = settings.BASE_DIR + img.file_path is_exist = os.path.exists(file_path) @@ -2312,7 +2313,7 @@ def manage_image(request): os.remove(file_path) img.delete() # 删除记录 - return JsonResponse({'status':True,'data':'删除完成'}) + return JsonResponse({'status':True,'data':_('删除完成')}) # 移动图片分组 elif int(types) == 1: if range == 'single': @@ -2331,12 +2332,12 @@ def manage_image(request): group = ImageGroup.objects.get(id=group_id,user=request.user) Image.objects.filter(id__in=imgs,user=request.user).update(group_id=group) - return JsonResponse({'status':True,'data':'移动完成'}) + return JsonResponse({'status':True,'data':_('移动完成')}) # 获取图片 elif int(types) == 2: group_id = request.POST.get('group_id', None) # 接受分组ID参数 if group_id is None: # - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) elif int(group_id) == 0: imgs = Image.objects.filter(user=request.user).order_by('-create_time') elif int(group_id) == -1: @@ -2352,12 +2353,12 @@ def manage_image(request): img_list.append(item) return JsonResponse({'status':True,'data':img_list}) else: - return JsonResponse({'status':False,'data':'非法参数'}) + return JsonResponse({'status':False,'data':_('非法参数')}) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'图片不存在'}) + return JsonResponse({'status':False,'data':_('图片不存在')}) except: - logger.exception("操作图片素材出错") - return JsonResponse({'status':False,'data':'程序异常'}) + logger.exception(_("操作图片素材出错")) + return JsonResponse({'status':False,'data':_('程序异常')}) # 图片分组管理 @login_required() @@ -2373,23 +2374,23 @@ def manage_img_group(request): # 创建分组 if int(types) == 0: group_name = request.POST.get('group_name', '') - if group_name not in ['','默认分组','未分组']: + if group_name not in ['',_('默认分组'),_('未分组')]: ImageGroup.objects.get_or_create( user = request.user, group_name = group_name ) return JsonResponse({'status':True,'data':'ok'}) else: - return JsonResponse({'status':False,'data':'名称无效'}) + return JsonResponse({'status':False,'data':_('名称无效')}) # 修改分组 elif int(types) == 1: group_name = request.POST.get("group_name",'') - if group_name not in ['','默认分组','未分组']: + if group_name not in ['',_('默认分组'),_('未分组')]: group_id = request.POST.get('group_id', '') ImageGroup.objects.filter(id=group_id,user=request.user).update(group_name=group_name) - return JsonResponse({'status':True,'data':'修改成功'}) + return JsonResponse({'status':True,'data':_('修改成功')}) else: - return JsonResponse({'status':False,'data':'名称无效'}) + return JsonResponse({'status':False,'data':_('名称无效')}) # 删除分组 elif int(types) == 2: @@ -2398,18 +2399,18 @@ def manage_img_group(request): group = ImageGroup.objects.get(id=group_id,user=request.user) # 查询分组 images = Image.objects.filter(group_id=group_id,user=request.user).update(group_id=None) # 移动图片到未分组 group.delete() # 删除分组 - return JsonResponse({'status':True,'data':'删除完成'}) + return JsonResponse({'status':True,'data':_('删除完成')}) except: - logger.exception("删除图片分组出错") - return JsonResponse({'status':False,'data':'删除错误'}) + logger.exception(_("删除图片分组出错")) + return JsonResponse({'status':False,'data':_('删除错误')}) # 获取分组 elif int(types) == 3: try: group_list = [] all_cnt = Image.objects.filter(user=request.user).count() non_group_cnt = Image.objects.filter(group_id=None,user=request.user).count() - group_list.append({'group_name':'全部图片','group_cnt':all_cnt,'group_id':0}) - group_list.append({'group_name':'未分组','group_cnt':non_group_cnt,'group_id':-1}) + group_list.append({'group_name':_('全部图片'),'group_cnt':all_cnt,'group_id':0}) + group_list.append({'group_name':_('未分组'),'group_cnt':non_group_cnt,'group_id':-1}) groups = ImageGroup.objects.filter(user=request.user) # 查询所有分组 for group in groups: group_cnt = Image.objects.filter(group_id=group).count() @@ -2421,8 +2422,8 @@ def manage_img_group(request): group_list.append(item) return JsonResponse({'status':True,'data':group_list}) except: - logger.exception("获取图片分组出错") - return JsonResponse({'status':False,'data':'出现错误'}) + logger.exception(_("获取图片分组出错")) + return JsonResponse({'status':False,'data':_('出现错误')}) # 附件管理 @@ -2487,7 +2488,7 @@ def manage_attachment(request): attachments = paginator.page(paginator.num_pages) return render(request, 'app_doc/manage/manage_attachment.html', locals()) except Exception as e: - logger.exception("附件管理访问出错") + logger.exception(_("附件管理访问出错")) return render(request,'404.html') elif request.method == 'POST': # types参数,0表示上传、1表示删除、2表示获取附件列表 @@ -2507,7 +2508,7 @@ def manage_attachment(request): # print(repr(e)) allow_attach_size = 52428800 if attachment.size > allow_attach_size: - return JsonResponse({'status':False,'data':'文件大小超出限制'}) + return JsonResponse({'status':False,'data':_('文件大小超出限制')}) # 限制附件格式 # 获取系统设置允许的附件格式,如果不存在,默认仅允许zip格式文件 @@ -2531,16 +2532,16 @@ def manage_attachment(request): ) return JsonResponse({'status':True,'data':{'name':attachment_name,'url':a.file_path.name}}) else: - return JsonResponse({'status':False,'data':'不支持的格式'}) + return JsonResponse({'status':False,'data':_('不支持的格式')}) else: - return JsonResponse({'status':False,'data':'无效文件'}) + return JsonResponse({'status':False,'data':_('无效文件')}) elif types in ['1',1]: attach_id = request.POST.get('attach_id','') attachment = Attachment.objects.filter(id=attach_id,user=request.user) # 查询附件 for a in attachment: # 遍历附件 a.file_path.delete() # 删除文件 attachment.delete() # 删除数据库记录 - return JsonResponse({'status':True,'data':'删除成功'}) + return JsonResponse({'status':True,'data':_('删除成功')}) elif types in [2,'2']: attachment_list = [] attachments = Attachment.objects.filter(user=request.user).order_by('-create_time') @@ -2554,7 +2555,7 @@ def manage_attachment(request): attachment_list.append(item) return JsonResponse({'status':True,'data':attachment_list}) else: - return JsonResponse({'status':False,'data':'无效参数'}) + return JsonResponse({'status':False,'data':_('无效参数')}) # 搜索 @@ -2707,12 +2708,12 @@ def download_doc_md(request,doc_id): try: doc = Doc.objects.get(id=doc_id) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文档不存在'}) + return JsonResponse({'status':False,'data':_('文档不存在')}) else: try: doc = Doc.objects.get(id=doc_id,create_user = request.user) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'文档不存在'}) + return JsonResponse({'status':False,'data':_('文档不存在')}) else: return render(request,'404.html') @@ -2763,7 +2764,7 @@ def manage_doc_tag(request): ) return JsonResponse({'status': True, 'data': 'ok'}) else: - return JsonResponse({'status': False, 'data': '名称无效'}) + return JsonResponse({'status': False, 'data': _('名称无效')}) # 修改标签 elif int(types) == 1: try: @@ -2773,14 +2774,14 @@ def manage_doc_tag(request): if tag_id != "": print(tag_id,tag_name) Tag.objects.filter(id=tag_id, create_user=request.user).update(name=tag_name) - return JsonResponse({'status': True, 'data': '修改成功'}) + return JsonResponse({'status': True, 'data': _('修改成功')}) else: - return JsonResponse({'status': False, 'data': '标签ID无效'}) + return JsonResponse({'status': False, 'data': _('标签ID无效')}) else: - return JsonResponse({'status': False, 'data': '名称无效'}) + return JsonResponse({'status': False, 'data': _('名称无效')}) except Exception as e: - logger.exception("修改异常") - return JsonResponse({'status': False, 'data': '异常错误'}) + logger.exception(_("修改异常")) + return JsonResponse({'status': False, 'data': _('异常错误')}) # 删除标签 elif int(types) == 2: @@ -2788,18 +2789,18 @@ def manage_doc_tag(request): tag_id = request.POST.get('tag_id', '') tag = Tag.objects.get(id=tag_id, create_user=request.user) # 查询分组 tag.delete() # 删除标签 - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status': True, 'data': _('删除完成')}) except: - logger.exception("删除标签出错") - return JsonResponse({'status': False, 'data': '删除错误'}) + logger.exception(_("删除标签出错")) + return JsonResponse({'status': False, 'data': _('删除错误')}) # 获取标签 elif int(types) == 3: try: tag_list = [] return JsonResponse({'status': True, 'data': tag_list}) except: - logger.exception("获取文档标签出错") - return JsonResponse({'status': False, 'data': '出现错误'}) + logger.exception(_("获取文档标签出错")) + return JsonResponse({'status': False, 'data': _('出现错误')}) # 标签文档关系页 @@ -2914,7 +2915,7 @@ def tag_docs(request,tag_id): return render(request, 'app_doc/tag_docs.html', locals()) except Exception as e: - logger.exception("标签文档页访问异常") + logger.exception(_("标签文档页访问异常")) return render(request, '404.html') @@ -2973,9 +2974,9 @@ def tag_doc(request,tag_id,doc_id): return render(request, '404.html') return render(request,'app_doc/tag_doc_single.html',locals()) else: - return HttpResponse('参数错误') + return HttpResponse(_('参数错误')) except Exception as e: - logger.exception("文集浏览出错") + logger.exception(_("文集浏览出错")) return render(request,'404.html') @@ -2995,11 +2996,11 @@ def manage_self(request): editor_mode = request.POST.get('editor_mode',1) # 编辑器 user = User.objects.get_by_natural_key(request.user) if len(first_name) < 2 or len(first_name) > 10: - return JsonResponse({'status': False, 'data': '昵称长度不得小于2位大于10位'}) + return JsonResponse({'status': False, 'data': _('昵称长度不得小于2位大于10位')}) if User.objects.filter(first_name=first_name).count() > 0 and user.first_name != first_name: - return JsonResponse({'status':False,'data':'昵称已被使用'}) + return JsonResponse({'status':False,'data':_('昵称已被使用')}) if User.objects.filter(email=email).count() > 0 and user.email != email: - return JsonResponse({'status':False,'data':'电子邮箱已被使用'}) + return JsonResponse({'status':False,'data':_('电子邮箱已被使用')}) if email != '' and '@' in email: user.email = email user.first_name = first_name @@ -3010,7 +3011,7 @@ def manage_self(request): ) return JsonResponse({'status':True,'data':'ok'}) else: - return JsonResponse({'status':False,'data':'参数不正确'}) + return JsonResponse({'status':False,'data':_('参数不正确')}) # 文集文档收藏 @@ -3022,13 +3023,13 @@ def my_collect(request): collect_type = request.POST.get('type',None) # 收藏类型 collect_id = request.POST.get('id',None) # 收藏对象ID if (collect_type is None) or (collect_id is None): - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) else: is_collect = MyCollect.objects.filter(collect_type=collect_type,collect_id=collect_id,create_user=request.user) # 存在收藏 if is_collect.exists(): is_collect.delete() - return JsonResponse({'status': True, 'data': '取消收藏成功'}) + return JsonResponse({'status': True, 'data': _('取消收藏成功')}) else: MyCollect.objects.create( collect_type = collect_type, @@ -3036,7 +3037,7 @@ def my_collect(request): create_user = request.user, create_time = datetime.datetime.now() ) - return JsonResponse({'status':True,'data':'收藏成功'}) + return JsonResponse({'status':True,'data':_('收藏成功')}) elif request.method == 'DELETE': pass @@ -3132,28 +3133,28 @@ def manage_collect(request): try: collect = MyCollect.objects.get(id=collect_id) except ObjectDoesNotExist: - return JsonResponse({'status': False, 'data': '收藏不存在'}) + return JsonResponse({'status': False, 'data': _('收藏不存在')}) # 如果请求用户为站点管理员、收藏的创建者,可以删除 if (request.user == collect.create_user) or (request.user.is_superuser): MyCollect.objects.filter(id=collect_id).delete() - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status': True, 'data': _('删除完成')}) else: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) elif range == 'multi': collects = collect_id.split(",") try: MyCollect.objects.filter(id__in=collects, create_user=request.user).delete() - return JsonResponse({'status': True, 'data': '删除完成'}) + return JsonResponse({'status': True, 'data': _('删除完成')}) except: - return JsonResponse({'status': False, 'data': '非法请求'}) + return JsonResponse({'status': False, 'data': _('非法请求')}) else: - return JsonResponse({'status': False, 'data': '类型错误'}) + return JsonResponse({'status': False, 'data': _('类型错误')}) else: - return JsonResponse({'status': False, 'data': '参数错误'}) + return JsonResponse({'status': False, 'data': _('参数错误')}) except Exception as e: - logger.exception("取消收藏出错") - return JsonResponse({'status': False, 'data': '请求出错'}) + logger.exception(_("取消收藏出错")) + return JsonResponse({'status': False, 'data': _('请求出错')}) # 获取当前版本 def get_version(request): @@ -3166,6 +3167,6 @@ def get_version(request): except: data = { 'status':False, - 'data':'异常' + 'data':_('异常') } return JsonResponse(data) \ No newline at end of file diff --git a/app_doc/views_import.py b/app_doc/views_import.py index fac3d87..5f3c054 100644 --- a/app_doc/views_import.py +++ b/app_doc/views_import.py @@ -17,6 +17,7 @@ from app_doc.models import Project,Doc,DocTemp from django.contrib.auth.models import User from django.db.models import Q from django.db import transaction +from django.utils.translation import gettext_lazy as _ from loguru import logger from app_doc.report_utils import * from app_admin.decorators import check_headers,allow_report_file @@ -43,7 +44,7 @@ def import_project(request): file_name = import_file.name # 限制文件大小在50mb以内 if import_file.size > 52428800: - return JsonResponse({'status': False, 'data': '文件大小超出限制'}) + return JsonResponse({'status': False, 'data': _('文件大小超出限制')}) # 限制文件格式为.zip if file_name.endswith('.zip'): if os.path.exists(os.path.join(settings.MEDIA_ROOT,'import_temp')) is False: @@ -121,15 +122,15 @@ def import_project(request): } }) else: - return JsonResponse({'status':False,'data':'上传失败'}) + return JsonResponse({'status':False,'data':_('上传失败')}) else: - return JsonResponse({'status':False,'data':'上传失败'}) + return JsonResponse({'status':False,'data':_('上传失败')}) else: - return JsonResponse({'status':False,'data':'仅支持.zip格式'}) + return JsonResponse({'status':False,'data':_('仅支持.zip格式')}) else: - return JsonResponse({'status':False,'data':'无有效文件'}) + return JsonResponse({'status':False,'data':_('无有效文件')}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':_('参数错误')}) # 文集文档排序 @@ -146,12 +147,12 @@ def project_doc_sort(request): try: sort_data = json.loads(sort_data) except Exception: - return JsonResponse({'status':False,'data':'文档参数错误'}) + return JsonResponse({'status':False,'data':_('文档参数错误')}) try: Project.objects.get(id=project_id,create_user=request.user) except ObjectDoesNotExist: - return JsonResponse({'status':False,'data':'没有匹配的文集'}) + return JsonResponse({'status':False,'data':_('没有匹配的文集')}) # 修改文集信息 Project.objects.filter(id=project_id).update( @@ -194,7 +195,7 @@ def import_doc_docx(request): file_name = import_file.name # 限制文件大小在50mb以内 if import_file.size > 52428800: - return JsonResponse({'status': False, 'data': '文件大小超出限制'}) + return JsonResponse({'status': False, 'data': _('文件大小超出限制')}) # 限制文件格式为.zip if file_name.endswith('.docx'): if os.path.exists(os.path.join(settings.MEDIA_ROOT, 'import_temp')) is False: @@ -213,10 +214,10 @@ def import_doc_docx(request): ).run() return JsonResponse(import_file) else: - return JsonResponse({'status': False, 'data': '上传失败'}) + return JsonResponse({'status': False, 'data': _('上传失败')}) else: - return JsonResponse({'status': False, 'data': '仅支持.docx格式'}) + return JsonResponse({'status': False, 'data': _('仅支持.docx格式')}) else: - return JsonResponse({'status': False, 'data': '无有效文件'}) + return JsonResponse({'status': False, 'data': _('无有效文件')}) else: - return JsonResponse({'status': False, 'data': '参数错误'}) \ No newline at end of file + return JsonResponse({'status': False, 'data': _('参数错误')}) \ No newline at end of file diff --git a/app_doc/views_user.py b/app_doc/views_user.py index 4bed297..3b17192 100644 --- a/app_doc/views_user.py +++ b/app_doc/views_user.py @@ -10,6 +10,7 @@ from django.contrib.auth.decorators import login_required # 登录需求装饰 from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页 from django.core.exceptions import PermissionDenied,ObjectDoesNotExist +from django.utils.translation import gettext_lazy as _ from app_doc.models import Project,Doc,DocTemp from django.contrib.auth.models import User from django.db.models import Q @@ -40,21 +41,21 @@ def user_center_menu(request): menu_data = [ { "id": 1, - "title": "仪表盘", + "title": _("仪表盘"), "type": 1, "icon": "layui-icon layui-icon-console", "href": reverse('manage_overview'), }, { "id": "my_project", - "title": "我的文集", + "title": _("我的文集"), "icon": "layui-icon layui-icon-component", "type": 0, "href": "", "children": [ { "id": "manage_project", - "title": "文集管理", + "title": _("文集管理"), "icon": "layui-icon layui-icon-console", "type": 1, "openType": "_iframe", @@ -62,7 +63,7 @@ def user_center_menu(request): }, { "id": "manage_colla_self", - "title": "我的协作", + "title": _("我的协作"), "icon": "layui-icon layui-icon-console", "type": 1, "openType": "_iframe", @@ -70,7 +71,7 @@ def user_center_menu(request): }, { "id": "import_project", - "title": "导入文集", + "title": _("导入文集"), "icon": "layui-icon layui-icon-console", "type": 1, "openType": "_iframe", @@ -80,14 +81,14 @@ def user_center_menu(request): }, { "id": "my_doc", - "title": "我的文档", + "title": _("我的文档"), "icon": "layui-icon layui-icon-file-b", "type": 0, "href": "", "children": [ { "id": "doc_manage", - "title": "文档管理", + "title": _("文档管理"), "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", @@ -95,7 +96,7 @@ def user_center_menu(request): }, { "id": "doc_template", - "title": "文档模板", + "title": _("文档模板"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -103,7 +104,7 @@ def user_center_menu(request): }, { "id": "doc_tag", - "title": "文档标签", + "title": _("文档标签"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -111,7 +112,7 @@ def user_center_menu(request): }, { "id": "doc_share", - "title": "我的分享", + "title": _("我的分享"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -119,7 +120,7 @@ def user_center_menu(request): }, { "id": "doc_recycle", - "title": "文档回收站", + "title": _("文档回收站"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -129,14 +130,14 @@ def user_center_menu(request): }, { "id": "my_fodder", - "title": "我的素材", + "title": _("我的素材"), "icon": "layui-icon layui-icon-upload-drag", "type": 0, "href": "", "children": [ { "id": "my_img", - "title": "我的图片", + "title": _("我的图片"), "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", @@ -144,7 +145,7 @@ def user_center_menu(request): }, { "id": "my_attachment", - "title": "我的附件", + "title": _("我的附件"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -154,7 +155,7 @@ def user_center_menu(request): }, { "id": "my_collect", - "title": "我的收藏", + "title": _("我的收藏"), "icon": "layui-icon layui-icon-star", "type": 1, "openType": "_iframe", @@ -162,14 +163,14 @@ def user_center_menu(request): }, { "id": "self_settings", - "title": "个人管理", + "title": _("个人管理"), "icon": "layui-icon layui-icon-set-fill", "type": 0, "href": "", "children": [ { "id": 601, - "title": "个人设置", + "title": _("个人设置"), "icon": "layui-icon layui-icon-face-smile", "type": 1, "openType": "_iframe", @@ -177,7 +178,7 @@ def user_center_menu(request): }, { "id": 602, - "title": "Token管理", + "title": _("Token管理"), "icon": "layui-icon layui-icon-face-cry", "type": 1, "openType": "_iframe", @@ -187,7 +188,7 @@ def user_center_menu(request): }, { "id": "user_manual", - "title": "使用手册", + "title": _("使用手册"), "icon": "layui-icon layui-icon-template-1", "type": 1, "openType": "_blank", diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..029560d --- /dev/null +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,2342 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-03-13 12:22+0800\n" +"PO-Revision-Date: 2021-03-13 14:20+0800\n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Last-Translator: \n" +"Language-Team: \n" +"X-Generator: Poedit 2.4.2\n" + +#: .\app_admin\utils.py:40 +msgid "MrDoc - 重置密码验证码" +msgstr "MrDoc -重置密碼驗證碼" + +#: .\app_admin\utils.py:41 +msgid "你的验证码为:{},验证码30分钟内有效!" +msgstr "你的驗證碼為:{},驗證碼30分鐘內有效!" + +#: .\app_admin\views.py:36 +msgid "生成验证码图片异常" +msgstr "生成驗證碼圖片异常" + +#: .\app_admin\views.py:37 +msgid "请求异常:{}" +msgstr "請求异常:{}" + +#: .\app_admin\views.py:57 +msgid "验证码错误!" +msgstr "驗證碼錯誤!" + +#: .\app_admin\views.py:66 +msgid "用户被禁用!" +msgstr "用戶被禁用!" + +#: .\app_admin\views.py:69 .\app_admin\views.py:72 +msgid "用户名或密码错误!" +msgstr "用戶名或密碼錯誤!" + +#: .\app_admin\views.py:76 .\app_api\views_app.py:541 +#: .\app_api\views_app.py:583 .\app_api\views_app.py:622 +#: .\app_api\views_app.py:669 .\app_api\views_app.py:690 +#: .\app_api\views_app.py:706 .\app_doc\views.py:430 .\app_doc\views.py:548 +#: .\app_doc\views.py:1035 .\app_doc\views.py:1168 .\app_doc\views.py:1230 +#: .\app_doc\views.py:1545 .\app_doc\views.py:1779 .\app_doc\views.py:1822 +#: .\app_doc\views.py:1841 .\app_doc\views.py:1893 .\app_doc\views.py:3157 +msgid "请求出错" +msgstr "請求出錯" + +#: .\app_admin\views.py:100 +msgid "注册码无效!" +msgstr "註冊碼無效!" + +#: .\app_admin\views.py:108 +msgid "此电子邮箱已被注册!" +msgstr "此電子郵箱已被注册!" + +#: .\app_admin\views.py:111 +msgid "用户名已被使用!" +msgstr "用戶名已被使用!" + +#: .\app_admin\views.py:114 +msgid "用户名只能为英文数字组合" +msgstr "用戶名只能為英文數位組合" + +#: .\app_admin\views.py:117 +msgid "用户名必须大于等于5位!" +msgstr "用戶名必須大於等於5位!" + +#: .\app_admin\views.py:120 +msgid "密码必须大于等于6位!" +msgstr "密碼必須大於等於6位!" + +#: .\app_admin\views.py:123 +msgid "验证码错误" +msgstr "驗證碼錯誤" + +#: .\app_admin\views.py:151 +msgid "用户被禁用,请联系管理员!" +msgstr "用戶被禁用,請聯系管理員!" + +#: .\app_admin\views.py:154 +msgid "请输入正确的电子邮箱格式!" +msgstr "請輸入正確的電子郵箱格式!" + +#: .\app_admin\views.py:157 +msgid "请检查输入值" +msgstr "請檢查輸入值" + +#: .\app_admin\views.py:174 +msgid "注销异常" +msgstr "註銷異常" + +#: .\app_admin\views.py:195 +msgid "修改密码成功,请返回登录!" +msgstr "修改密碼成功!請返回登錄" + +#: .\app_admin\views.py:198 +msgid "验证码已过期" +msgstr "驗證碼已過期" + +#: .\app_admin\views.py:201 +msgid "邮箱不存在:{}" +msgstr "郵箱不存在:{}" + +#: .\app_admin\views.py:202 .\app_admin\views.py:206 +msgid "验证码或邮箱错误" +msgstr "驗證碼或郵箱錯誤" + +#: .\app_admin\views.py:231 +msgid "发送成功" +msgstr "發送成功" + +#: .\app_admin\views.py:233 +msgid "发送验证码出错,请重试!" +msgstr "發送驗證碼出錯,請重試!" + +#: .\app_admin\views.py:236 +msgid "电子邮箱不存在!" +msgstr "電子郵箱不存在!" + +#: .\app_admin\views.py:238 .\app_admin\views.py:306 .\app_admin\views.py:373 +#: .\app_admin\views.py:396 .\app_admin\views.py:681 .\app_admin\views.py:706 +msgid "方法错误" +msgstr "方法錯誤" + +#: .\app_admin\views.py:322 +msgid "电子邮箱不可重复" +msgstr "電子郵箱不可重複" + +#: .\app_admin\views.py:325 +msgid "用户名不可重复" +msgstr "用戶名不可重複" + +#: .\app_admin\views.py:343 .\app_admin\views.py:667 .\app_admin\views.py:677 +#: .\app_api\views.py:132 .\app_api\views.py:160 .\app_api\views.py:187 +#: .\app_api\views.py:212 .\app_api\views.py:245 .\app_doc\views.py:2159 +#: .\app_doc\views.py:2254 +msgid "系统异常" +msgstr "系統異常" + +#: .\app_admin\views.py:345 +msgid "请检查参数" +msgstr "請檢查參數" + +#: .\app_admin\views.py:347 .\app_doc\views.py:1037 +msgid "方法不允许" +msgstr "方法不允許" + +#: .\app_admin\views.py:364 .\app_admin\views.py:698 .\app_api\views_app.py:576 +#: .\app_api\views_app.py:683 .\app_doc\views.py:425 .\app_doc\views.py:815 +#: .\app_doc\views.py:1154 .\app_doc\views.py:1815 .\app_doc\views.py:2391 +#: .\app_doc\views.py:2777 .\template\app_doc\manage\manage_self.html:83 +#: .\template\app_doc\manage\manage_self.html:105 +msgid "修改成功" +msgstr "修改成功" + +#: .\app_admin\views.py:366 .\app_admin\views.py:702 +msgid "两个密码不一致" +msgstr "兩個密碼不一致" + +#: .\app_admin\views.py:368 .\app_api\views_app.py:413 +#: .\app_api\views_app.py:580 .\app_api\views_app.py:619 +#: .\app_api\views_app.py:687 .\app_api\views_app.py:703 .\app_doc\views.py:545 +#: .\app_doc\views.py:776 .\app_doc\views.py:939 .\app_doc\views.py:1165 +#: .\app_doc\views.py:1227 .\app_doc\views.py:1542 .\app_doc\views.py:1745 +#: .\app_doc\views.py:1819 .\app_doc\views.py:1838 .\app_doc\views.py:1890 +#: .\app_doc\views.py:1929 .\app_doc\views.py:1991 .\app_doc\views.py:2340 +#: .\app_doc\views.py:2977 .\app_doc\views.py:3026 .\app_doc\views.py:3154 +#: .\app_doc\views_import.py:133 .\app_doc\views_import.py:223 +msgid "参数错误" +msgstr "參數錯誤" + +#: .\app_admin\views.py:371 +msgid "请求错误" +msgstr "請求錯誤" + +#: .\app_admin\views.py:392 .\app_admin\views.py:673 .\app_doc\views.py:803 +#: .\app_doc\views.py:1465 .\app_doc\views.py:2544 +#: .\template\app_admin\admin_project.html:268 +#: .\template\app_admin\admin_project.html:322 +#: .\template\app_doc\manage\manage_project.html:230 +#: .\template\app_doc\manage\manage_project.html:284 +msgid "删除成功" +msgstr "刪除成功" + +#: .\app_admin\views.py:394 .\app_doc\views.py:806 +msgid "删除出错" +msgstr "刪除出錯" + +#: .\app_admin\views.py:495 +msgid "置顶文集出错" +msgstr "置頂文集出錯" + +#: .\app_admin\views.py:496 +msgid "执行出错" +msgstr "執行出錯" + +#: .\app_admin\views.py:648 +msgid "最大使用次数不可为负数" +msgstr "最大使用次數不可為負數" + +#: .\app_admin\views.py:664 +msgid "新增成功" +msgstr "新增成功" + +#: .\app_admin\views.py:666 +msgid "生成注册码异常" +msgstr "生成註冊碼異常" + +#: .\app_admin\views.py:675 +msgid "注册码不存在" +msgstr "註冊碼不存在" + +#: .\app_admin\views.py:679 .\app_doc\views.py:543 .\app_doc\views.py:1224 +#: .\app_doc\views.py:1730 .\app_doc\views.py:3151 +msgid "类型错误" +msgstr "類型錯誤" + +#: .\app_admin\views.py:700 +msgid "密码不得少于6位数" +msgstr "密碼不得少於6位數" + +#: .\app_admin\views.py:704 +msgid "修改出错" +msgstr "修改出錯" + +#: .\app_admin\views.py:950 .\app_doc\views_user.py:44 +#: .\template\app_doc\manage\manage_overview.html:4 +msgid "仪表盘" +msgstr "儀錶盤" + +#: .\app_admin\views.py:957 .\app_doc\views_user.py:58 +#: .\template\app_doc\manage\manage_project.html:4 +#: .\template\app_doc\manage\manage_project_collaborator.html:10 +#: .\template\app_doc\manage\manage_project_doc_sort.html:13 +#: .\template\app_doc\manage\manage_project_options.html:15 +#: .\template\app_doc\manage\manage_project_transfer.html:10 +msgid "文集管理" +msgstr "文集管理" + +#: .\app_admin\views.py:964 .\app_doc\views_user.py:91 +#: .\template\app_doc\manage\manage_doc.html:4 +#: .\template\app_doc\manage\manage_doc_history.html:10 +msgid "文档管理" +msgstr "文檔管理" + +#: .\app_admin\views.py:971 .\template\app_doc\manage\manage_doctemp.html:4 +#: .\template\app_doc\manage\manage_doctemp.html:10 +msgid "文档模板管理" +msgstr "文檔模板管理" + +#: .\app_admin\views.py:978 +msgid "注册码管理" +msgstr "註冊碼管理" + +#: .\app_admin\views.py:985 +msgid "用户管理" +msgstr "用戶管理" + +#: .\app_admin\views.py:992 +msgid "站点设置" +msgstr "站點設置" + +#: .\app_admin\views.py:999 +msgid "使用帮助" +msgstr "使用幫助" + +#: .\app_admin\views.py:1005 +msgid "安装说明" +msgstr "安裝說明" + +#: .\app_admin\views.py:1012 +msgid "使用说明" +msgstr "使用說明" + +#: .\app_api\auth_app.py:49 +msgid "无效的token" +msgstr "無效的Token" + +#: .\app_api\auth_app.py:52 +msgid "请求的URL中必须携带token参数" +msgstr "請求的URL中必須攜帶Token參數" + +#: .\app_api\permissions_app.py:11 +msgid "只有VIP才能访问" +msgstr "只有VIP才能訪問" + +#: .\app_api\views.py:44 +msgid "链接已失效,请从合法路径访问,或联系管理员!" +msgstr "鏈接已失效!請從合法路徑訪問,或聯繫管理員!" + +#: .\app_api\views.py:48 +msgid "请求用户出错!" +msgstr "請求用戶出錯!" + +#: .\app_api\views.py:55 +msgid "非法用户!" +msgstr "非法用戶!" + +#: .\app_api\views.py:67 +msgid "验证失败,可能是用户名或Token不正确!详情请联系管理员!" +msgstr "驗證失敗!可能是用戶名或Token不正確!詳情請聯繫管理員" + +#: .\app_api\views.py:69 +msgid "关键字验证失败,请联系管理员!部分关键字为空" +msgstr "關鍵字驗證失敗,請聯繫管理員!部分關鍵字為空" + +#: .\app_api\views.py:74 +msgid "API接口运行出错!" +msgstr "API接口運行出錯!" + +#: .\app_api\views.py:88 +msgid "你还没有生成过Token!" +msgstr "你還沒有生成過Token!" + +#: .\app_api\views.py:91 +msgid "Token管理页面异常" +msgstr "Token管理頁面異常" + +#: .\app_api\views.py:108 +msgid "用户Token生成异常" +msgstr "用戶Token生成異常" + +#: .\app_api\views.py:109 +msgid "生成出错,请重试!" +msgstr "生成出錯,請重試!" + +#: .\app_api\views.py:129 .\app_api\views.py:157 .\app_api\views.py:184 +#: .\app_api\views.py:209 .\app_api\views.py:242 .\app_api\views.py:266 +msgid "token无效" +msgstr "Token無效" + +#: .\app_api\views.py:131 .\app_api\views.py:159 +msgid "token获取文集异常" +msgstr "Token獲取文集異常" + +#: .\app_api\views.py:211 +msgid "token创建文集异常" +msgstr "Token創建文集異常" + +#: .\app_api\views.py:240 .\app_api\views_app.py:376 .\app_api\views_app.py:617 +#: .\app_api\views_app.py:701 .\app_doc\views.py:427 .\app_doc\views.py:525 +#: .\app_doc\views.py:1214 .\app_doc\views.py:1222 .\app_doc\views.py:1433 +#: .\app_doc\views.py:1435 .\app_doc\views.py:1526 .\app_doc\views.py:1577 +#: .\app_doc\views.py:1800 .\app_doc\views.py:1836 .\app_doc\views.py:3142 +#: .\app_doc\views.py:3149 +msgid "非法请求" +msgstr "非法請求" + +#: .\app_api\views.py:244 +msgid "token创建文档异常" +msgstr "Token創建文檔異常" + +#: .\app_api\views.py:268 +msgid "token上传图片异常" +msgstr "Token上傳圖片異常" + +#: .\app_api\views.py:269 .\app_doc\util_upload_img.py:169 +msgid "上传出错" +msgstr "上傳出錯" + +#: .\app_api\views_app.py:90 +msgid "账号被禁用" +msgstr "賬號被禁用" + +#: .\app_api\views_app.py:95 +msgid "用户名或密码错误" +msgstr "用戶名或密碼錯誤" + +#: .\app_api\views_app.py:341 .\app_doc\views.py:3014 +msgid "参数不正确" +msgstr "參數不正確" + +#: .\app_api\views_app.py:344 .\app_doc\views.py:309 +msgid "创建文集出错" +msgstr "創建文集出錯" + +#: .\app_api\views_app.py:346 +msgid "系统异常请稍后再试" +msgstr "系統異常,請稍後再試" + +#: .\app_api\views_app.py:350 +msgid "请登录后操作" +msgstr "請登錄后操作" + +#: .\app_api\views_app.py:380 .\app_api\views_app.py:417 +msgid "资源未找到" +msgstr "資源未找到" + +#: .\app_api\views_app.py:383 .\app_doc\views.py:429 +msgid "修改文集出错" +msgstr "修改文集出錯" + +#: .\app_api\views_app.py:420 +msgid "API文集删除异常" +msgstr "API文集刪除異常" + +#: .\app_api\views_app.py:485 +msgid "返回HTML" +msgstr "返回HTML" + +#: .\app_api\views_app.py:536 .\app_doc\views.py:1030 +msgid "无权操作此文集" +msgstr "無權操作此文集" + +#: .\app_api\views_app.py:538 .\app_doc\views.py:1032 +msgid "请确认文档标题、文集正确" +msgstr "請確認文檔標題、文集正確" + +#: .\app_api\views_app.py:540 +msgid "api新建文档异常" +msgstr "API新建文檔異常" + +#: .\app_api\views_app.py:578 .\app_api\views_app.py:754 +#: .\app_doc\views.py:1163 .\app_doc\views.py:2297 +msgid "未授权请求" +msgstr "未授權請求" + +#: .\app_api\views_app.py:582 +msgid "api修改文档出错" +msgstr "API修改文檔出錯" + +#: .\app_api\views_app.py:615 .\app_api\views_app.py:699 +#: .\app_doc\views.py:1212 .\app_doc\views.py:1220 .\app_doc\views.py:1524 +#: .\app_doc\views.py:1834 .\app_doc\views.py:2316 .\app_doc\views.py:2402 +#: .\app_doc\views.py:2792 .\app_doc\views.py:3140 .\app_doc\views.py:3147 +msgid "删除完成" +msgstr "刪除完成" + +#: .\app_api\views_app.py:621 +msgid "api删除文档出错" +msgstr "API刪除文檔出錯" + +#: .\app_api\views_app.py:639 .\app_doc\views.py:708 +msgid "无权操作" +msgstr "無權操作" + +#: .\app_api\views_app.py:648 .\app_api\views_app.py:666 +msgid "请登录" +msgstr "請登錄" + +#: .\app_api\views_app.py:662 +msgid "创建成功" +msgstr "創建成功" + +#: .\app_api\views_app.py:664 .\app_doc\views.py:1776 +msgid "模板标题不能为空" +msgstr "模板標題不能為空" + +#: .\app_api\views_app.py:668 +msgid "api创建文档模板出错" +msgstr "API創建文檔模板出錯" + +#: .\app_api\views_app.py:685 .\app_doc\views.py:1817 +msgid "非法操作" +msgstr "非法操作" + +#: .\app_api\views_app.py:689 +msgid "api修改文档模板出错" +msgstr "API修改文檔模板出錯" + +#: .\app_api\views_app.py:705 +msgid "api删除文档模板出错" +msgstr "API刪除文檔模板出錯" + +#: .\app_api\views_app.py:746 +msgid "出错信息" +msgstr "出錯信息" + +#: .\app_api\views_app.py:772 .\app_doc\views.py:2412 +#: .\template\app_doc\manage\manage_image.html:31 +msgid "全部图片" +msgstr "全部圖片" + +#: .\app_api\views_app.py:773 .\app_api\views_app.py:789 +#: .\app_api\views_app.py:800 .\app_doc\views.py:2377 .\app_doc\views.py:2388 +#: .\app_doc\views.py:2413 .\template\app_doc\manage\manage_image.html:32 +msgid "未分组" +msgstr "未分組" + +#: .\app_api\views_app.py:785 .\app_doc\views.py:2426 .\app_doc\views.py:2803 +msgid "出现错误" +msgstr "出現錯誤" + +#: .\app_api\views_app.py:789 .\app_api\views_app.py:800 +#: .\app_doc\views.py:2377 .\app_doc\views.py:2388 +msgid "默认分组" +msgstr "默認分組" + +#: .\app_api\views_app.py:796 .\app_api\views_app.py:805 +#: .\app_doc\views.py:2384 .\app_doc\views.py:2393 .\app_doc\views.py:2767 +#: .\app_doc\views.py:2781 +msgid "名称无效" +msgstr "名稱無效" + +#: .\app_api\views_app.py:815 .\app_doc\views.py:2405 .\app_doc\views.py:2795 +msgid "删除错误" +msgstr "刪除錯誤" + +#: .\app_api\views_app.py:868 .\app_doc\views.py:2511 +#: .\app_doc\views_import.py:47 .\app_doc\views_import.py:198 +msgid "文件大小超出限制" +msgstr "文件大小超出限制" + +#: .\app_api\views_app.py:879 .\app_doc\views.py:2535 +msgid "不支持的格式" +msgstr "不支持的格式" + +#: .\app_api\views_app.py:881 .\app_doc\views.py:2537 +msgid "无效文件" +msgstr "無效文件" + +#: .\app_doc\import_utils.py:96 +msgid "未发现yaml文件" +msgstr "未發現yaml文件" + +#: .\app_doc\import_utils.py:150 +msgid "解析导入文件异常" +msgstr "解析導入文件異常" + +#: .\app_doc\import_utils.py:160 +msgid "删除临时文件异常" +msgstr "刪除臨時文件異常" + +#: .\app_doc\import_utils.py:204 .\app_doc\import_utils.py:241 +#: .\app_doc\util_upload_img.py:217 +msgid "本地上传" +msgstr "本地上傳" + +#: .\app_doc\import_utils.py:269 +msgid "读取异常" +msgstr "讀取異常" + +#: .\app_doc\report_utils.py:270 +msgid "本格式不支持iframe视频显示,视频地址为:{}" +msgstr "本格式不支持iframe視頻顯示,視頻地址為:{}" + +#: .\app_doc\report_utils.py:301 .\template\app_doc\tag_doc_single.html:107 +msgid "目录" +msgstr "目錄" + +#: .\app_doc\report_utils.py:816 +msgid "生成PDF出错" +msgstr "生成PDF出錯" + +#: .\app_doc\templatetags\doc_filter.py:32 +msgid "【协作】" +msgstr "【協作】" + +#: .\app_doc\templatetags\doc_filter.py:40 +msgid "无上级文档" +msgstr "無上級文檔" + +#: .\app_doc\templatetags\project_filter.py:20 +msgid "它还没有文档……" +msgstr "它還沒有文檔" + +#: .\app_doc\util_upload_img.py:57 +msgid "文件格式不允许" +msgstr "文件格式不允許" + +#: .\app_doc\util_upload_img.py:81 +msgid "iceEditor上传" +msgstr "iceEditor上傳" + +#: .\app_doc\util_upload_img.py:94 +msgid "文件存储异常" +msgstr "文件存儲異常" + +#: .\app_doc\util_upload_img.py:122 +msgid "iceurl粘贴上传" +msgstr "iceurl粘貼上傳" + +#: .\app_doc\util_upload_img.py:191 +msgid "图片格式不正确" +msgstr "圖片格式不正確" + +#: .\app_doc\util_upload_img.py:201 +msgid "图片大小超出{}MB" +msgstr "圖片大小超出{}MB" + +#: .\app_doc\util_upload_img.py:220 .\app_doc\util_upload_img.py:242 +msgid "上传图片成功" +msgstr "上傳圖片成功" + +#: .\app_doc\util_upload_img.py:240 .\app_doc\util_upload_img.py:267 +msgid "粘贴上传" +msgstr "粘貼上傳" + +#: .\app_doc\views.py:306 +msgid "文集名称不能为空!" +msgstr "文集名稱不能為空!" + +#: .\app_doc\views.py:310 +msgid "出现异常,请检查输入值!" +msgstr "出現異常,請檢查輸入值!" + +#: .\app_doc\views.py:387 +msgid "文集页访问异常" +msgstr "文集頁面訪問異常" + +#: .\app_doc\views.py:474 +msgid "出错" +msgstr "出錯" + +#: .\app_doc\views.py:496 +msgid "访问码错误" +msgstr "訪問碼錯誤" + +#: .\app_doc\views.py:499 +msgid "验证文集访问码出错" +msgstr "驗證文集訪問碼出錯" + +#: .\app_doc\views.py:540 .\app_doc\views.py:3170 +msgid "异常" +msgstr "異常" + +#: .\app_doc\views.py:541 .\app_doc\views.py:1720 .\app_doc\views.py:1728 +msgid "无指定内容" +msgstr "無指定內容" + +#: .\app_doc\views.py:547 +msgid "删除文集出错" +msgstr "刪除文集出錯" + +#: .\app_doc\views.py:676 .\app_doc\views_import.py:150 +msgid "文档参数错误" +msgstr "文檔參數錯誤" + +#: .\app_doc\views.py:681 .\app_doc\views_import.py:155 +msgid "没有匹配的文集" +msgstr "沒有匹配的文集" + +#: .\app_doc\views.py:784 +msgid "文集创建者无需添加" +msgstr "文集創建者無需添加" + +#: .\app_doc\views.py:786 +msgid "用户已存在" +msgstr "用戶已存在" + +#: .\app_doc\views.py:793 +msgid "添加成功" +msgstr "添加成功" + +#: .\app_doc\views.py:795 .\app_doc\views.py:861 +msgid "用户不存在" +msgstr "用戶不存在" + +#: .\app_doc\views.py:805 +msgid "删除协作者出错" +msgstr "刪除協作者出錯" + +#: .\app_doc\views.py:817 +msgid "修改协作权限出错" +msgstr "修改協作權限出錯" + +#: .\app_doc\views.py:818 .\app_doc\views.py:1160 +msgid "修改失败" +msgstr "修改失敗" + +#: .\app_doc\views.py:821 +msgid "无效的类型" +msgstr "無效的類型" + +#: .\app_doc\views.py:925 +msgid "【预览草稿】" +msgstr "【預覽草稿】" + +#: .\app_doc\views.py:941 .\app_doc\views.py:2979 +msgid "文集浏览出错" +msgstr "文集瀏覽出錯" + +#: .\app_doc\views.py:963 .\template\app_doc\head_base.html:39 +#: .\template\app_doc\head_base.html:75 +msgid "新建文档" +msgstr "新建文檔" + +#: .\app_doc\views.py:970 +msgid "访问创建文档页面出错" +msgstr "訪問創建文檔頁面出錯" + +#: .\app_doc\views.py:1024 +msgid "创建文档异常" +msgstr "創建文檔異常" + +#: .\app_doc\views.py:1028 +msgid "创建失败" +msgstr "創建失敗" + +#: .\app_doc\views.py:1044 .\template\app_doc\doc.html:130 +msgid "修改文档" +msgstr "修改文檔" + +#: .\app_doc\views.py:1075 +msgid "修改文档页面访问出错" +msgstr "修改文檔頁面訪問出錯" + +#: .\app_doc\views.py:1156 +msgid "修改文档异常" +msgstr "修改文檔異常" + +#: .\app_doc\views.py:1167 +msgid "修改文档出错" +msgstr "修改文檔出錯" + +#: .\app_doc\views.py:1187 +msgid "文档{}的所属文集不存在。" +msgstr "文檔{}的所屬文集不存在。" + +#: .\app_doc\views.py:1229 +msgid "删除文档出错" +msgstr "刪除文檔出錯" + +#: .\app_doc\views.py:1342 +msgid "文集无权限" +msgstr "文集無權限" + +#: .\app_doc\views.py:1344 .\app_doc\views.py:2018 .\app_doc\views.py:2155 +#: .\app_doc\views.py:2251 +msgid "文集不存在" +msgstr "文集不存在" + +#: .\app_doc\views.py:1349 .\app_doc\views.py:1505 .\app_doc\views.py:1564 +#: .\app_doc\views.py:1640 .\app_doc\views.py:2711 .\app_doc\views.py:2716 +msgid "文档不存在" +msgstr "文檔不存在" + +#: .\app_doc\views.py:1355 +msgid "上级文档不存在" +msgstr "上級文檔不存在" + +#: .\app_doc\views.py:1380 +msgid "移动文档异常" +msgstr "移動文檔異常" + +#: .\app_doc\views.py:1381 .\app_doc\views.py:1396 +msgid "移动文档失败" +msgstr "移動文檔失敗" + +#: .\app_doc\views.py:1395 +msgid "移动包含下级的文档异常" +msgstr "移動包含下級的文檔異常" + +#: .\app_doc\views.py:1398 +msgid "移动类型错误" +msgstr "移動類型出錯" + +#: .\app_doc\views.py:1420 +msgid "文档历史版本页面访问出错" +msgstr "文檔歷史版本頁面訪問出錯" + +#: .\app_doc\views.py:1437 +msgid "文档历史版本获取出错" +msgstr "文檔歷史版本獲取出錯" + +#: .\app_doc\views.py:1438 +msgid "获取异常" +msgstr "獲取異常" + +#: .\app_doc\views.py:1459 +msgid "管理文档历史版本页面访问出错" +msgstr "管理文檔歷史版本頁面訪問出錯" + +#: .\app_doc\views.py:1467 +msgid "操作文档历史版本出错" +msgstr "操作文檔歷史版本出錯" + +#: .\app_doc\views.py:1468 +msgid "出现异常" +msgstr "出現異常" + +#: .\app_doc\views.py:1523 +msgid "无效请求" +msgstr "無效請求" + +#: .\app_doc\views.py:1536 +msgid "清空成功" +msgstr "清空成功" + +#: .\app_doc\views.py:1540 +msgid "还原成功" +msgstr "還原成功" + +#: .\app_doc\views.py:1544 +msgid "处理文档出错" +msgstr "處理文檔出錯" + +#: .\app_doc\views.py:1572 +msgid "发布成功" +msgstr "發佈成功" + +#: .\app_doc\views.py:1574 +msgid "文档一键发布失败" +msgstr "文檔一鍵發佈失敗" + +#: .\app_doc\views.py:1575 +msgid "发布失败" +msgstr "發佈失敗" + +#: .\app_doc\views.py:1666 +msgid "分享码错误" +msgstr "分享碼出錯" + +#: .\app_doc\views.py:1754 +msgid "新建文档模板" +msgstr "新建文檔模板" + +#: .\app_doc\views.py:1778 +msgid "创建文档模板出错" +msgstr "創建文檔模板出錯" + +#: .\app_doc\views.py:1787 +msgid "修改文档模板" +msgstr "修改文檔模板" + +#: .\app_doc\views.py:1802 +msgid "访问文档模板修改页面出错" +msgstr "訪問文檔模板修改頁面出錯" + +#: .\app_doc\views.py:1821 +msgid "修改文档模板出错" +msgstr "修改文檔模板出錯" + +#: .\app_doc\views.py:1840 +msgid "删除文档模板出错" +msgstr "刪除文檔模板出錯" + +#: .\app_doc\views.py:1876 +msgid "管理文档模板页面访问出错" +msgstr "管理文檔模板頁面訪問出錯" + +#: .\app_doc\views.py:1892 +msgid "获取指定文档模板出错" +msgstr "獲取指定文檔模板出錯" + +#: .\app_doc\views.py:2015 +msgid "无权限" +msgstr "無權限" + +#: .\app_doc\views.py:2017 +msgid "导出文集MD文件出错" +msgstr "導出文集Markdown文件出錯" + +#: .\app_doc\views.py:2113 +msgid "生成EPUB出错" +msgstr "生成EPUB出錯" + +#: .\app_doc\views.py:2114 .\app_doc\views.py:2122 .\app_doc\views.py:2146 +#: .\app_doc\views.py:2147 +msgid "生成出错" +msgstr "生成出錯" + +#: .\app_doc\views.py:2149 .\app_doc\views.py:2247 +msgid "不支持的类型" +msgstr "不支持的類型" + +#: .\app_doc\views.py:2152 .\app_doc\views.py:2249 +msgid "无权限导出" +msgstr "無權限導出" + +#: .\app_doc\views.py:2158 +msgid "生成文集文件出错" +msgstr "生成文集文件出錯" + +#: .\app_doc\views.py:2230 .\app_doc\views.py:2241 +msgid "无可用文件,请联系文集创建者" +msgstr "無可用文件,請聯繫文集創建者" + +#: .\app_doc\views.py:2234 .\app_doc\views.py:2245 +msgid "导出出错" +msgstr "導出出錯" + +#: .\app_doc\views.py:2253 +msgid "获取文集前台导出文件出错" +msgstr "獲取文集前台導出文件出錯" + +#: .\app_doc\views.py:2285 +msgid "图片素材管理出错" +msgstr "圖片素材管理出錯" + +#: .\app_doc\views.py:2308 +msgid "图片{}非法删除" +msgstr "圖片{}非法刪除" + +#: .\app_doc\views.py:2335 +msgid "移动完成" +msgstr "移動完成" + +#: .\app_doc\views.py:2356 +msgid "非法参数" +msgstr "非法參數" + +#: .\app_doc\views.py:2358 +msgid "图片不存在" +msgstr "圖片不存在" + +#: .\app_doc\views.py:2360 +msgid "操作图片素材出错" +msgstr "操作圖片素材出錯" + +#: .\app_doc\views.py:2361 +msgid "程序异常" +msgstr "程序異常" + +#: .\app_doc\views.py:2404 +msgid "删除图片分组出错" +msgstr "刪除圖片分組出錯" + +#: .\app_doc\views.py:2425 +msgid "获取图片分组出错" +msgstr "獲取圖片分組出錯" + +#: .\app_doc\views.py:2491 +msgid "附件管理访问出错" +msgstr "附件管理訪問出錯" + +#: .\app_doc\views.py:2558 +msgid "无效参数" +msgstr "無效參數" + +#: .\app_doc\views.py:2779 +msgid "标签ID无效" +msgstr "標籤ID無效" + +#: .\app_doc\views.py:2783 +msgid "修改异常" +msgstr "修改異常" + +#: .\app_doc\views.py:2784 +msgid "异常错误" +msgstr "異常錯誤" + +#: .\app_doc\views.py:2794 +msgid "删除标签出错" +msgstr "刪除標籤出錯" + +#: .\app_doc\views.py:2802 +msgid "获取文档标签出错" +msgstr "獲取文檔標籤出錯" + +#: .\app_doc\views.py:2918 +msgid "标签文档页访问异常" +msgstr "標籤文檔頁訪問異常" + +#: .\app_doc\views.py:2999 +msgid "昵称长度不得小于2位大于10位" +msgstr "暱稱長度不得小於2位大於10位" + +#: .\app_doc\views.py:3001 +msgid "昵称已被使用" +msgstr "暱稱已被使用" + +#: .\app_doc\views.py:3003 +msgid "电子邮箱已被使用" +msgstr "電子郵箱已被使用" + +#: .\app_doc\views.py:3032 +msgid "取消收藏成功" +msgstr "取消收藏成功" + +#: .\app_doc\views.py:3040 +msgid "收藏成功" +msgstr "收藏成功" + +#: .\app_doc\views.py:3136 +msgid "收藏不存在" +msgstr "收藏不存在" + +#: .\app_doc\views.py:3156 +msgid "取消收藏出错" +msgstr "取消收藏出錯" + +#: .\app_doc\views_import.py:125 .\app_doc\views_import.py:127 +#: .\app_doc\views_import.py:217 +msgid "上传失败" +msgstr "上傳失敗" + +#: .\app_doc\views_import.py:129 +msgid "仅支持.zip格式" +msgstr "僅支持.zip格式" + +#: .\app_doc\views_import.py:131 .\app_doc\views_import.py:221 +msgid "无有效文件" +msgstr "無有效文件" + +#: .\app_doc\views_import.py:219 +msgid "仅支持.docx格式" +msgstr "僅支持.docx格式" + +#: .\app_doc\views_user.py:51 +msgid "我的文集" +msgstr "我的文集" + +#: .\app_doc\views_user.py:66 +msgid "我的协作" +msgstr "我的協作" + +#: .\app_doc\views_user.py:74 +#: .\template\app_doc\manage\manage_project_import.html:4 +msgid "导入文集" +msgstr "導入文集" + +#: .\app_doc\views_user.py:84 +msgid "我的文档" +msgstr "我的文檔" + +#: .\app_doc\views_user.py:99 +msgid "文档模板" +msgstr "文檔模板" + +#: .\app_doc\views_user.py:107 +msgid "文档标签" +msgstr "文檔標籤" + +#: .\app_doc\views_user.py:115 +msgid "我的分享" +msgstr "我的分享" + +#: .\app_doc\views_user.py:123 +msgid "文档回收站" +msgstr "文檔回收站" + +#: .\app_doc\views_user.py:133 +msgid "我的素材" +msgstr "我的素材" + +#: .\app_doc\views_user.py:140 +msgid "我的图片" +msgstr "我的圖片" + +#: .\app_doc\views_user.py:148 +msgid "我的附件" +msgstr "我的附件" + +#: .\app_doc\views_user.py:158 +msgid "我的收藏" +msgstr "我的收藏" + +#: .\app_doc\views_user.py:166 +msgid "个人管理" +msgstr "個人管理" + +#: .\app_doc\views_user.py:173 .\template\app_doc\manage\manage_self.html:4 +msgid "个人设置" +msgstr "個人設置" + +#: .\app_doc\views_user.py:181 +msgid "Token管理" +msgstr "Token管理" + +#: .\app_doc\views_user.py:191 +msgid "使用手册" +msgstr "使用手冊" + +#: .\template\403.html:7 +msgid "拒绝访问" +msgstr "拒絕訪問" + +#: .\template\403.html:7 .\template\404.html:7 .\template\app_api\api404.html:7 +#: .\template\app_doc\diff_doc.html:14 +#: .\template\app_doc\user\user_center.html:8 .\template\forget_pwd.html:6 +#: .\template\login.html:12 .\template\register.html:6 +msgid "觅道文档MrDoc" +msgstr "覓道文檔MrDoc" + +#: .\template\403.html:20 +msgid "你无权访问当前页面……" +msgstr "你無權訪問當前頁面" + +#: .\template\403.html:22 .\template\404.html:19 +#: .\template\app_api\api404.html:21 .\template\app_doc\search.html:42 +#: .\template\app_doc\search_result.html:61 .\template\login.html:102 +#: .\template\register.html:99 .\template\search\search.html:59 +msgid "返回首页" +msgstr "返回首頁" + +#: .\template\404.html:7 .\template\app_api\api404.html:7 +msgid "页面未找到" +msgstr "頁面未找到" + +#: .\template\app_admin\admin_base.html:21 +msgid "当前站点处于Debug调试模式" +msgstr "當前站點處於Debug調試模式" + +#: .\template\app_admin\admin_base.html:29 +msgid "检测到新版本发布,请及时更新!下载地址:" +msgstr "檢測到新版本發佈,請及時更新!下載地址:" + +#: .\template\app_admin\admin_project.html:252 +#: .\template\app_admin\admin_project.html:304 +#: .\template\app_doc\manage\manage_project.html:214 +#: .\template\app_doc\manage\manage_project.html:266 +#: .\template\app_doc\manage\manage_project_options.html:202 +#: .\template\app_doc\manage\manage_project_options.html:205 +msgid "删除文集" +msgstr "刪除文集" + +#: .\template\app_admin\admin_project.html:256 +#: .\template\app_doc\manage\manage_attachment.html:48 +#: .\template\app_doc\manage\manage_doc_history.html:48 +#: .\template\app_doc\manage\manage_doc_recycle.html:46 +#: .\template\app_doc\manage\manage_doc_share.html:17 +#: .\template\app_doc\manage\manage_doc_tag.html:45 +#: .\template\app_doc\manage\manage_doctemp.html:50 +#: .\template\app_doc\manage\manage_image_group.html:43 +#: .\template\app_doc\manage\manage_project.html:24 +#: .\template\app_doc\manage\manage_project.html:218 +#: .\template\app_doc\manage\manage_project_collaborator.html:79 +#: .\template\app_doc\manage\manage_project_collaborator.html:111 +msgid "删除" +msgstr "刪除" + +#: .\template\app_admin\admin_project.html:256 +#: .\template\app_admin\admin_project.html:308 +#: .\template\app_doc\manage\manage_project.html:155 +#: .\template\app_doc\manage\manage_project.html:186 +#: .\template\app_doc\manage\manage_project.html:218 +#: .\template\app_doc\manage\manage_project.html:270 +#: .\template\app_doc\manage\manage_self.html:70 +#: .\template\app_doc\pro_list.html:326 .\template\app_doc\pro_list.html:397 +#: .\template\app_doc\pro_list.html:428 +msgid "取消" +msgstr "取消" + +#: .\template\app_admin\admin_project.html:290 +#: .\template\app_doc\manage\manage_project.html:252 +#: .\template\app_doc\manage\manage_project.html:308 +msgid "未选中任何文集" +msgstr "未選中任何文集" + +#: .\template\app_admin\admin_project.html:308 +#: .\template\app_doc\manage\manage_project.html:270 +msgid "批量删除" +msgstr "批量刪除" + +#: .\template\app_doc\check_viewcode.html:13 +#: .\template\app_doc\check_viewcode.html:64 +#: .\template\app_doc\manage\manage_project_options.html:98 +msgid "请输入访问码" +msgstr "請輸入訪問碼" + +#: .\template\app_doc\check_viewcode.html:13 +#: .\template\app_doc\docs_base.html:15 .\template\app_doc\pro_list.html:14 +#: .\template\app_doc\share\share_check.html:13 +#: .\template\app_doc\share\share_doc.html:15 +#: .\template\app_doc\tag_doc_base.html:15 +msgid "站点标题" +msgstr "站點標題" + +#: .\template\app_doc\check_viewcode.html:57 +msgid "你正在访问:" +msgstr "你正在訪問:" + +#: .\template\app_doc\check_viewcode.html:69 +#: .\template\app_doc\share\share_check.html:69 +msgid "确认" +msgstr "確認" + +#: .\template\app_doc\diff_doc.html:14 +msgid "文档历史版本对比:" +msgstr "文檔歷史版本對比:" + +#: .\template\app_doc\diff_doc.html:36 +#: .\template\app_doc\editor\create_base.html:40 +msgid "MrDoc文档编辑器" +msgstr "MrDoc文檔編輯器" + +#: .\template\app_doc\diff_doc.html:37 +msgid "你正在:对比文档历史版本" +msgstr "你正在:對比文檔歷史版本" + +#: .\template\app_doc\diff_doc.html:45 +#: .\template\app_doc\manage\manage_doc_history.html:33 +#: .\template\app_doc\manage\manage_doc_recycle.html:25 +#: .\template\app_doc\manage\manage_doctemp.html:36 +#: .\template\app_doc\manage\manage_project.html:105 +#: .\template\app_doc\manage\manage_project_collaborator.html:96 +msgid "创建时间" +msgstr "創建時間" + +#: .\template\app_doc\diff_doc.html:46 +msgid "用户" +msgstr "用戶" + +#: .\template\app_doc\diff_doc.html:47 +#: .\template\app_doc\manage\manage_project_self_colla.html:39 +msgid "查看" +msgstr "查看" + +#: .\template\app_doc\diff_doc.html:56 +#: .\template\app_doc\manage\manage_doc_history.html:45 +msgid "对比" +msgstr "對比" + +#: .\template\app_doc\diff_doc.html:70 .\template\app_doc\docs_base.html:164 +msgid "切换侧边栏" +msgstr "切換側邊欄" + +#: .\template\app_doc\diff_doc.html:75 .\template\app_doc\docs_base.html:180 +#: .\template\app_doc\tag_doc_base.html:108 +#: .\template\app_doc\user\user_center.html:101 +#: .\template\search\search.html:90 +msgid "首页" +msgstr "首頁" + +#: .\template\app_doc\diff_doc.html:90 +msgid "当前版本" +msgstr "當前版本" + +#: .\template\app_doc\diff_doc.html:93 +msgid "历史版本:" +msgstr "歷史版本:" + +#: .\template\app_doc\doc.html:15 .\template\app_doc\doc.html:27 +#: .\template\app_doc\manage\manage_doc_tag.html:42 +#: .\template\app_doc\manage\manage_doctemp.html:47 +#: .\template\app_doc\manage\manage_image_group.html:40 +#: .\template\app_doc\manage\manage_project_collaborator.html:76 +#: .\template\app_doc\manage\manage_project_collaborator.html:108 +#: .\template\app_doc\tag_doc_single.html:15 +#: .\template\app_doc\tag_doc_single.html:27 +msgid "修改" +msgstr "修改" + +#: .\template\app_doc\doc.html:18 .\template\app_doc\doc.html:31 +#: .\template\app_doc\manage\manage_project_collaborator.html:39 +#: .\template\app_doc\project.html:13 .\template\app_doc\tag_doc_single.html:18 +#: .\template\app_doc\tag_doc_single.html:31 +msgid "添加" +msgstr "添加" + +#: .\template\app_doc\doc.html:21 .\template\app_doc\project.html:18 +#: .\template\app_doc\tag_doc_single.html:21 +msgid "管理" +msgstr "管理" + +#: .\template\app_doc\doc.html:77 .\template\app_doc\share\share_doc.html:190 +msgid "更新于:" +msgstr "更新于:" + +#: .\template\app_doc\doc.html:81 +msgid "分享本文档" +msgstr "分享本文檔" + +#: .\template\app_doc\doc.html:82 .\template\app_doc\doc.html:267 +msgid "分享文档" +msgstr "分享文檔" + +#: .\template\app_doc\doc.html:88 .\template\app_doc\doc.html:90 +#: .\template\app_doc\doc.html:93 +msgid "收藏文档" +msgstr "收藏文檔" + +#: .\template\app_doc\doc.html:98 .\template\app_doc\doc.html:99 +msgid "下载文档" +msgstr "下載文檔" + +#: .\template\app_doc\doc.html:112 .\template\app_doc\doc.html:114 +#: .\template\app_doc\tag_doc_single.html:91 +#: .\template\app_doc\tag_doc_single.html:93 +msgid "上一篇" +msgstr "上一篇" + +#: .\template\app_doc\doc.html:119 .\template\app_doc\doc.html:121 +#: .\template\app_doc\tag_doc_single.html:98 +#: .\template\app_doc\tag_doc_single.html:100 +msgid "下一篇" +msgstr "下一篇" + +#: .\template\app_doc\doc.html:145 .\template\app_doc\tag_doc_single.html:115 +msgid "下载Markdown文件" +msgstr "下載Markdown文件" + +#: .\template\app_doc\doc.html:154 .\template\app_doc\project.html:144 +#: .\template\app_doc\tag_doc_single.html:72 +#: .\template\app_doc\tag_docs.html:25 +msgid "分享" +msgstr "分享" + +#: .\template\app_doc\doc.html:157 +msgid "开启|关闭" +msgstr "開啟|關閉" + +#: .\template\app_doc\doc.html:165 +#: .\template\app_doc\manage\manage_overview.html:149 +msgid "链接" +msgstr "鏈接" + +#: .\template\app_doc\doc.html:173 +msgid "类型" +msgstr "類型" + +#: .\template\app_doc\doc.html:176 .\template\app_doc\doc.html:179 +#: .\template\app_doc\manage\manage_overview.html:120 +#: .\template\app_doc\manage\manage_project_options.html:88 +msgid "公开" +msgstr "公開" + +#: .\template\app_doc\doc.html:177 .\template\app_doc\doc.html:180 +#: .\template\app_doc\manage\manage_overview.html:122 +#: .\template\app_doc\manage\manage_project_options.html:89 +msgid "私密" +msgstr "私密" + +#: .\template\app_doc\doc.html:187 +#: .\template\app_doc\manage\manage_overview.html:126 +msgid "密码" +msgstr "密碼" + +#: .\template\app_doc\doc.html:192 +msgid "更新密码" +msgstr "更新密碼" + +#: .\template\app_doc\doc.html:254 +msgid "设置成功" +msgstr "設置成功" + +#: .\template\app_doc\doc.html:258 +msgid "设置出错" +msgstr "設置出錯" + +#: .\template\app_doc\doc.html:337 +msgid "关闭分享" +msgstr "關閉分享" + +#: .\template\app_doc\docs_base.html:49 +msgid "输入并回车搜索" +msgstr "確認并回車搜索" + +#: .\template\app_doc\docs_base.html:59 +msgid "私密文档" +msgstr "私密文檔" + +#: .\template\app_doc\docs_base.html:73 +msgid "* 此为协作文集" +msgstr "*此為協作文集" + +#: .\template\app_doc\docs_base.html:81 +msgid "文集大纲加载中……" +msgstr "文集大綱加載中……" + +#: .\template\app_doc\docs_base.html:146 +#: .\template\app_doc\tag_doc_base.html:71 +msgid "本文档使用MrDoc发布" +msgstr "本文檔使用MrDoc發佈" + +#: .\template\app_doc\docs_base.html:167 +#: .\template\app_doc\share\share_doc.html:130 +msgid "缩小字体" +msgstr "縮小字體" + +#: .\template\app_doc\docs_base.html:170 +#: .\template\app_doc\share\share_doc.html:133 +msgid "放大字体" +msgstr "放大字體" + +#: .\template\app_doc\docs_base.html:173 +#: .\template\app_doc\share\share_doc.html:136 +msgid "切换字体类型" +msgstr "切換字體類型" + +#: .\template\app_doc\docs_base.html:250 +msgid "微信扫一扫" +msgstr "微信掃一掃" + +#: .\template\app_doc\docs_base.html:251 .\template\app_doc\docs_base.html:260 +msgid "复制链接" +msgstr "複製鏈接" + +#: .\template\app_doc\docs_base.html:255 +msgid "手机扫一扫进行分享" +msgstr "手機掃一掃進行分享" + +#: .\template\app_doc\docs_base.html:270 +msgid "微信" +msgstr "微信" + +#: .\template\app_doc\docs_base.html:271 +msgid "支付宝" +msgstr "支付寶" + +#: .\template\app_doc\docs_base.html:272 +msgid "QQ支付" +msgstr "QQ支付" + +#: .\template\app_doc\docs_base.html:273 +msgid "PayPal" +msgstr "PayPal" + +#: .\template\app_doc\docs_base.html:274 +msgid "项目源码" +msgstr "項目源碼" + +#: .\template\app_doc\foot_base.html:6 +msgid "网站地图" +msgstr "網站地圖" + +#: .\template\app_doc\head_base.html:15 +msgid "搜索文档" +msgstr "搜索文檔" + +#: .\template\app_doc\head_base.html:33 +#: .\template\app_doc\manage\manage_doctemp.html:22 +msgid "新建" +msgstr "新建" + +#: .\template\app_doc\head_base.html:46 +#: .\template\app_doc\manage\manage_project.html:151 +#: .\template\app_doc\pro_list.html:322 +msgid "新建文集" +msgstr "新建文集" + +#: .\template\app_doc\head_base.html:68 +msgid "进入后台" +msgstr "進入後台" + +#: .\template\app_doc\head_base.html:81 +#: .\template\app_doc\search_result.html:73 +#: .\template\app_doc\user\user_center.html:8 +#: .\template\app_doc\user\user_center.html:85 .\template\search\search.html:70 +msgid "个人中心" +msgstr "個人中心" + +#: .\template\app_doc\head_base.html:87 +#: .\template\app_doc\manage\manage_self.html:66 +#: .\template\app_doc\pro_list.html:424 +#: .\template\app_doc\search_result.html:79 .\template\forget_pwd.html:62 +msgid "修改密码" +msgstr "修改密碼" + +#: .\template\app_doc\head_base.html:93 +#: .\template\app_doc\search_result.html:85 .\template\search\search.html:76 +msgid "退出登录" +msgstr "退出登錄" + +#: .\template\app_doc\head_base.html:101 +#: .\template\app_doc\search_result.html:93 .\template\search\search.html:84 +msgid "游客" +msgstr "遊客" + +#: .\template\app_doc\head_base.html:105 .\template\app_doc\head_base.html:108 +#: .\template\app_doc\search_result.html:98 +#: .\template\app_doc\search_result.html:101 .\template\login.html:62 +#: .\template\login.html:91 .\template\search\search.html:94 +#: .\template\search\search.html:97 +msgid "登录" +msgstr "登錄" + +#: .\template\app_doc\head_base.html:107 +#: .\template\app_doc\search_result.html:100 .\template\register.html:56 +#: .\template\search\search.html:96 +msgid "注册" +msgstr "註冊" + +#: .\template\app_doc\manage\manage_attachment.html:4 +msgid "附件管理" +msgstr "附件管理" + +#: .\template\app_doc\manage\manage_attachment.html:14 +#: .\template\app_doc\manage\manage_collect.html:15 +#: .\template\app_doc\manage\manage_doc.html:15 +#: .\template\app_doc\manage\manage_doctemp.html:20 +#: .\template\app_doc\manage\manage_project.html:18 +#: .\template\app_doc\project_doc_search.html:7 +#: .\template\app_doc\project_doc_search.html:18 +msgid "搜索" +msgstr "搜索" + +#: .\template\app_doc\manage\manage_attachment.html:16 +msgid "上传附件" +msgstr "上傳附件" + +#: .\template\app_doc\manage\manage_attachment.html:34 +msgid "附件名称" +msgstr "附件名稱" + +#: .\template\app_doc\manage\manage_attachment.html:35 +msgid "文件大小" +msgstr "文件大小" + +#: .\template\app_doc\manage\manage_attachment.html:36 +msgid "上传时间" +msgstr "上傳時間" + +#: .\template\app_doc\manage\manage_attachment.html:37 +#: .\template\app_doc\manage\manage_doc_history.html:35 +#: .\template\app_doc\manage\manage_doc_recycle.html:27 +#: .\template\app_doc\manage\manage_doc_tag.html:31 +#: .\template\app_doc\manage\manage_doctemp.html:37 +#: .\template\app_doc\manage\manage_image_group.html:29 +#: .\template\app_doc\manage\manage_project.html:106 +#: .\template\app_doc\manage\manage_project_collaborator.html:60 +#: .\template\app_doc\manage\manage_project_collaborator.html:97 +#: .\template\app_doc\manage\manage_project_self_colla.html:23 +msgid "操作" +msgstr "操作" + +#: .\template\app_doc\manage\manage_attachment.html:61 +#: .\template\app_doc\manage\manage_attachment.html:63 +#: .\template\app_doc\manage\manage_doc_history.html:61 +#: .\template\app_doc\manage\manage_doc_history.html:63 +#: .\template\app_doc\manage\manage_doc_recycle.html:59 +#: .\template\app_doc\manage\manage_doc_recycle.html:61 +#: .\template\app_doc\manage\manage_doctemp.html:63 +#: .\template\app_doc\manage\manage_doctemp.html:65 +#: .\template\app_doc\manage\manage_image.html:63 +#: .\template\app_doc\manage\manage_image.html:65 +#: .\template\app_doc\pro_list.html:185 .\template\app_doc\pro_list.html:187 +#: .\template\app_doc\search_result.html:246 +#: .\template\app_doc\search_result.html:248 .\template\search\search.html:213 +#: .\template\search\search.html:215 +msgid "上一页" +msgstr "上一頁" + +#: .\template\app_doc\manage\manage_attachment.html:72 +#: .\template\app_doc\manage\manage_attachment.html:74 +#: .\template\app_doc\manage\manage_doc_history.html:72 +#: .\template\app_doc\manage\manage_doc_history.html:74 +#: .\template\app_doc\manage\manage_doc_recycle.html:70 +#: .\template\app_doc\manage\manage_doc_recycle.html:72 +#: .\template\app_doc\manage\manage_doctemp.html:74 +#: .\template\app_doc\manage\manage_doctemp.html:76 +#: .\template\app_doc\manage\manage_image.html:74 +#: .\template\app_doc\manage\manage_image.html:76 +#: .\template\app_doc\pro_list.html:196 .\template\app_doc\pro_list.html:198 +#: .\template\app_doc\search_result.html:257 +#: .\template\app_doc\search_result.html:259 .\template\search\search.html:224 +#: .\template\search\search.html:226 +msgid "下一页" +msgstr "下一頁" + +#: .\template\app_doc\manage\manage_collect.html:4 +msgid "收藏管理" +msgstr "收藏管理" + +#: .\template\app_doc\manage\manage_collect.html:7 +#: .\template\app_doc\manage\manage_doc.html:7 +msgid "高级筛选" +msgstr "高級篩選" + +#: .\template\app_doc\manage\manage_collect.html:11 +#: .\template\app_doc\manage\manage_doc.html:11 +msgid "关键词" +msgstr "關鍵詞" + +#: .\template\app_doc\manage\manage_collect.html:18 +msgid "收藏类型" +msgstr "收藏類型" + +#: .\template\app_doc\manage\manage_doc.html:18 +#: .\template\app_doc\manage\manage_overview.html:114 +#: .\template\app_doc\search_result.html:144 .\template\search\search.html:140 +msgid "文集" +msgstr "文集" + +#: .\template\app_doc\manage\manage_doc.html:21 +msgid "按文集筛选" +msgstr "按文集篩選" + +#: .\template\app_doc\manage\manage_doc.html:48 +msgid "文档状态" +msgstr "文檔狀態" + +#: .\template\app_doc\manage\manage_doc_history.html:4 +msgid "文档历史版本管理" +msgstr "文檔歷史版本管理" + +#: .\template\app_doc\manage\manage_doc_history.html:11 +msgid "历史版本管理" +msgstr "歷史版本管理" + +#: .\template\app_doc\manage\manage_doc_history.html:21 +msgid "文档:" +msgstr "文檔:" + +#: .\template\app_doc\manage\manage_doc_history.html:21 +msgid "的历史版本管理" +msgstr "的歷史版本管理" + +#: .\template\app_doc\manage\manage_doc_history.html:34 +msgid "创建人" +msgstr "創建人" + +#: .\template\app_doc\manage\manage_doc_recycle.html:4 +msgid "文档回收站管理" +msgstr "文檔回收站管理" + +#: .\template\app_doc\manage\manage_doc_recycle.html:10 +msgid "还原所有" +msgstr "還原所有" + +#: .\template\app_doc\manage\manage_doc_recycle.html:12 +msgid "清空回收站" +msgstr "清空回收站" + +#: .\template\app_doc\manage\manage_doc_recycle.html:22 +#: .\template\app_doc\manage\manage_project_collaborator.html:94 +msgid "文档名称" +msgstr "文檔名稱" + +#: .\template\app_doc\manage\manage_doc_recycle.html:23 +msgid "上级文档" +msgstr "上級文檔" + +#: .\template\app_doc\manage\manage_doc_recycle.html:24 +msgid "所属文集" +msgstr "所屬文集" + +#: .\template\app_doc\manage\manage_doc_recycle.html:26 +msgid "删除时间" +msgstr "刪除時間" + +#: .\template\app_doc\manage\manage_doc_recycle.html:43 +msgid "还原" +msgstr "還原" + +#: .\template\app_doc\manage\manage_doc_share.html:4 +msgid "文档分享管理" +msgstr "文檔分享管理" + +#: .\template\app_doc\manage\manage_doc_tag.html:4 +#: .\template\app_doc\manage\manage_doc_tag.html:10 +msgid "文档标签管理" +msgstr "文檔標籤管理" + +#: .\template\app_doc\manage\manage_doc_tag.html:29 +msgid "标签名称" +msgstr "標籤名稱" + +#: .\template\app_doc\manage\manage_doc_tag.html:30 +msgid "标签文档数量" +msgstr "標籤文檔數量" + +#: .\template\app_doc\manage\manage_doctemp.html:35 +msgid "模板名称" +msgstr "模板名稱" + +#: .\template\app_doc\manage\manage_image.html:4 +msgid "图片素材管理" +msgstr "圖片素材管理" + +#: .\template\app_doc\manage\manage_image.html:17 +msgid "上传图片" +msgstr "上傳圖片" + +#: .\template\app_doc\manage\manage_image.html:19 +msgid "新建分组" +msgstr "新建分組" + +#: .\template\app_doc\manage\manage_image.html:20 +msgid "分组管理" +msgstr "分組管理" + +#: .\template\app_doc\manage\manage_image_group.html:4 +#: .\template\app_doc\manage\manage_image_group.html:11 +msgid "图片分组管理" +msgstr "圖片分組管理" + +#: .\template\app_doc\manage\manage_image_group.html:10 +msgid "图片管理" +msgstr "圖片管理" + +#: .\template\app_doc\manage\manage_image_group.html:27 +msgid "分组名称" +msgstr "分組名稱" + +#: .\template\app_doc\manage\manage_image_group.html:28 +#: .\template\app_doc\manage\manage_overview.html:45 +msgid "图片数量" +msgstr "圖片數量" + +#: .\template\app_doc\manage\manage_overview.html:15 +msgid "文集总数" +msgstr "文集總數" + +#: .\template\app_doc\manage\manage_overview.html:30 +msgid "文档数量" +msgstr "文檔數量" + +#: .\template\app_doc\manage\manage_overview.html:60 +msgid "附件数量" +msgstr "附件數量" + +#: .\template\app_doc\manage\manage_overview.html:77 +msgid "动态" +msgstr "動態" + +#: .\template\app_doc\manage\manage_overview.html:86 +msgid "修改了文档" +msgstr "修改了文檔" + +#: .\template\app_doc\manage\manage_overview.html:88 +msgid "保存了文档" +msgstr "保存了文檔" + +#: .\template\app_doc\manage\manage_overview.html:90 +msgid "删除了文档" +msgstr "刪除了文檔" + +#: .\template\app_doc\manage\manage_overview.html:102 +msgid "快速草稿" +msgstr "快速草稿" + +#: .\template\app_doc\manage\manage_overview.html:108 +msgid "标题" +msgstr "標題" + +#: .\template\app_doc\manage\manage_overview.html:124 +msgid "指定用户" +msgstr "指定用戶" + +#: .\template\app_doc\manage\manage_overview.html:133 +msgid "文本域" +msgstr "文本域" + +#: .\template\app_doc\manage\manage_overview.html:140 +msgid "保存草稿" +msgstr "保存草稿" + +#: .\template\app_doc\manage\manage_overview.html:141 +msgid "重置" +msgstr "重置" + +#: .\template\app_doc\manage\manage_overview.html:153 +msgid "支持项目发展" +msgstr "支持項目發展" + +#: .\template\app_doc\manage\manage_overview.html:157 +msgid "觅 道 文 档 官 网" +msgstr "覓 道 文 檔 官 網" + +#: .\template\app_doc\manage\manage_overview.html:161 +msgid "使 用 手 册" +msgstr "使 用 手 冊" + +#: .\template\app_doc\manage\manage_overview.html:165 +msgid "源 码 下 载" +msgstr "源 碼 下 載" + +#: .\template\app_doc\manage\manage_project.html:21 +msgid "新增" +msgstr "新增" + +#: .\template\app_doc\manage\manage_project.html:27 +msgid "打包文集" +msgstr "打包文集" + +#: .\template\app_doc\manage\manage_project.html:100 +#: .\template\app_doc\manage\manage_project_collaborator.html:26 +#: .\template\app_doc\manage\manage_project_options.html:37 +#: .\template\app_doc\manage\manage_project_self_colla.html:20 +msgid "文集名称" +msgstr "文集名稱" + +#: .\template\app_doc\manage\manage_project.html:103 +msgid "文档数" +msgstr "文檔數" + +#: .\template\app_doc\manage\manage_project.html:104 +msgid "文集成员" +msgstr "文集成員" + +#: .\template\app_doc\manage\manage_project.html:155 +#: .\template\app_doc\manage\manage_project.html:186 +#: .\template\app_doc\pro_list.html:326 .\template\app_doc\pro_list.html:397 +msgid "确定" +msgstr "確定" + +#: .\template\app_doc\manage\manage_project.html:182 +#: .\template\app_doc\pro_list.html:393 +msgid "修改文集" +msgstr "修改文集" + +#: .\template\app_doc\manage\manage_project_collaborator.html:4 +msgid "文集协作管理" +msgstr "文集協作管理" + +#: .\template\app_doc\manage\manage_project_collaborator.html:11 +msgid "协作管理" +msgstr "協作管理" + +#: .\template\app_doc\manage\manage_project_collaborator.html:17 +msgid "管理文集" +msgstr "管理文集" + +#: .\template\app_doc\manage\manage_project_collaborator.html:33 +msgid "协作人数:" +msgstr "協作人數:" + +#: .\template\app_doc\manage\manage_project_collaborator.html:48 +msgid "协作用户" +msgstr "協作用戶" + +#: .\template\app_doc\manage\manage_project_collaborator.html:49 +msgid "协作文档" +msgstr "協作文檔" + +#: .\template\app_doc\manage\manage_project_collaborator.html:58 +#: .\template\app_doc\manage\manage_self.html:10 +msgid "用户名" +msgstr "用戶名" + +#: .\template\app_doc\manage\manage_project_collaborator.html:59 +msgid "协作权限" +msgstr "協作權限" + +#: .\template\app_doc\manage\manage_project_collaborator.html:69 +msgid "新建文档,修改、删除新建的文档" +msgstr "新建文檔,修改、刪除新建的文檔" + +#: .\template\app_doc\manage\manage_project_collaborator.html:71 +msgid "可操作所有文档" +msgstr "可操作所有文檔" + +#: .\template\app_doc\manage\manage_project_collaborator.html:95 +msgid "创建用户" +msgstr "創建用戶" + +#: .\template\app_doc\manage\manage_project_doc_sort.html:4 +#: .\template\app_doc\manage\manage_project_doc_sort.html:14 +msgid "文集文档排序" +msgstr "文集文檔排序" + +#: .\template\app_doc\manage\manage_project_doc_sort.html:24 +#: .\template\app_doc\manage\manage_project_options.html:17 +msgid "文集:" +msgstr "文集:" + +#: .\template\app_doc\manage\manage_project_doc_sort.html:25 +msgid "保存排序" +msgstr "保存排序" + +#: .\template\app_doc\manage\manage_project_import.html:9 +msgid "导入文集到MrDoc" +msgstr "導入文集到MrDoc" + +#: .\template\app_doc\manage\manage_project_import.html:12 +msgid "导入Markdown文件压缩包" +msgstr "導入Markdown文件壓縮包" + +#: .\template\app_doc\manage\manage_project_import.html:21 +msgid "导入语雀知识库,功能开发中" +msgstr "導入語雀知識庫,功能開發中" + +#: .\template\app_doc\manage\manage_project_import.html:26 +msgid "语雀知识库" +msgstr "語雀知識庫" + +#: .\template\app_doc\manage\manage_project_options.html:4 +#: .\template\app_doc\manage\manage_project_options.html:16 +#: .\template\app_doc\manage\manage_project_transfer.html:4 +#: .\template\app_doc\manage\manage_project_transfer.html:11 +msgid "文集设置" +msgstr "文集設置" + +#: .\template\app_doc\manage\manage_project_options.html:27 +msgid "基础信息" +msgstr "基礎信息" + +#: .\template\app_doc\manage\manage_project_options.html:28 +msgid "权限配置" +msgstr "權限配置" + +#: .\template\app_doc\manage\manage_project_options.html:29 +msgid "下载配置" +msgstr "下載配置" + +#: .\template\app_doc\manage\manage_project_options.html:30 +msgid "管理控制" +msgstr "管理控制" + +#: .\template\app_doc\manage\manage_project_options.html:52 +msgid "输入文集名" +msgstr "輸入文集名" + +#: .\template\app_doc\manage\manage_project_options.html:68 +msgid "文集简介" +msgstr "文集簡介" + +#: .\template\app_doc\manage\manage_project_options.html:77 +msgid "立即修改" +msgstr "立即修改" + +#: .\template\app_doc\manage\manage_project_options.html:86 +msgid "浏览权限" +msgstr "瀏覽權限" + +#: .\template\app_doc\manage\manage_project_options.html:90 +msgid "指定用户可见" +msgstr "指定用戶可見" + +#: .\template\app_doc\manage\manage_project_options.html:91 +msgid "访问码可见" +msgstr "訪問碼可見" + +#: .\template\app_doc\manage\manage_project_options.html:96 +msgid "访问码" +msgstr "訪問碼" + +#: .\template\app_doc\manage\manage_project_options.html:100 +msgid "不少于4位数" +msgstr "不少於4位數" + +#: .\template\app_doc\manage\manage_project_options.html:104 +msgid "允许用户" +msgstr "允許用戶" + +#: .\template\app_doc\manage\manage_project_options.html:107 +msgid "请输入用户名,回车输入多个用户" +msgstr "請輸入用戶名,回車輸入多個……" + +#: .\template\app_doc\manage\manage_project_options.html:114 +msgid "修改权限" +msgstr "修改權限" + +#: .\template\app_doc\manage\manage_project_options.html:124 +msgid "" +"注意:开启某类型文件下载后,请先点击“生成或更新XXX文件”,EPUB格式文件不支持思" +"维导图、公式、流程图等图形" +msgstr "" +"注意:開啟某類型文件下載后,請先點擊“生成或更新XXX文件”,EPUB格式文件不支持思" +"維導圖、公式、流程圖等圖形" + +#: .\template\app_doc\manage\manage_project_options.html:127 +msgid "EPUB下载" +msgstr "EPUB下載" + +#: .\template\app_doc\manage\manage_project_options.html:131 +#: .\template\app_doc\manage\manage_project_options.html:155 +msgid "允许|禁止" +msgstr "允許|禁止" + +#: .\template\app_doc\manage\manage_project_options.html:134 +msgid "生成或更新EPUB文件" +msgstr "生成或更新EPUB文件" + +#: .\template\app_doc\manage\manage_project_options.html:138 +msgid "下载文集EPUB文件" +msgstr "下載文集EPUB文件" + +#: .\template\app_doc\manage\manage_project_options.html:144 +#: .\template\app_doc\manage\manage_project_options.html:168 +msgid "未生成文集导出文件" +msgstr "未生成文集到戶文件" + +#: .\template\app_doc\manage\manage_project_options.html:151 +msgid "PDF下载" +msgstr "PDF下載" + +#: .\template\app_doc\manage\manage_project_options.html:158 +msgid "生成或更新PDF文件" +msgstr "生成或更新PDF文件" + +#: .\template\app_doc\manage\manage_project_options.html:162 +msgid "下载文集PDF文件" +msgstr "下載文集PDF文件" + +#: .\template\app_doc\manage\manage_project_options.html:176 +msgid "保存文集导出配置" +msgstr "保存文集導出配置" + +#: .\template\app_doc\manage\manage_project_options.html:186 +#: .\template\app_doc\manage\manage_project_options.html:189 +msgid "导出文集" +msgstr "導出文集" + +#: .\template\app_doc\manage\manage_project_options.html:187 +msgid "将文集内的文档以Markdown(.md)的形式导出为zip压缩文件" +msgstr "將文集內的文檔以Markdown的形式導出到Zip壓縮文件" + +#: .\template\app_doc\manage\manage_project_options.html:194 +#: .\template\app_doc\manage\manage_project_options.html:197 +#: .\template\app_doc\manage\manage_project_transfer.html:12 +msgid "转让文集" +msgstr "轉讓文集" + +#: .\template\app_doc\manage\manage_project_options.html:195 +msgid "将文集的管理权限和文集下自己创建的文档转让给站点的其他用户" +msgstr "將文集的管理權限和文集下自己創建的文檔轉讓給站點的其他用戶" + +#: .\template\app_doc\manage\manage_project_options.html:203 +msgid "删除文集及文集下的所有文档" +msgstr "刪除文集及文集下的所有文檔" + +#: .\template\app_doc\manage\manage_project_self_colla.html:4 +msgid "我协作的文集" +msgstr "我協作的文集" + +#: .\template\app_doc\manage\manage_project_self_colla.html:11 +msgid "我的协作文集" +msgstr "我的協作文集" + +#: .\template\app_doc\manage\manage_project_self_colla.html:21 +msgid "作者" +msgstr "作者" + +#: .\template\app_doc\manage\manage_project_self_colla.html:22 +msgid "权限" +msgstr "權限" + +#: .\template\app_doc\manage\manage_project_self_colla.html:33 +msgid "初级 - 可新建文档、修改和删除自己创建的文档" +msgstr "初級 - 可新建文檔、修改和刪除自己創建的文檔" + +#: .\template\app_doc\manage\manage_project_self_colla.html:35 +msgid "高级 - 可新建文档、修改所有文档、删除自己创建的文档" +msgstr "高級 - 可新建文檔、修改所有文檔、刪除自己創建的文檔" + +#: .\template\app_doc\manage\manage_project_self_colla.html:41 +#: .\template\app_doc\pro_list.html:110 +msgid "排序" +msgstr "排序" + +#: .\template\app_doc\manage\manage_project_self_colla.html:51 +msgid "你还没有成为任何文集的协作者" +msgstr "你還沒有成為任何文集的協作者" + +#: .\template\app_doc\manage\manage_project_transfer.html:22 +msgid "转让文集:" +msgstr "轉讓文集:" + +#: .\template\app_doc\manage\manage_project_transfer.html:29 +msgid "选择用户,可搜索" +msgstr "選擇用戶,可搜索" + +#: .\template\app_doc\manage\manage_project_transfer.html:37 +msgid "转让文集的管理权限及文档" +msgstr "轉讓文集的管理權限及文檔" + +#: .\template\app_doc\manage\manage_project_transfer.html:63 +msgid "转让成功,即将返回文集列表……" +msgstr "轉讓成功,即將返回文集列表……" + +#: .\template\app_doc\manage\manage_self.html:14 +msgid "不可修改" +msgstr "不可修改" + +#: .\template\app_doc\manage\manage_self.html:17 +msgid "昵称" +msgstr "暱稱" + +#: .\template\app_doc\manage\manage_self.html:19 +msgid "请输入昵称" +msgstr "請輸入暱稱" + +#: .\template\app_doc\manage\manage_self.html:23 +msgid "电子邮箱" +msgstr "電子郵箱" + +#: .\template\app_doc\manage\manage_self.html:25 +msgid "请输入电子邮箱地址" +msgstr "請輸入電子郵箱地址" + +#: .\template\app_doc\manage\manage_self.html:29 +msgid "新密码" +msgstr "新密碼" + +#: .\template\app_doc\manage\manage_self.html:30 +msgid "点击修改密码" +msgstr "點擊修改密碼" + +#: .\template\app_doc\manage\manage_self.html:34 +msgid "编辑器" +msgstr "編輯器" + +#: .\template\app_doc\manage\manage_self.html:44 +msgid "更新个人资料" +msgstr "更新個人資料" + +#: .\template\app_doc\manage\manage_self.html:70 +#: .\template\app_doc\pro_list.html:428 +msgid "确认修改" +msgstr "確認修改" + +#: .\template\app_doc\pro_list.html:14 +msgid "又一个MrDoc站点" +msgstr "又一個覓道文檔站點" + +#: .\template\app_doc\pro_list.html:96 +msgid "筛选" +msgstr "篩選" + +#: .\template\app_doc\pro_list.html:98 .\template\app_doc\pro_list.html:103 +msgid "公开文集" +msgstr "公開文集" + +#: .\template\app_doc\pro_list.html:99 +msgid "私密文集" +msgstr "私密文集" + +#: .\template\app_doc\pro_list.html:100 +msgid "协作文集" +msgstr "協作文集" + +#: .\template\app_doc\pro_list.html:101 .\template\app_doc\pro_list.html:104 +msgid "访问码文集" +msgstr "訪問碼文集" + +#: .\template\app_doc\pro_list.html:111 +msgid "时间升序" +msgstr "時間升序" + +#: .\template\app_doc\pro_list.html:112 +msgid "时间降序" +msgstr "時間降序" + +#: .\template\app_doc\pro_list.html:153 +msgid "此文集没有填写简介" +msgstr "此文集沒有填寫簡介" + +#: .\template\app_doc\pro_list.html:243 +msgid "*在可个人中心对文集权限进行进一步控制" +msgstr "*可在個人中心對文集權限進行進一步控制" + +#: .\template\app_doc\pro_list.html:326 +msgid "创建并添加文档" +msgstr "創建并添加文檔" + +#: .\template\app_doc\project.html:26 +msgid "创建人:" +msgstr "創建人:" + +#: .\template\app_doc\project.html:27 +msgid "创建于:" +msgstr "創建於:" + +#: .\template\app_doc\project.html:36 +msgid "简介" +msgstr "簡介" + +#: .\template\app_doc\project.html:37 +msgid "目录大纲" +msgstr "目錄大綱" + +#: .\template\app_doc\project.html:38 +msgid "最新文档" +msgstr "最新文檔" + +#: .\template\app_doc\project.html:40 +msgid "文集下载" +msgstr "文集下載" + +#: .\template\app_doc\project.html:47 +msgid "暂无文集简介" +msgstr "暫無文集簡介" + +#: .\template\app_doc\project.html:84 .\template\app_doc\project.html:87 +msgid "文集作者未开放此文集的任何格式下载!" +msgstr "文集作者未開放此文集的任何格式下載!" + +#: .\template\app_doc\project_doc_search.html:7 +msgid "的结果" +msgstr "的結果" + +#: .\template\app_doc\project_doc_search.html:12 +msgid "添加文档" +msgstr "添加文檔" + +#: .\template\app_doc\project_doc_search.html:18 +msgid "共有" +msgstr "共有" + +#: .\template\app_doc\project_doc_search.html:18 +msgid "个结果" +msgstr "個結果" + +#: .\template\app_doc\search.html:25 .\template\app_doc\search_result.html:14 +#: .\template\search\search.html:14 +msgid "觅道搜索" +msgstr "覓道搜索" + +#: .\template\app_doc\search_result.html:143 .\template\search\search.html:139 +msgid "文档" +msgstr "文檔" + +#: .\template\app_doc\search_result.html:145 .\template\search\search.html:141 +msgid "标签" +msgstr "標籤" + +#: .\template\app_doc\search_result.html:151 .\template\search\search.html:147 +msgid "时间筛选" +msgstr "時間篩選" + +#: .\template\app_doc\search_result.html:152 .\template\search\search.html:148 +msgid "全部时间" +msgstr "全部時間" + +#: .\template\app_doc\search_result.html:153 .\template\search\search.html:149 +msgid "近1天" +msgstr "近1天" + +#: .\template\app_doc\search_result.html:154 .\template\search\search.html:150 +msgid "近7天" +msgstr "近7天" + +#: .\template\app_doc\search_result.html:155 .\template\search\search.html:151 +msgid "近30天" +msgstr "近30天" + +#: .\template\app_doc\search_result.html:156 .\template\search\search.html:152 +msgid "近1年" +msgstr "近1年" + +#: .\template\app_doc\search_result.html:168 .\template\search\search.html:164 +msgid "觅道文档在" +msgstr "覓道文檔在" + +#: .\template\app_doc\search_result.html:170 .\template\search\search.html:166 +msgid "近1天内" +msgstr "近1天内" + +#: .\template\app_doc\search_result.html:172 .\template\search\search.html:168 +msgid "近7天内" +msgstr "近7天内" + +#: .\template\app_doc\search_result.html:174 .\template\search\search.html:170 +msgid "近30天内" +msgstr "近30天内" + +#: .\template\app_doc\search_result.html:176 .\template\search\search.html:172 +msgid "近一年内" +msgstr "近一年內" + +#: .\template\app_doc\search_result.html:178 .\template\search\search.html:174 +msgid "全部时间内" +msgstr "全部時間內" + +#: .\template\app_doc\search_result.html:180 .\template\search\search.html:176 +msgid "搜索到" +msgstr "搜索到" + +#: .\template\app_doc\search_result.html:180 .\template\search\search.html:176 +msgid "条结果" +msgstr "條結果" + +#: .\template\app_doc\share\share_check.html:13 +msgid "请输入分享码" +msgstr "請輸入分享碼" + +#: .\template\app_doc\share\share_check.html:58 +msgid "你正在访问私密文档:" +msgstr "你正在訪問私密文檔:" + +#: .\template\app_doc\share\share_check.html:64 +msgid "请输入文档分享码" +msgstr "請輸入文檔分享碼" + +#: .\template\app_doc\share\share_doc.html:15 +msgid "文档分享" +msgstr "文檔分享" + +#: .\template\app_doc\tag_doc_base.html:15 +#: .\template\app_doc\tag_doc_base.html:50 +#: .\template\app_doc\tag_doc_base.html:120 +#: .\template\app_doc\tag_doc_single.html:9 .\template\app_doc\tag_docs.html:8 +#: .\template\app_doc\tag_docs.html:11 +msgid "标签:" +msgstr "標籤:" + +#: .\template\app_doc\tag_doc_single.html:77 +msgid "下载" +msgstr "下載" + +#: .\template\app_doc\user\user_center.html:43 +msgid "后台管理" +msgstr "後台管理" + +#: .\template\app_doc\user\user_center.html:45 +msgid "站点首页" +msgstr "站點首頁" + +#: .\template\app_doc\user\user_center.html:46 +msgid "注销登录" +msgstr "註銷登錄" + +#: .\template\app_doc\user\user_center.html:131 +msgid "官方网站" +msgstr "官方網站" + +#: .\template\app_doc\user\user_center.html:136 +msgid "说明文档" +msgstr "說明文檔" + +#: .\template\app_doc\user\user_center.html:141 +msgid "开源地址" +msgstr "開源地址" + +#: .\template\app_doc\user\user_center.html:146 +msgid "QQ群" +msgstr "QQ群" + +#: .\template\app_doc\user\user_center.html:151 +msgid "当前版本:" +msgstr "當前版本:" + +#: .\template\forget_pwd.html:6 .\template\forget_pwd.html:43 +#: .\template\login.html:100 +msgid "忘记密码" +msgstr "忘記密碼" + +#: .\template\forget_pwd.html:43 .\template\login.html:62 +#: .\template\register.html:56 +msgid "觅道文档" +msgstr "覓道文檔" + +#: .\template\forget_pwd.html:50 +msgid "发送验证码" +msgstr "發送驗證碼" + +#: .\template\forget_pwd.html:64 .\template\register.html:98 +msgid "返回登录" +msgstr "返回登錄" + +#: .\template\login.html:12 +msgid "用户登录" +msgstr "用戶登錄" + +#: .\template\login.html:95 +msgid "本站暂不开放注册" +msgstr "本站暫不開放註冊" + +#: .\template\login.html:97 +msgid "注册账号" +msgstr "註冊賬戶" + +#: .\template\register.html:6 +msgid "用户注册" +msgstr "用戶註冊" + +#: .\template\search\search.html:199 +msgid "没有搜索结果。" +msgstr "沒有搜索結果。"