mirror of
https://github.com/kingmo888/rustdesk-api-server.git
synced 2025-09-15 15:28:42 +08:00
Increase English language support
This commit is contained in:
parent
bbf586ff8c
commit
a8b07cbc35
3
.gitignore
vendored
3
.gitignore
vendored
@ -25,4 +25,5 @@ dist_py38
|
||||
|
||||
LICENSE.rst
|
||||
|
||||
db/test_db.sqlite3
|
||||
db/test_db.sqlite3
|
||||
job2en.py
|
||||
@ -1,7 +1,5 @@
|
||||
# rustdesk-api-server
|
||||
|
||||
## 如果项目有帮到你,给个star不过分吧?
|
||||
|
||||
## 请使用客户端最新版本1.2.3
|
||||
|
||||
[The English explanation is available by clicking here.](https://github.com/kingmo888/rustdesk-api-server/blob/master/README_EN.md)
|
||||
@ -9,7 +7,7 @@
|
||||
<p align="center">
|
||||
<i>一个 python 实现的 Rustdesk API 接口,支持 WebUI 管理</i>
|
||||
<br/>
|
||||
<img src ="https://img.shields.io/badge/Version-1.4.8-blueviolet.svg"/>
|
||||
<img src ="https://img.shields.io/badge/Version-1.4.9-blueviolet.svg"/>
|
||||
<img src ="https://img.shields.io/badge/Python-3.7|3.8|3.9|3.10|3.11-blue.svg" />
|
||||
<img src ="https://img.shields.io/badge/Django-3.2+|4.x-yelow.svg" />
|
||||
<br/>
|
||||
@ -142,6 +140,7 @@ services:
|
||||
| `MYSQL_PASSWORD` | 可选,默认 `-` | MYSQL数据库的密码 |
|
||||
| `MYSQL_PORT` | 可选,默认 `3306` | MYSQL数据库端口 |
|
||||
| 数据库配置 | -- 结束 -- | 查看【[sqlite3迁移mysql教程](/tutorial/sqlite2mysql.md)】 |
|
||||
| `LANGUAGE_CODE` | 可选,默认 `zh-hans` | 语言,支持中文(`zh-hans`)、英语(`en`) |
|
||||
|
||||
## 使用问题
|
||||
|
||||
|
||||
@ -5,14 +5,14 @@ from django import forms
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
|
||||
class UserCreationForm(forms.ModelForm):
|
||||
"""A form for creating new users. Includes all the required
|
||||
fields, plus a repeated password."""
|
||||
password1 = forms.CharField(label='密码', widget=forms.PasswordInput)
|
||||
password2 = forms.CharField(label='再次输入密码', widget=forms.PasswordInput)
|
||||
password1 = forms.CharField(label=_('密码'), widget=forms.PasswordInput)
|
||||
password2 = forms.CharField(label=_('再次输入密码'), widget=forms.PasswordInput)
|
||||
|
||||
class Meta:
|
||||
model = models.UserProfile
|
||||
@ -23,7 +23,7 @@ class UserCreationForm(forms.ModelForm):
|
||||
password1 = self.cleaned_data.get("password1")
|
||||
password2 = self.cleaned_data.get("password2")
|
||||
if password1 and password2 and password1 != password2:
|
||||
raise forms.ValidationError("密码校验失败,两次密码不一致。")
|
||||
raise forms.ValidationError(_("密码校验失败,两次密码不一致。"))
|
||||
return password2
|
||||
|
||||
|
||||
@ -41,7 +41,7 @@ class UserChangeForm(forms.ModelForm):
|
||||
the user, but replaces the password field with admin's
|
||||
password hash display field.
|
||||
"""
|
||||
password = ReadOnlyPasswordHashField(label=("密码Hash值"), help_text=("<a href=\"../password/\">点击修改密码</a>."))
|
||||
password = ReadOnlyPasswordHashField(label=(_("密码Hash值")), help_text=("<a href=\"../password/\">点击修改密码</a>."))
|
||||
class Meta:
|
||||
model = models.UserProfile
|
||||
fields = ('username', 'is_active', 'is_admin')
|
||||
@ -72,7 +72,7 @@ class UserAdmin(BaseUserAdmin):
|
||||
list_display = ('username', 'rid')
|
||||
list_filter = ('is_admin', 'is_active')
|
||||
fieldsets = (
|
||||
('基本信息', {'fields': ('username', 'password', 'is_active', 'is_admin', 'rid', 'uuid', 'deviceInfo',)}),
|
||||
(_('基本信息'), {'fields': ('username', 'password', 'is_active', 'is_admin', 'rid', 'uuid', 'deviceInfo',)}),
|
||||
|
||||
)
|
||||
readonly_fields = ( 'rid', 'uuid')
|
||||
@ -95,5 +95,5 @@ admin.site.register(models.RustDeskPeer, models.RustDeskPeerAdmin)
|
||||
admin.site.register(models.RustDesDevice, models.RustDesDeviceAdmin)
|
||||
admin.site.register(models.ShareLink, models.ShareLinkAdmin)
|
||||
admin.site.unregister(Group)
|
||||
admin.site.site_header = 'RustDesk自建Web'
|
||||
admin.site.site_title = '未定义'
|
||||
admin.site.site_header = _('RustDesk自建Web')
|
||||
admin.site.site_title = _('未定义')
|
||||
60
api/front_locale.py
Normal file
60
api/front_locale.py
Normal file
@ -0,0 +1,60 @@
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
|
||||
_('管理后台')
|
||||
_('ID列表')
|
||||
_('分享机器')
|
||||
_('这么简易的东西,忘记密码这功能就没必要了吧。')
|
||||
_('立即注册')
|
||||
_('创建时间')
|
||||
_('注册成功,请前往登录页登录。')
|
||||
_('注册日期')
|
||||
_('2、所分享的机器,被分享人享有相同的权限,如果机器设置了保存密码,被分享人也可以直接连接。')
|
||||
_('导出xlsx')
|
||||
_('生成分享链接')
|
||||
_('请输入8~20位密码。可以包含字母、数字和特殊字符。')
|
||||
_('尾页')
|
||||
_('请确认密码')
|
||||
_('注册')
|
||||
_('内存')
|
||||
_('首页')
|
||||
_('网页控制')
|
||||
_('注册时间')
|
||||
_('链接地址')
|
||||
_('请输入密码')
|
||||
_('系统用户名')
|
||||
_('状态')
|
||||
_('已有账号?立即登录')
|
||||
_('密码')
|
||||
_('别名')
|
||||
_('上一页')
|
||||
_('更新时间')
|
||||
_('综合屏')
|
||||
_('平台')
|
||||
_('全部用户')
|
||||
_('注册页')
|
||||
_('分享机器给其他用户')
|
||||
_('所有设备')
|
||||
_('连接密码')
|
||||
_('设备统计')
|
||||
_('所属用户')
|
||||
_('分享')
|
||||
_('请输入用户名')
|
||||
_('1、链接有效期为15分钟,切勿随意分享给他人。')
|
||||
_('CPU')
|
||||
_('客户端ID')
|
||||
_('下一页')
|
||||
_('登录')
|
||||
_('退出')
|
||||
_('请将要分享的机器调整到右侧')
|
||||
_('成功!如需分享,请复制以下链接给其他人:<br>')
|
||||
_('忘记密码?')
|
||||
_('计算机名')
|
||||
_('两次输入密码不一致!')
|
||||
_('页码')
|
||||
_('版本')
|
||||
_('用户名')
|
||||
_('3、为保障安全,链接有效期为15分钟、链接仅有效1次。链接一旦被(非分享人的登录用户)访问,分享生效,后续访问链接失效。')
|
||||
_('系统')
|
||||
_('我的机器')
|
||||
_('信息')
|
||||
238
api/migrations/0003_alter_rustdesdevice_options_and_more.py
Normal file
238
api/migrations/0003_alter_rustdesdevice_options_and_more.py
Normal file
@ -0,0 +1,238 @@
|
||||
# Generated by Django 4.2.7 on 2024-03-15 20:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("api", "0002_alter_rustdesdevice_cpu_alter_rustdesdevice_hostname_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesdevice",
|
||||
options={
|
||||
"ordering": ("-rid",),
|
||||
"verbose_name": "Device",
|
||||
"verbose_name_plural": "Device List",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdeskpeer",
|
||||
options={
|
||||
"ordering": ("-username",),
|
||||
"verbose_name": "Peers",
|
||||
"verbose_name_plural": "Peers List",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesktag",
|
||||
options={
|
||||
"ordering": ("-uid",),
|
||||
"verbose_name": "Tags",
|
||||
"verbose_name_plural": "Tags List",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesktoken",
|
||||
options={
|
||||
"ordering": ("-username",),
|
||||
"verbose_name": "Token",
|
||||
"verbose_name_plural": "Token List",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="sharelink",
|
||||
options={
|
||||
"ordering": ("-create_time",),
|
||||
"verbose_name": "Share Link",
|
||||
"verbose_name_plural": "Link List",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="userprofile",
|
||||
options={
|
||||
"permissions": (
|
||||
("view_task", "Can see available tasks"),
|
||||
("change_task_status", "Can change the status of tasks"),
|
||||
("close_task", "Can remove a task by setting its status as closed"),
|
||||
),
|
||||
"verbose_name": "User",
|
||||
"verbose_name_plural": "User List",
|
||||
},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(
|
||||
auto_now_add=True, verbose_name="Device Registration Time"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="hostname",
|
||||
field=models.CharField(max_length=100, verbose_name="Hostname"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="memory",
|
||||
field=models.CharField(max_length=100, verbose_name="Memory"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="os",
|
||||
field=models.CharField(max_length=100, verbose_name="Operating System"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="rid",
|
||||
field=models.CharField(blank=True, max_length=60, verbose_name="Client ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="username",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=100, verbose_name="System Username"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="version",
|
||||
field=models.CharField(max_length=100, verbose_name="Client Version"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="alias",
|
||||
field=models.CharField(max_length=30, verbose_name="Alias"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="hostname",
|
||||
field=models.CharField(max_length=30, verbose_name="Operating System Name"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="platform",
|
||||
field=models.CharField(max_length=30, verbose_name="Platform"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="rhash",
|
||||
field=models.CharField(
|
||||
max_length=60, verbose_name="Device Connection Password"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="rid",
|
||||
field=models.CharField(max_length=60, verbose_name="Client ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="tags",
|
||||
field=models.CharField(max_length=30, verbose_name="Tag"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="User ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="username",
|
||||
field=models.CharField(max_length=20, verbose_name="System Username"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="tag_color",
|
||||
field=models.CharField(blank=True, max_length=60, verbose_name="Tag Color"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="tag_name",
|
||||
field=models.CharField(max_length=60, verbose_name="Tag Name"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="Belongs to User ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="access_token",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=60, verbose_name="Access Token"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name="Login Time"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="User ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="username",
|
||||
field=models.CharField(max_length=20, verbose_name="Username"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="uuid",
|
||||
field=models.CharField(max_length=60, verbose_name="UUID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name="Creation Time"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="is_expired",
|
||||
field=models.BooleanField(default=False, verbose_name="Is Expired"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="is_used",
|
||||
field=models.BooleanField(default=False, verbose_name="Is Used"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="peers",
|
||||
field=models.CharField(max_length=20, verbose_name="Machine ID List"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="shash",
|
||||
field=models.CharField(max_length=60, verbose_name="Link Key"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="User ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="deviceInfo",
|
||||
field=models.TextField(blank=True, verbose_name="Login Information:"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="is_active",
|
||||
field=models.BooleanField(default=True, verbose_name="Is Activated"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="is_admin",
|
||||
field=models.BooleanField(default=False, verbose_name="Is Admin"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="username",
|
||||
field=models.CharField(max_length=50, unique=True, verbose_name="Username"),
|
||||
),
|
||||
]
|
||||
232
api/migrations/0004_alter_rustdesdevice_options_and_more.py
Normal file
232
api/migrations/0004_alter_rustdesdevice_options_and_more.py
Normal file
@ -0,0 +1,232 @@
|
||||
# Generated by Django 4.2.7 on 2024-03-15 23:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("api", "0003_alter_rustdesdevice_options_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesdevice",
|
||||
options={
|
||||
"ordering": ("-rid",),
|
||||
"verbose_name": "设备",
|
||||
"verbose_name_plural": "设备列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdeskpeer",
|
||||
options={
|
||||
"ordering": ("-username",),
|
||||
"verbose_name": "Peers",
|
||||
"verbose_name_plural": "Peers列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesktag",
|
||||
options={
|
||||
"ordering": ("-uid",),
|
||||
"verbose_name": "Tags",
|
||||
"verbose_name_plural": "Tags列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="rustdesktoken",
|
||||
options={
|
||||
"ordering": ("-username",),
|
||||
"verbose_name": "Token",
|
||||
"verbose_name_plural": "Token列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="sharelink",
|
||||
options={
|
||||
"ordering": ("-create_time",),
|
||||
"verbose_name": "分享链接",
|
||||
"verbose_name_plural": "链接列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name="userprofile",
|
||||
options={
|
||||
"permissions": (
|
||||
("view_task", "Can see available tasks"),
|
||||
("change_task_status", "Can change the status of tasks"),
|
||||
("close_task", "Can remove a task by setting its status as closed"),
|
||||
),
|
||||
"verbose_name": "用户",
|
||||
"verbose_name_plural": "用户列表",
|
||||
},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name="设备注册时间"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="hostname",
|
||||
field=models.CharField(max_length=100, verbose_name="主机名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="memory",
|
||||
field=models.CharField(max_length=100, verbose_name="内存"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="os",
|
||||
field=models.CharField(max_length=100, verbose_name="操作系统"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="rid",
|
||||
field=models.CharField(blank=True, max_length=60, verbose_name="客户端ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="username",
|
||||
field=models.CharField(blank=True, max_length=100, verbose_name="系统用户名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesdevice",
|
||||
name="version",
|
||||
field=models.CharField(max_length=100, verbose_name="客户端版本"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="alias",
|
||||
field=models.CharField(max_length=30, verbose_name="别名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="hostname",
|
||||
field=models.CharField(max_length=30, verbose_name="操作系统名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="platform",
|
||||
field=models.CharField(max_length=30, verbose_name="平台"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="rhash",
|
||||
field=models.CharField(max_length=60, verbose_name="设备链接密码"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="rid",
|
||||
field=models.CharField(max_length=60, verbose_name="客户端ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="tags",
|
||||
field=models.CharField(max_length=30, verbose_name="标签"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="用户ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdeskpeer",
|
||||
name="username",
|
||||
field=models.CharField(max_length=20, verbose_name="系统用户名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="tag_color",
|
||||
field=models.CharField(blank=True, max_length=60, verbose_name="标签颜色"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="tag_name",
|
||||
field=models.CharField(max_length=60, verbose_name="标签名称"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktag",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="所属用户ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="access_token",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=60, verbose_name="access_token"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name="登录时间"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="用户ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="username",
|
||||
field=models.CharField(max_length=20, verbose_name="用户名"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="rustdesktoken",
|
||||
name="uuid",
|
||||
field=models.CharField(max_length=60, verbose_name="uuid"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="create_time",
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name="生成时间"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="is_expired",
|
||||
field=models.BooleanField(default=False, verbose_name="是否过期"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="is_used",
|
||||
field=models.BooleanField(default=False, verbose_name="是否使用"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="peers",
|
||||
field=models.CharField(max_length=20, verbose_name="机器ID列表"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="shash",
|
||||
field=models.CharField(max_length=60, verbose_name="链接Key"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="sharelink",
|
||||
name="uid",
|
||||
field=models.CharField(max_length=16, verbose_name="用户ID"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="deviceInfo",
|
||||
field=models.TextField(blank=True, verbose_name="登录信息:"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="is_active",
|
||||
field=models.BooleanField(default=True, verbose_name="是否激活"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="is_admin",
|
||||
field=models.BooleanField(default=False, verbose_name="是否管理员"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="userprofile",
|
||||
name="username",
|
||||
field=models.CharField(max_length=50, unique=True, verbose_name="用户名"),
|
||||
),
|
||||
]
|
||||
@ -4,7 +4,7 @@ from django.contrib.auth.models import (
|
||||
BaseUserManager,AbstractBaseUser,PermissionsMixin
|
||||
)
|
||||
from .models_work import *
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
class MyUserManager(BaseUserManager):
|
||||
def create_user(self, username, password=None):
|
||||
@ -29,7 +29,7 @@ class MyUserManager(BaseUserManager):
|
||||
|
||||
|
||||
class UserProfile(AbstractBaseUser, PermissionsMixin):
|
||||
username = models.CharField('用户名',
|
||||
username = models.CharField(_('用户名'),
|
||||
unique=True,
|
||||
max_length=50)
|
||||
|
||||
@ -37,10 +37,10 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
|
||||
uuid = models.CharField(verbose_name='uuid', max_length=60)
|
||||
autoLogin = models.BooleanField(verbose_name='autoLogin', default=True)
|
||||
rtype = models.CharField(verbose_name='rtype', max_length=20)
|
||||
deviceInfo = models.TextField(verbose_name='登录信息:', blank=True)
|
||||
deviceInfo = models.TextField(verbose_name=_('登录信息:'), blank=True)
|
||||
|
||||
is_active = models.BooleanField(verbose_name='是否激活', default=True)
|
||||
is_admin = models.BooleanField(verbose_name='是否管理员', default=False)
|
||||
is_active = models.BooleanField(verbose_name=_('是否激活'), default=True)
|
||||
is_admin = models.BooleanField(verbose_name=_('是否管理员'), default=False)
|
||||
|
||||
objects = MyUserManager()
|
||||
|
||||
@ -79,8 +79,8 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
|
||||
|
||||
class Meta:
|
||||
|
||||
verbose_name = "用户"
|
||||
verbose_name_plural = "用户列表"
|
||||
verbose_name = _("用户")
|
||||
verbose_name_plural = _("用户列表")
|
||||
permissions = (
|
||||
("view_task", "Can see available tasks"),
|
||||
("change_task_status", "Can change the status of tasks"),
|
||||
|
||||
@ -1,22 +1,22 @@
|
||||
# cython:language_level=3
|
||||
from django.db import models
|
||||
from django.contrib import admin
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
class RustDeskToken(models.Model):
|
||||
''' Token
|
||||
'''
|
||||
username = models.CharField(verbose_name='用户名', max_length=20)
|
||||
rid = models.CharField(verbose_name='RustDesk ID', max_length=16)
|
||||
uid = models.CharField(verbose_name='用户ID', max_length=16)
|
||||
uuid = models.CharField(verbose_name='uuid', max_length=60)
|
||||
access_token = models.CharField(verbose_name='access_token', max_length=60, blank=True)
|
||||
create_time = models.DateTimeField(verbose_name='登录时间', auto_now_add=True)
|
||||
username = models.CharField(verbose_name=_('用户名'), max_length=20)
|
||||
rid = models.CharField(verbose_name=_('RustDesk ID'), max_length=16)
|
||||
uid = models.CharField(verbose_name=_('用户ID'), max_length=16)
|
||||
uuid = models.CharField(verbose_name=_('uuid'), max_length=60)
|
||||
access_token = models.CharField(verbose_name=_('access_token'), max_length=60, blank=True)
|
||||
create_time = models.DateTimeField(verbose_name=_('登录时间'), auto_now_add=True)
|
||||
#expire_time = models.DateTimeField(verbose_name='过期时间')
|
||||
class Meta:
|
||||
ordering = ('-username',)
|
||||
verbose_name = "Token"
|
||||
verbose_name_plural = "Token列表"
|
||||
verbose_name_plural = _("Token列表")
|
||||
|
||||
class RustDeskTokenAdmin(admin.ModelAdmin):
|
||||
list_display = ('username', 'uid')
|
||||
@ -27,14 +27,14 @@ class RustDeskTokenAdmin(admin.ModelAdmin):
|
||||
class RustDeskTag(models.Model):
|
||||
''' Tags
|
||||
'''
|
||||
uid = models.CharField(verbose_name='所属用户ID', max_length=16)
|
||||
tag_name = models.CharField(verbose_name='标签名称', max_length=60)
|
||||
tag_color = models.CharField(verbose_name='标签颜色', max_length=60, blank=True)
|
||||
uid = models.CharField(verbose_name=_('所属用户ID'), max_length=16)
|
||||
tag_name = models.CharField(verbose_name=_('标签名称'), max_length=60)
|
||||
tag_color = models.CharField(verbose_name=_('标签颜色'), max_length=60, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ('-uid',)
|
||||
verbose_name = "Tags"
|
||||
verbose_name_plural = "Tags列表"
|
||||
verbose_name_plural = _("Tags列表")
|
||||
|
||||
class RustDeskTagAdmin(admin.ModelAdmin):
|
||||
list_display = ('tag_name', 'uid', 'tag_color')
|
||||
@ -45,19 +45,19 @@ class RustDeskTagAdmin(admin.ModelAdmin):
|
||||
class RustDeskPeer(models.Model):
|
||||
''' Pees
|
||||
'''
|
||||
uid = models.CharField(verbose_name='用户ID', max_length=16)
|
||||
rid = models.CharField(verbose_name='客户端ID', max_length=60)
|
||||
username = models.CharField(verbose_name='系统用户名', max_length=20)
|
||||
hostname = models.CharField(verbose_name='操作系统名', max_length=30)
|
||||
alias = models.CharField(verbose_name='别名', max_length=30)
|
||||
platform = models.CharField(verbose_name='平台', max_length=30)
|
||||
tags = models.CharField(verbose_name='标签', max_length=30)
|
||||
rhash = models.CharField(verbose_name='设备链接密码', max_length=60)
|
||||
uid = models.CharField(verbose_name=_('用户ID'), max_length=16)
|
||||
rid = models.CharField(verbose_name=_('客户端ID'), max_length=60)
|
||||
username = models.CharField(verbose_name=_('系统用户名'), max_length=20)
|
||||
hostname = models.CharField(verbose_name=_('操作系统名'), max_length=30)
|
||||
alias = models.CharField(verbose_name=_('别名'), max_length=30)
|
||||
platform = models.CharField(verbose_name=_('平台'), max_length=30)
|
||||
tags = models.CharField(verbose_name=_('标签'), max_length=30)
|
||||
rhash = models.CharField(verbose_name=_('设备链接密码'), max_length=60)
|
||||
|
||||
class Meta:
|
||||
ordering = ('-username',)
|
||||
verbose_name = "Peers"
|
||||
verbose_name_plural = "Peers列表"
|
||||
verbose_name_plural = _("Peers列表" )
|
||||
|
||||
|
||||
class RustDeskPeerAdmin(admin.ModelAdmin):
|
||||
@ -67,21 +67,21 @@ class RustDeskPeerAdmin(admin.ModelAdmin):
|
||||
|
||||
|
||||
class RustDesDevice(models.Model):
|
||||
rid = models.CharField(verbose_name='客户端ID', max_length=60, blank=True)
|
||||
rid = models.CharField(verbose_name=_('客户端ID'), max_length=60, blank=True)
|
||||
cpu = models.CharField(verbose_name='CPU', max_length=100)
|
||||
hostname = models.CharField(verbose_name='主机名', max_length=100)
|
||||
memory = models.CharField(verbose_name='内存', max_length=100)
|
||||
os = models.CharField(verbose_name='操作系统', max_length=100)
|
||||
hostname = models.CharField(verbose_name=_('主机名'), max_length=100)
|
||||
memory = models.CharField(verbose_name=_('内存'), max_length=100)
|
||||
os = models.CharField(verbose_name=_('操作系统'), max_length=100)
|
||||
uuid = models.CharField(verbose_name='uuid', max_length=100)
|
||||
username = models.CharField(verbose_name='系统用户名', max_length=100, blank=True)
|
||||
version = models.CharField(verbose_name='客户端版本', max_length=100)
|
||||
create_time = models.DateTimeField(verbose_name='设备注册时间', auto_now_add=True)
|
||||
update_time = models.DateTimeField(verbose_name='设备更新时间', auto_now=True, blank=True)
|
||||
username = models.CharField(verbose_name=_('系统用户名'), max_length=100, blank=True)
|
||||
version = models.CharField(verbose_name=_('客户端版本'), max_length=100)
|
||||
create_time = models.DateTimeField(verbose_name=_('设备注册时间'), auto_now_add=True)
|
||||
update_time = models.DateTimeField(verbose_name=('设备更新时间'), auto_now=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ('-rid',)
|
||||
verbose_name = "设备"
|
||||
verbose_name_plural = "设备列表"
|
||||
verbose_name = _("设备")
|
||||
verbose_name_plural = _("设备列表" )
|
||||
|
||||
class RustDesDeviceAdmin(admin.ModelAdmin):
|
||||
list_display = ('rid', 'hostname', 'memory', 'uuid', 'version', 'create_time', 'update_time')
|
||||
@ -93,19 +93,19 @@ class RustDesDeviceAdmin(admin.ModelAdmin):
|
||||
class ShareLink(models.Model):
|
||||
''' 分享链接
|
||||
'''
|
||||
uid = models.CharField(verbose_name='用户ID', max_length=16)
|
||||
shash = models.CharField(verbose_name='链接Key', max_length=60)
|
||||
peers = models.CharField(verbose_name='机器ID列表', max_length=20)
|
||||
is_used = models.BooleanField(verbose_name='是否使用', default=False)
|
||||
is_expired = models.BooleanField(verbose_name='是否过期', default=False)
|
||||
create_time = models.DateTimeField(verbose_name='生成时间', auto_now_add=True)
|
||||
uid = models.CharField(verbose_name=_('用户ID'), max_length=16)
|
||||
shash = models.CharField(verbose_name=_('链接Key'), max_length=60)
|
||||
peers = models.CharField(verbose_name=_('机器ID列表'), max_length=20)
|
||||
is_used = models.BooleanField(verbose_name=_('是否使用'), default=False)
|
||||
is_expired = models.BooleanField(verbose_name=_('是否过期'), default=False)
|
||||
create_time = models.DateTimeField(verbose_name=_('生成时间'), auto_now_add=True)
|
||||
|
||||
|
||||
|
||||
class Meta:
|
||||
ordering = ('-create_time',)
|
||||
verbose_name = "分享链接"
|
||||
verbose_name_plural = "链接列表"
|
||||
verbose_name = _("分享链接")
|
||||
verbose_name_plural = _("链接列表" )
|
||||
|
||||
|
||||
class ShareLinkAdmin(admin.ModelAdmin):
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
@ -27,19 +28,19 @@
|
||||
</script>
|
||||
|
||||
<ul class="layui-nav">
|
||||
<li class="layui-nav-item"><a href="/">首页</a></li>
|
||||
<li class="layui-nav-item"><a href="/">{% trans "首页" %}</a></li>
|
||||
{% if u.is_admin %}
|
||||
<li class="layui-nav-item"><a href="/api/work?show_type=admin">所有设备</a>
|
||||
<li class="layui-nav-item"><a href="/api/work?show_type=admin">{% trans "所有设备" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="layui-nav-item"><a href="/api/share">分享</a></li>
|
||||
<li class="layui-nav-item"><a href="/webui" target="_blank">网页控制</a></li>
|
||||
<li class="layui-nav-item"><a href="/api/share">{% trans "分享" %}</a></li>
|
||||
<li class="layui-nav-item"><a href="/webui" target="_blank">{% trans "网页控制" %}</a></li>
|
||||
|
||||
{% if u.is_admin %}
|
||||
<li class="layui-nav-item"><a href="/admin" target="_blank">管理后台</a>
|
||||
<li class="layui-nav-item"><a href="/admin" target="_blank">{% trans "管理后台" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="layui-nav-item"><a href="/api/user_action?action=logout" target="_blank">退出</a></li>
|
||||
<li class="layui-nav-item"><a href="/api/user_action?action=logout" target="_blank">{% trans "退出" %}</a></li>
|
||||
</ul>
|
||||
|
||||
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
{% load static %}
|
||||
{% load my_filters %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
|
||||
<title>登录_【RustDeskWeb】</title>
|
||||
<title>{{ "登录" | translate }}_【RustDeskWeb】</title>
|
||||
<link rel="stylesheet" href="{% static 'layui/css/layui.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'layui/css/style.css' %}">
|
||||
|
||||
@ -13,21 +14,21 @@
|
||||
<body>
|
||||
|
||||
<div class="login-main">
|
||||
<header class="layui-elip">登录</header>
|
||||
<header class="layui-elip">{{ "登录" | translate }}</header>
|
||||
<form class="layui-form">
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="account" required lay-verify="required" placeholder="用户名" autocomplete="off"
|
||||
<input type="text" name="account" required lay-verify="required" placeholder="{{ "用户名" | translate }}" autocomplete="off"
|
||||
class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="password" name="password" required lay-verify="required" placeholder="密码" autocomplete="off"
|
||||
<input type="password" name="password" required lay-verify="required" placeholder="{{ "密码" | translate }}" autocomplete="off"
|
||||
class="layui-input">
|
||||
</div>
|
||||
<div class="layui-input-inline login-btn">
|
||||
<button lay-submit lay-filter="login" class="layui-btn">登录</button>
|
||||
<button lay-submit lay-filter="login" class="layui-btn">{{ "登录" | translate }}</button>
|
||||
</div>
|
||||
<hr/>
|
||||
<p><a href="/api/user_action?action=register" class="fl">立即注册</a><a href="javascript:;" class="fr">忘记密码?</a></p>
|
||||
<p><a href="/api/user_action?action=register" class="fl">{{ "立即注册" | translate }}</a><a href="javascript:;" class="fr">{{ "忘记密码?" | translate }}</a></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@ -59,7 +60,7 @@
|
||||
return false;
|
||||
})
|
||||
$('.fr').on('click', function(){
|
||||
layer.alert("这么简易的东西,忘记密码这功能就没必要了吧。",{icon:5});
|
||||
layer.alert("{{ "这么简易的东西,忘记密码这功能就没必要了吧。" | translate }}",{icon:5});
|
||||
})
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% load my_filters %}
|
||||
{% block title %}{{title}}{% endblock %}
|
||||
{% block legend_name %}信息{% endblock %}
|
||||
{% block legend_name %}{{ "信息" | translate }}{% endblock %}
|
||||
{% block content %}
|
||||
<div style="padding: 20px; background-color: #F2F2F2;">
|
||||
<div class="layui-row layui-col-space15">
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
{% load static %}
|
||||
{% load my_filters %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
@ -6,7 +7,7 @@
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>注册_【RustDeskWeb】</title>
|
||||
<title>{{ "注册" | translate }}_【RustDeskWeb】</title>
|
||||
<link rel="stylesheet" href="{% static 'layui/css/layui.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'layui/css/style.css' %}">
|
||||
<link rel="icon" href="../frame/static/image/code.png">
|
||||
@ -14,14 +15,14 @@
|
||||
<body>
|
||||
|
||||
<div class="login-main">
|
||||
<header class="layui-elip" style="width: 82%">注册页</header>
|
||||
<header class="layui-elip" style="width: 82%">{{ "注册页" | translate }}</header>
|
||||
|
||||
<!-- 表单选项 -->
|
||||
<form class="layui-form">
|
||||
<div class="layui-input-inline">
|
||||
<!-- 用户名 -->
|
||||
<div class="layui-inline" style="width: 85%">
|
||||
<input type="text" id="user" name="account" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
|
||||
<input type="text" id="user" name="account" required lay-verify="required" placeholder="{{ "请输入用户名" | translate }}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<!-- 对号 -->
|
||||
<div class="layui-inline">
|
||||
@ -35,7 +36,7 @@
|
||||
<!-- 密码 -->
|
||||
<div class="layui-input-inline">
|
||||
<div class="layui-inline" style="width: 85%">
|
||||
<input type="password" id="pwd" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
|
||||
<input type="password" id="pwd" name="password" required lay-verify="required" placeholder="{{ "请输入密码" | translate }}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<!-- 对号 -->
|
||||
<div class="layui-inline">
|
||||
@ -49,7 +50,7 @@
|
||||
<!-- 确认密码 -->
|
||||
<div class="layui-input-inline">
|
||||
<div class="layui-inline" style="width: 85%">
|
||||
<input type="password" id="rpwd" name="repassword" required lay-verify="required" placeholder="请确认密码" autocomplete="off" class="layui-input">
|
||||
<input type="password" id="rpwd" name="repassword" required lay-verify="required" placeholder="{{ "请确认密码" | translate }}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<!-- 对号 -->
|
||||
<div class="layui-inline">
|
||||
@ -63,10 +64,10 @@
|
||||
|
||||
|
||||
<div class="layui-input-inline login-btn" style="width: 85%">
|
||||
<button type="submit" lay-submit lay-filter="sub" class="layui-btn">注册</button>
|
||||
<button type="submit" lay-submit lay-filter="sub" class="layui-btn">{{ "注册" | translate }}</button>
|
||||
</div>
|
||||
<hr style="width: 85%" />
|
||||
<p style="width: 85%"><a href="/api/user_action?action=login" class="fl">已有账号?立即登录</a></p>
|
||||
<p style="width: 85%"><a href="/api/user_action?action=login" class="fl">{{ "已有账号?立即登录" | translate }}</a></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@ -94,7 +95,7 @@
|
||||
//layer.msg('请输入合法密码');
|
||||
$('#pwr').removeAttr('hidden');
|
||||
$('#pri').attr('hidden','hidden');
|
||||
layer.msg('请输入8~20位密码。可以包含字母、数字和特殊字符。');
|
||||
layer.msg('{{ "请输入8~20位密码。可以包含字母、数字和特殊字符。" | translate }}');
|
||||
}else {
|
||||
$('#pri').removeAttr('hidden');
|
||||
$('#pwr').attr('hidden','hidden');
|
||||
@ -106,7 +107,7 @@
|
||||
if($('#pwd').val() != $('#rpwd').val()){
|
||||
$('#rpwr').removeAttr('hidden');
|
||||
$('#rpri').attr('hidden','hidden');
|
||||
layer.msg('两次输入密码不一致!');
|
||||
layer.msg('{{ "两次输入密码不一致!" | translate }}');
|
||||
}else {
|
||||
$('#rpri').removeAttr('hidden');
|
||||
$('#rpwr').attr('hidden','hidden');
|
||||
@ -126,7 +127,7 @@
|
||||
},
|
||||
success:function(data){
|
||||
if (data.code == 1) {
|
||||
layer.msg('注册成功,请前往登录页登录。');
|
||||
layer.msg('{{ "注册成功,请前往登录页登录。" | translate }}');
|
||||
///location.href = "login.html";
|
||||
}else {
|
||||
layer.msg(data.msg);
|
||||
|
||||
@ -1,20 +1,21 @@
|
||||
|
||||
{% extends "base.html" %}{% load static %}
|
||||
{% block title %}分享机器{% endblock %}
|
||||
{% load my_filters %}
|
||||
{% block title %}{{ "分享机器" | translate }}{% endblock %}
|
||||
{% block link %}<link rel="stylesheet" href="{% static 'layui/css/style.css' %}">{% endblock %}
|
||||
{% block legend_name %}分享机器给其他用户{% endblock %}
|
||||
{% block legend_name %}{{ "分享机器给其他用户" | translate }}{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
|
||||
<div class="layui-container">
|
||||
<div class="layui-card layui-col-md3-offset2">
|
||||
<div class="layui-card-header">请将要分享的机器调整到右侧</div>
|
||||
<div class="layui-card-header">{{ "请将要分享的机器调整到右侧" | translate }}</div>
|
||||
<div id="showdevice"></div>
|
||||
<button id="create" type="button" class="layui-btn padding-5" lay-on="getData">生成分享链接</button>
|
||||
<button id="create" type="button" class="layui-btn padding-5" lay-on="getData">{{ "生成分享链接" | translate }}</button>
|
||||
</div>
|
||||
<div class="layui-card">1、链接有效期为15分钟,切勿随意分享给他人。</div>
|
||||
<div class="layui-card">2、所分享的机器,被分享人享有相同的权限,如果机器设置了保存密码,被分享人也可以直接连接。</div>
|
||||
<div class="layui-card">3、为保障安全,链接有效期为15分钟、链接仅有效1次。链接一旦被(非分享人的登录用户)访问,分享生效,后续访问链接失效。</div>
|
||||
<div class="layui-card">{{ "1、链接有效期为15分钟,切勿随意分享给他人。" | translate }}</div>
|
||||
<div class="layui-card">{{ "2、所分享的机器,被分享人享有相同的权限,如果机器设置了保存密码,被分享人也可以直接连接。" | translate }}</div>
|
||||
<div class="layui-card">{{ "3、为保障安全,链接有效期为15分钟、链接仅有效1次。链接一旦被(非分享人的登录用户)访问,分享生效,后续访问链接失效。" | translate }}</div>
|
||||
|
||||
<div class="layui-card layui-col-md6-offset1">
|
||||
<table class="layui-table">
|
||||
@ -26,9 +27,9 @@
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>链接地址</th>
|
||||
<th>创建时间</th>
|
||||
<th>ID列表</th>
|
||||
<th>{{ "链接地址" | translate }}</th>
|
||||
<th>{{ "创建时间" | translate }}</th>
|
||||
<th>{{ "ID列表" | translate }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -57,7 +58,7 @@
|
||||
//渲染
|
||||
transfer.render({
|
||||
elem: '#showdevice' //绑定元素
|
||||
,title: ['我的机器', '分享机器'] //自定义标题
|
||||
,title: ['{{ "我的机器" | translate }}', '{{ "分享机器" | translate }}'] //自定义标题
|
||||
//,width: 500 //定义宽度
|
||||
//,height: 300 //定义高度
|
||||
,data: [//定义数据源
|
||||
@ -90,7 +91,7 @@
|
||||
// time:false //取消自动关闭
|
||||
// });
|
||||
//layer.msg('注册成功,请前往登录页登录。');
|
||||
layer.alert('成功!如需分享,请复制以下链接给其他人:<br>'+ window.location + '/' +data.shash, function (index) {
|
||||
layer.alert('{{ "成功!如需分享,请复制以下链接给其他人:<br>" | translate }}'+ window.location + '/' +data.shash, function (index) {
|
||||
location.reload();});
|
||||
}else {
|
||||
layer.msg(data.msg);
|
||||
|
||||
@ -1,30 +1,31 @@
|
||||
{% extends "base.html" %}
|
||||
{% load my_filters %}
|
||||
{% block title %}RustDesk WebUI{% endblock %}
|
||||
{% block legend_name %}综合屏{% endblock %}
|
||||
{% block legend_name %}{{ "综合屏" | translate }}{% endblock %}
|
||||
{% block content %}
|
||||
<div style="padding: 20px; background-color: #F2F2F2;">
|
||||
<div class="layui-row layui-col-space15">
|
||||
{% if not show_all %}
|
||||
<div class="layui-col-md15">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">设备统计 - 【用户名:{{u.username}}】</div>
|
||||
<div class="layui-card-header">{{ "设备统计" | translate }} - 【{{ "用户名" | translate }}:{{u.username}}】</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>客户端ID</th>
|
||||
<th>版本</th>
|
||||
<th>连接密码</th>
|
||||
<th>系统用户名</th>
|
||||
<th>计算机名</th>
|
||||
<th>别名</th>
|
||||
<th>平台</th>
|
||||
<th>系统</th>
|
||||
<th>CPU</th>
|
||||
<th>内存</th>
|
||||
<th>注册时间</th>
|
||||
<th>更新时间</th>
|
||||
<th>状态</th>
|
||||
<th>{{ "客户端ID" | translate }}</th>
|
||||
<th>{{ "版本" | translate }}</th>
|
||||
<th>{{ "连接密码" | translate }}</th>
|
||||
<th>{{ "系统用户名" | translate }}</th>
|
||||
<th>{{ "计算机名" | translate }}</th>
|
||||
<th>{{ "别名" | translate }}</th>
|
||||
<th>{{ "平台" | translate }}</th>
|
||||
<th>{{ "系统" | translate }}</th>
|
||||
<th>{{ "CPU" | translate }}</th>
|
||||
<th>{{ "内存" | translate }}</th>
|
||||
<th>{{ "注册时间" | translate }}</th>
|
||||
<th>{{ "更新时间" | translate }}</th>
|
||||
<th>{{ "状态" | translate }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -53,17 +54,17 @@
|
||||
<div class="layui-col-md4 layui-col-md-offset4">
|
||||
<span class="step-links">
|
||||
{% if page_obj.has_previous %}
|
||||
<button class="layui-btn" ><a href="?page=1">« 首页</a></button>
|
||||
<button class="layui-btn" ><a href="?page={{ page_obj.previous_page_number }}">上一页</a></button>
|
||||
<button class="layui-btn" ><a href="?page=1">« {{ "首页" | translate }}</a></button>
|
||||
<button class="layui-btn" ><a href="?page={{ page_obj.previous_page_number }}">{{ "上一页" | translate }}</a></button>
|
||||
{% endif %}
|
||||
{% if page_obj.paginator.num_pages > 1 %}
|
||||
<span class="current">
|
||||
页码 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}
|
||||
{{ "页码" | translate }} {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if page_obj.has_next %}
|
||||
<button class="layui-btn" > <a href="?page={{ page_obj.next_page_number }}">下一页</a></button>
|
||||
<button class="layui-btn" ><a href="?page={{ page_obj.paginator.num_pages }}">尾页 »</a></button>
|
||||
<button class="layui-btn" > <a href="?page={{ page_obj.next_page_number }}">{{ "下一页" | translate }}</a></button>
|
||||
<button class="layui-btn" ><a href="?page={{ page_obj.paginator.num_pages }}">{{ "尾页" | translate }} »</a></button>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
@ -73,24 +74,24 @@
|
||||
{% if u.is_admin and show_all %}
|
||||
<div class="layui-col-md15">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">全部用户 »
|
||||
<div class="layui-btn" ><a href="/api/down_peers">导出xlsx</a></div>
|
||||
<div class="layui-card-header">{{ "全部用户" | translate }} »
|
||||
<div class="layui-btn" ><a href="/api/down_peers">{{ "导出xlsx" | translate }}</a></div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>客户端ID</th>
|
||||
<th>所属用户</th>
|
||||
<th>版本</th>
|
||||
<th>系统用户名</th>
|
||||
<th>计算机名</th>
|
||||
<th>系统</th>
|
||||
<th>CPU</th>
|
||||
<th>内存</th>
|
||||
<th>注册日期</th>
|
||||
<th>更新时间</th>
|
||||
<th>状态</th>
|
||||
<th>{{ "客户端ID" | translate }}</th>
|
||||
<th>{{ "所属用户" | translate }}</th>
|
||||
<th>{{ "版本" | translate }}</th>
|
||||
<th>{{ "系统用户名" | translate }}</th>
|
||||
<th>{{ "计算机名" | translate }}</th>
|
||||
<th>{{ "系统" | translate }}</th>
|
||||
<th>{{ "CPU" | translate }}</th>
|
||||
<th>{{ "内存" | translate }}</th>
|
||||
<th>{{ "注册日期" | translate }}</th>
|
||||
<th>{{ "更新时间" | translate }}</th>
|
||||
<th>{{ "状态" | translate }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -118,17 +119,17 @@
|
||||
<div class="layui-col-md4 layui-col-md-offset4">
|
||||
<span class="step-links">
|
||||
{% if page_obj.has_previous %}
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page=1">« 首页</a></button>
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page={{ page_obj.previous_page_number }}">上一页</a></button>
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page=1">« {{ "首页" | translate }}</a></button>
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page={{ page_obj.previous_page_number }}">{{ "上一页" | translate }}</a></button>
|
||||
{% endif %}
|
||||
{% if page_obj.paginator.num_pages > 1 %}
|
||||
<span class="current">
|
||||
页码 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}
|
||||
{{ "页码" | translate }} {{ page_obj.number }} / {{ page_obj.paginator.num_pages }}
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if page_obj.has_next %}
|
||||
<button class="layui-btn" > <a href="?show_type=admin&page={{ page_obj.next_page_number }}">下一页</a></button>
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page={{ page_obj.paginator.num_pages }}">尾页 »</a></button>
|
||||
<button class="layui-btn" > <a href="?show_type=admin&page={{ page_obj.next_page_number }}">{{ "下一页" | translate }}</a></button>
|
||||
<button class="layui-btn" ><a href="?show_type=admin&page={{ page_obj.paginator.num_pages }}">{{ "尾页" | translate }} »</a></button>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
0
api/templatetags/__init__.py
Normal file
0
api/templatetags/__init__.py
Normal file
8
api/templatetags/my_filters.py
Normal file
8
api/templatetags/my_filters.py
Normal file
@ -0,0 +1,8 @@
|
||||
from django import template
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.filter
|
||||
def translate(text):
|
||||
return _(text)
|
||||
@ -22,3 +22,4 @@ import copy
|
||||
|
||||
from .views_front import *
|
||||
from .views_api import *
|
||||
from .front_locale import *
|
||||
|
||||
@ -10,13 +10,13 @@ from api.models import RustDeskToken, UserProfile, RustDeskTag, RustDeskPeer, Ru
|
||||
from django.db.models import Q
|
||||
import copy
|
||||
from .views_front import *
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
|
||||
def login(request):
|
||||
result = {}
|
||||
if request.method == 'GET':
|
||||
result['error'] = '请求方式错误!请使用POST方式。'
|
||||
result['error'] = _('请求方式错误!请使用POST方式。')
|
||||
return JsonResponse(result)
|
||||
|
||||
data = json.loads(request.body.decode())
|
||||
@ -30,7 +30,7 @@ def login(request):
|
||||
deviceInfo = data.get('deviceInfo', '')
|
||||
user = auth.authenticate(username=username,password=password)
|
||||
if not user:
|
||||
result['error'] = '帐号或密码错误!请重试,多次重试后将被锁定IP!'
|
||||
result['error'] = _('帐号或密码错误!请重试,多次重试后将被锁定IP!')
|
||||
return JsonResponse(result)
|
||||
user.rid = rid
|
||||
user.uuid = uuid
|
||||
@ -68,7 +68,7 @@ def login(request):
|
||||
|
||||
def logout(request):
|
||||
if request.method == 'GET':
|
||||
result = {'error':'请求方式错误!'}
|
||||
result = {'error':_('请求方式错误!')}
|
||||
return JsonResponse(result)
|
||||
|
||||
data = json.loads(request.body.decode())
|
||||
@ -76,7 +76,7 @@ def logout(request):
|
||||
uuid = data.get('uuid', '')
|
||||
user = UserProfile.objects.filter(Q(rid=rid) & Q(uuid=uuid)).first()
|
||||
if not user:
|
||||
result = {'error':'异常请求!'}
|
||||
result = {'error':_('异常请求!')}
|
||||
return JsonResponse(result)
|
||||
token = RustDeskToken.objects.filter(Q(uid=user.id) & Q(rid=user.rid)).first()
|
||||
if token:
|
||||
@ -89,7 +89,7 @@ def logout(request):
|
||||
def currentUser(request):
|
||||
result = {}
|
||||
if request.method == 'GET':
|
||||
result['error'] = '错误的提交方式!'
|
||||
result['error'] = _('错误的提交方式!')
|
||||
return JsonResponse(result)
|
||||
postdata = json.loads(request.body)
|
||||
rid = postdata.get('id', '')
|
||||
@ -117,7 +117,7 @@ def ab(request):
|
||||
access_token = access_token.split('Bearer ')[-1]
|
||||
token = RustDeskToken.objects.filter(Q(access_token=access_token) ).first()
|
||||
if not token:
|
||||
result = {'error':'拉取列表错误!'}
|
||||
result = {'error':_('拉取列表错误!')}
|
||||
return JsonResponse(result)
|
||||
|
||||
if request.method == 'GET':
|
||||
@ -196,7 +196,7 @@ def ab(request):
|
||||
|
||||
result = {
|
||||
'code':102,
|
||||
'data':'更新地址簿有误'
|
||||
'data':_('更新地址簿有误')
|
||||
}
|
||||
return JsonResponse(result)
|
||||
|
||||
@ -209,7 +209,7 @@ def sysinfo(request):
|
||||
# 客户端注册服务后,才会发送设备信息
|
||||
result = {}
|
||||
if request.method == 'GET':
|
||||
result['error'] = '错误的提交方式!'
|
||||
result['error'] = _('错误的提交方式!')
|
||||
return JsonResponse(result)
|
||||
|
||||
postdata = json.loads(request.body)
|
||||
@ -243,13 +243,13 @@ def heartbeat(request):
|
||||
create_time = datetime.datetime.now() + datetime.timedelta(seconds=EFFECTIVE_SECONDS)
|
||||
RustDeskToken.objects.filter(Q(rid=postdata['id']) & Q(uuid=postdata['uuid']) ).update(create_time=create_time)
|
||||
result = {}
|
||||
result['data'] = '在线'
|
||||
result['data'] = _('在线')
|
||||
return JsonResponse(result)
|
||||
|
||||
def users(request):
|
||||
result = {
|
||||
'code':1,
|
||||
'data':'好的'
|
||||
'data':_('好的')
|
||||
}
|
||||
return JsonResponse(result)
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ import sys
|
||||
|
||||
from io import BytesIO
|
||||
import xlwt
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
salt = 'xiaomo'
|
||||
EFFECTIVE_SECONDS = 7200
|
||||
@ -46,17 +47,17 @@ def model_to_dict2(instance, fields=None, exclude=None, replace=None, default=No
|
||||
"""
|
||||
# 对传递进来的模型对象校验
|
||||
if not isinstance(instance, Model):
|
||||
raise Exception('model_to_dict接收的参数必须是模型对象')
|
||||
raise Exception(_('model_to_dict接收的参数必须是模型对象'))
|
||||
# 对替换数据库字段名字校验
|
||||
if replace and type(replace) == dict:
|
||||
for replace_field in replace.values():
|
||||
if hasattr(instance, replace_field):
|
||||
raise Exception(f'model_to_dict,要替换成{replace_field}字段已经存在了')
|
||||
raise Exception(_(f'model_to_dict,要替换成{replace_field}字段已经存在了'))
|
||||
# 对要新增的默认值进行校验
|
||||
if default and type(default) == dict:
|
||||
for default_key in default.keys():
|
||||
if hasattr(instance, default_key):
|
||||
raise Exception(f'model_to_dict,要新增默认值,但字段{default_key}已经存在了')
|
||||
raise Exception(_(f'model_to_dict,要新增默认值,但字段{default_key}已经存在了'))
|
||||
opts = instance._meta
|
||||
data = {}
|
||||
for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
|
||||
@ -130,14 +131,14 @@ def user_login(request):
|
||||
username = request.POST.get('account', '')
|
||||
password = request.POST.get('password', '')
|
||||
if not username or not password:
|
||||
return JsonResponse({'code':0, 'msg':'出了点问题。'})
|
||||
return JsonResponse({'code':0, 'msg':_('出了点问题,未获取用户名或密码。')})
|
||||
|
||||
user = auth.authenticate(username=username,password=password)
|
||||
if user:
|
||||
auth.login(request, user)
|
||||
return JsonResponse({'code':1, 'url':'/api/work'})
|
||||
else:
|
||||
return JsonResponse({'code':0, 'msg':'帐号或密码错误!'})
|
||||
return JsonResponse({'code':0, 'msg':_('帐号或密码错误!')})
|
||||
|
||||
def user_register(request):
|
||||
info = ''
|
||||
@ -149,25 +150,25 @@ def user_register(request):
|
||||
'msg':''
|
||||
}
|
||||
if not ALLOW_REGISTRATION:
|
||||
result['msg'] = '当前未开放注册,请联系管理员!'
|
||||
result['msg'] = _('当前未开放注册,请联系管理员!')
|
||||
return JsonResponse(result)
|
||||
|
||||
username = request.POST.get('user', '')
|
||||
password1 = request.POST.get('pwd', '')
|
||||
|
||||
if len(username) <= 3:
|
||||
info = '用户名不得小于3位'
|
||||
info = _('用户名不得小于3位')
|
||||
result['msg'] = info
|
||||
return JsonResponse(result)
|
||||
|
||||
if len(password1)<8 or len(password1)>20:
|
||||
info = '密码长度不符合要求, 应在8~20位。'
|
||||
info = _('密码长度不符合要求, 应在8~20位。')
|
||||
result['msg'] = info
|
||||
return JsonResponse(result)
|
||||
|
||||
user = UserProfile.objects.filter(Q(username=username)).first()
|
||||
if user:
|
||||
info = '用户名已存在。'
|
||||
info = _('用户名已存在。')
|
||||
result['msg'] = info
|
||||
return JsonResponse(result)
|
||||
user = UserProfile(
|
||||
@ -203,10 +204,10 @@ def get_single_info(uid):
|
||||
peers[rid]['memory'] = device.memory
|
||||
peers[rid]['cpu'] = device.cpu
|
||||
peers[rid]['os'] = device.os
|
||||
peers[rid]['status'] = '在线' if (now-device.update_time).seconds <=120 else '离线'
|
||||
peers[rid]['status'] = _('在线') if (now-device.update_time).seconds <=120 else _('离线')
|
||||
|
||||
for rid in peers.keys():
|
||||
peers[rid]['has_rhash'] = '是' if len(peers[rid]['rhash'])>1 else '否'
|
||||
peers[rid]['has_rhash'] = _('是') if len(peers[rid]['rhash'])>1 else _('否')
|
||||
|
||||
return [v for k,v in peers.items()]
|
||||
|
||||
@ -222,7 +223,7 @@ def get_all_info():
|
||||
devices[peer.rid]['rust_user'] = user.username
|
||||
|
||||
for k, v in devices.items():
|
||||
devices[k]['status'] = '在线' if (now-datetime.datetime.strptime(v['update_time'], '%Y-%m-%d %H:%M')).seconds <=120 else '离线'
|
||||
devices[k]['status'] = _('在线') if (now-datetime.datetime.strptime(v['update_time'], '%Y-%m-%d %H:%M')).seconds <=120 else _('离线')
|
||||
return [v for k,v in devices.items()]
|
||||
|
||||
@login_required(login_url='/api/user_action?action=login')
|
||||
@ -248,7 +249,7 @@ def down_peers(request):
|
||||
|
||||
all_info = get_all_info()
|
||||
f = xlwt.Workbook(encoding='utf-8')
|
||||
sheet1 = f.add_sheet(u'设备信息表', cell_overwrite_ok=True)
|
||||
sheet1 = f.add_sheet(_(u'设备信息表'), cell_overwrite_ok=True)
|
||||
all_fields = [x.name for x in RustDesDevice._meta.get_fields()]
|
||||
all_fields.append('rust_user')
|
||||
for i, one in enumerate(all_info):
|
||||
@ -339,13 +340,15 @@ def share(request):
|
||||
|
||||
msg += '已被成功获取。'
|
||||
|
||||
title = _(title)
|
||||
msg = _(msg)
|
||||
return render(request, 'msg.html', {'title':msg, 'msg':msg})
|
||||
else:
|
||||
data = request.POST.get('data', '[]')
|
||||
|
||||
data = json.loads(data)
|
||||
if not data:
|
||||
return JsonResponse({'code':0, 'msg':'数据为空。'})
|
||||
return JsonResponse({'code':0, 'msg':_('数据为空。')})
|
||||
rustdesk_ids = [x['title'].split('|')[0] for x in data]
|
||||
rustdesk_ids = ','.join(rustdesk_ids)
|
||||
sharelink = ShareLink(
|
||||
|
||||
BIN
db/db.sqlite3
BIN
db/db.sqlite3
Binary file not shown.
BIN
locale/en/LC_MESSAGES/django.mo
Normal file
BIN
locale/en/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
487
locale/en/LC_MESSAGES/django.po
Normal file
487
locale/en/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,487 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-03-15 21:10+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: .\api\admin_user.py:14 .\api\front_locale.py:28
|
||||
msgid "密码"
|
||||
msgstr "Password"
|
||||
|
||||
#: .\api\admin_user.py:15
|
||||
msgid "再次输入密码"
|
||||
msgstr "Re-enter password"
|
||||
|
||||
#: .\api\admin_user.py:26
|
||||
msgid "密码校验失败,两次密码不一致。"
|
||||
msgstr "Password verification failed, passwords do not match."
|
||||
|
||||
#: .\api\admin_user.py:44
|
||||
msgid "密码Hash值"
|
||||
msgstr "Password Hash Value"
|
||||
|
||||
#: .\api\admin_user.py:75
|
||||
msgid "基本信息"
|
||||
msgstr "Basic Information"
|
||||
|
||||
#: .\api\admin_user.py:98
|
||||
msgid "RustDesk自建Web"
|
||||
msgstr "RustDesk Self-Hosted Web"
|
||||
|
||||
#: .\api\admin_user.py:99
|
||||
msgid "未定义"
|
||||
msgstr "Undefined"
|
||||
|
||||
#: .\api\front_locale.py:4 .\api\templates\base.html:40
|
||||
msgid "管理后台"
|
||||
msgstr "Admin Panel"
|
||||
|
||||
#: .\api\front_locale.py:5
|
||||
msgid "ID列表"
|
||||
msgstr "ID List"
|
||||
|
||||
#: .\api\front_locale.py:6
|
||||
msgid "分享机器"
|
||||
msgstr "Share Machine"
|
||||
|
||||
#: .\api\front_locale.py:7
|
||||
msgid "这么简易的东西,忘记密码这功能就没必要了吧。"
|
||||
msgstr "For such a simple thing, the forgot password feature is unnecessary, right?"
|
||||
|
||||
#: .\api\front_locale.py:8
|
||||
msgid "立即注册"
|
||||
msgstr "Register Now"
|
||||
|
||||
#: .\api\front_locale.py:9
|
||||
msgid "创建时间"
|
||||
msgstr "Creation Time"
|
||||
|
||||
#: .\api\front_locale.py:10
|
||||
msgid "注册成功,请前往登录页登录。"
|
||||
msgstr "Registration successful, please go to the login page to login."
|
||||
|
||||
#: .\api\front_locale.py:11
|
||||
msgid "注册日期"
|
||||
msgstr "Registration Date"
|
||||
|
||||
#: .\api\front_locale.py:12
|
||||
msgid ""
|
||||
"2、所分享的机器,被分享人享有相同的权限,如果机器设置了保存密码,被分享人也可"
|
||||
"以直接连接。"
|
||||
msgstr ""
|
||||
"2. The shared machine grants the same permissions to the recipient. If the machine is set to save password, the recipient can also connect directly."
|
||||
|
||||
#: .\api\front_locale.py:13
|
||||
msgid "导出xlsx"
|
||||
msgstr "Export as xlsx"
|
||||
|
||||
#: .\api\front_locale.py:14
|
||||
msgid "生成分享链接"
|
||||
msgstr "Generate Share Link"
|
||||
|
||||
#: .\api\front_locale.py:15
|
||||
msgid "请输入8~20位密码。可以包含字母、数字和特殊字符。"
|
||||
msgstr "Please enter a password of 8~20 characters. It can contain letters, numbers, and special characters."
|
||||
|
||||
#: .\api\front_locale.py:16
|
||||
msgid "尾页"
|
||||
msgstr "Last Page"
|
||||
|
||||
#: .\api\front_locale.py:17
|
||||
msgid "请确认密码"
|
||||
msgstr "Please confirm password"
|
||||
|
||||
#: .\api\front_locale.py:18
|
||||
msgid "注册"
|
||||
msgstr "Register"
|
||||
|
||||
#: .\api\front_locale.py:19 .\api\models_work.py:73
|
||||
msgid "内存"
|
||||
msgstr "Memory"
|
||||
|
||||
#: .\api\front_locale.py:20 .\api\templates\base.html:31
|
||||
msgid "首页"
|
||||
msgstr "Home"
|
||||
|
||||
#: .\api\front_locale.py:21 .\api\templates\base.html:37
|
||||
msgid "网页控制"
|
||||
msgstr "Web Control"
|
||||
|
||||
#: .\api\front_locale.py:22
|
||||
msgid "注册时间"
|
||||
msgstr "Registration Time"
|
||||
|
||||
#: .\api\front_locale.py:23
|
||||
msgid "链接地址"
|
||||
msgstr "Link Address"
|
||||
|
||||
#: .\api\front_locale.py:24
|
||||
msgid "请输入密码"
|
||||
msgstr "Please enter password"
|
||||
|
||||
#: .\api\front_locale.py:25 .\api\models_work.py:50 .\api\models_work.py:76
|
||||
msgid "系统用户名"
|
||||
msgstr "System Username"
|
||||
|
||||
#: .\api\front_locale.py:26
|
||||
msgid "状态"
|
||||
msgstr "Status"
|
||||
|
||||
#: .\api\front_locale.py:27
|
||||
msgid "已有账号?立即登录"
|
||||
msgstr "Already have an account? Login now"
|
||||
|
||||
#: .\api\front_locale.py:29 .\api\models_work.py:52
|
||||
msgid "别名"
|
||||
msgstr "Alias"
|
||||
|
||||
#: .\api\front_locale.py:30
|
||||
msgid "上一页"
|
||||
msgstr "Previous Page"
|
||||
|
||||
#: .\api\front_locale.py:31
|
||||
msgid "更新时间"
|
||||
msgstr "Update Time"
|
||||
|
||||
#: .\api\front_locale.py:32
|
||||
msgid "综合屏"
|
||||
msgstr "Comprehensive Screen"
|
||||
|
||||
#: .\api\front_locale.py:33 .\api\models_work.py:53
|
||||
msgid "平台"
|
||||
msgstr "Platform"
|
||||
|
||||
#: .\api\front_locale.py:34
|
||||
msgid "全部用户"
|
||||
msgstr "All Users"
|
||||
|
||||
#: .\api\front_locale.py:35
|
||||
msgid "注册页"
|
||||
msgstr "Registration Page"
|
||||
|
||||
#: .\api\front_locale.py:36
|
||||
msgid "分享机器给其他用户"
|
||||
msgstr "Share machine with other users"
|
||||
|
||||
#: .\api\front_locale.py:37 .\api\templates\base.html:33
|
||||
msgid "所有设备"
|
||||
msgstr "All Devices"
|
||||
|
||||
#: .\api\front_locale.py:38
|
||||
msgid "连接密码"
|
||||
msgstr "Connection Password"
|
||||
|
||||
#: .\api\front_locale.py:39
|
||||
msgid "设备统计"
|
||||
msgstr "Device Statistics"
|
||||
|
||||
#: .\api\front_locale.py:40
|
||||
msgid "所属用户"
|
||||
msgstr "Belongs to User"
|
||||
|
||||
#: .\api\front_locale.py:41 .\api\templates\base.html:36
|
||||
msgid "分享"
|
||||
msgstr "Share"
|
||||
|
||||
#: .\api\front_locale.py:42
|
||||
msgid "请输入用户名"
|
||||
msgstr "Please enter username"
|
||||
|
||||
#: .\api\front_locale.py:43
|
||||
msgid ""
|
||||
"1、链接有效期为15分钟,切勿随意分享给他人。"
|
||||
msgstr ""
|
||||
"1. The link is valid for 15 minutes. Do not share it with others casually."
|
||||
|
||||
#: .\api\front_locale.py:44
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: .\api\front_locale.py:45 .\api\models_work.py:49 .\api\models_work.py:70
|
||||
msgid "客户端ID"
|
||||
msgstr "Client ID"
|
||||
|
||||
#: .\api\front_locale.py:46
|
||||
msgid "下一页"
|
||||
msgstr "Next Page"
|
||||
|
||||
#: .\api\front_locale.py:47
|
||||
msgid "登录"
|
||||
msgstr "Login"
|
||||
|
||||
#: .\api\front_locale.py:48 .\api\templates\base.html:43
|
||||
msgid "退出"
|
||||
msgstr "Logout"
|
||||
|
||||
#: .\api\front_locale.py:49
|
||||
msgid "请将要分享的机器调整到右侧"
|
||||
msgstr "Please adjust the machines to be shared to the right"
|
||||
|
||||
#: .\api\front_locale.py:50
|
||||
msgid "成功!如需分享,请复制以下链接给其他人:<br>"
|
||||
msgstr "Success! If you need to share, please copy the following link to others:<br>"
|
||||
|
||||
#: .\api\front_locale.py:51
|
||||
msgid "忘记密码?"
|
||||
msgstr "Forgot Password?"
|
||||
|
||||
#: .\api\front_locale.py:52
|
||||
msgid "计算机名"
|
||||
msgstr "Computer Name"
|
||||
|
||||
#: .\api\front_locale.py:53
|
||||
msgid "两次输入密码不一致!"
|
||||
msgstr "Passwords do not match!"
|
||||
|
||||
#: .\api\front_locale.py:54
|
||||
msgid "页码"
|
||||
msgstr "Page Number"
|
||||
|
||||
#: .\api\front_locale.py:55
|
||||
msgid "版本"
|
||||
msgstr "Version"
|
||||
|
||||
#: .\api\front_locale.py:56 .\api\models_user.py:32 .\api\models_work.py:9
|
||||
msgid "用户名"
|
||||
msgstr "Username"
|
||||
|
||||
#: .\api\front_locale.py:57
|
||||
msgid ""
|
||||
"3、为保障安全,链接有效期为15分钟、链接仅有效1次。链接一旦被(非分享人的登录"
|
||||
"用户)访问,分享生效,后续访问链接失效。"
|
||||
msgstr ""
|
||||
"3. For security reasons, the link is valid for 15 minutes and only valid once. Once the link is accessed by a user (other than the sharing person), the sharing becomes effective, and subsequent access to the link will be invalid."
|
||||
|
||||
#: .\api\front_locale.py:58
|
||||
msgid "系统"
|
||||
msgstr "System"
|
||||
|
||||
#: .\api\models_user.py:40
|
||||
msgid "登录信息:"
|
||||
msgstr "Login Information:"
|
||||
|
||||
#: .\api\models_user.py:42
|
||||
msgid "是否激活"
|
||||
msgstr "Is Active"
|
||||
|
||||
#: .\api\models_user.py:43
|
||||
msgid "是否管理员"
|
||||
msgstr "Is Administrator"
|
||||
|
||||
#: .\api\models_user.py:82
|
||||
msgid "用户"
|
||||
msgstr "User"
|
||||
|
||||
#: .\api\models_user.py:83
|
||||
msgid "用户列表"
|
||||
msgstr "User List"
|
||||
|
||||
#: .\api\models_work.py:10
|
||||
msgid "RustDesk ID"
|
||||
msgstr "RustDesk ID"
|
||||
|
||||
#: .\api\models_work.py:11 .\api\models_work.py:48 .\api\models_work.py:96
|
||||
msgid "用户ID"
|
||||
msgstr "User ID"
|
||||
|
||||
#: .\api\models_work.py:12
|
||||
msgid "uuid"
|
||||
msgstr "UUID"
|
||||
|
||||
#: .\api\models_work.py:13
|
||||
msgid "access_token"
|
||||
msgstr "Access Token"
|
||||
|
||||
#: .\api\models_work.py:14
|
||||
msgid "登录时间"
|
||||
msgstr "Login Time"
|
||||
|
||||
#: .\api\models_work.py:19
|
||||
msgid "Token列表"
|
||||
msgstr "Token List"
|
||||
|
||||
#: .\api\models_work.py:30
|
||||
msgid "所属用户ID"
|
||||
msgstr "Belongs to User ID"
|
||||
|
||||
#: .\api\models_work.py:31
|
||||
msgid "标签名称"
|
||||
msgstr "Tag Name"
|
||||
|
||||
#: .\api\models_work.py:32
|
||||
msgid "标签颜色"
|
||||
msgstr "Tag Color"
|
||||
|
||||
#: .\api\models_work.py:37
|
||||
msgid "Tags列表"
|
||||
msgstr "Tags List"
|
||||
|
||||
#: .\api\models_work.py:51
|
||||
msgid "操作系统名"
|
||||
msgstr "Operating System Name"
|
||||
|
||||
#: .\api\models_work.py:54
|
||||
msgid "标签"
|
||||
msgstr "Tag"
|
||||
|
||||
#: .\api\models_work.py:55
|
||||
msgid "设备链接密码"
|
||||
msgstr "Device Connection Password"
|
||||
|
||||
#: .\api\models_work.py:60
|
||||
msgid "Peers列表"
|
||||
msgstr "Peers List"
|
||||
|
||||
#: .\api\models_work.py:72
|
||||
msgid "主机名"
|
||||
msgstr "Hostname"
|
||||
|
||||
#: .\api\models_work.py:74
|
||||
msgid "操作系统"
|
||||
msgstr "Operating System"
|
||||
|
||||
#: .\api\models_work.py:77
|
||||
msgid "客户端版本"
|
||||
msgstr "Client Version"
|
||||
|
||||
#: .\api\models_work.py:78
|
||||
msgid "设备注册时间"
|
||||
msgstr "Device Registration Time"
|
||||
|
||||
#: .\api\models_work.py:83
|
||||
msgid "设备"
|
||||
msgstr "Device"
|
||||
|
||||
#: .\api\models_work.py:84
|
||||
msgid "设备列表"
|
||||
msgstr "Device List"
|
||||
|
||||
#: .\api\models_work.py:97
|
||||
msgid "链接Key"
|
||||
msgstr "Link Key"
|
||||
|
||||
#: .\api\models_work.py:98
|
||||
msgid "机器ID列表"
|
||||
msgstr "Machine ID List"
|
||||
|
||||
#: .\api\models_work.py:99
|
||||
msgid "是否使用"
|
||||
msgstr "Is Used"
|
||||
|
||||
#: .\api\models_work.py:100
|
||||
msgid "是否过期"
|
||||
msgstr "Is Expired"
|
||||
|
||||
#: .\api\models_work.py:101
|
||||
msgid "生成时间"
|
||||
msgstr "Generation Time"
|
||||
|
||||
#: .\api\models_work.py:107
|
||||
msgid "分享链接"
|
||||
msgstr "Share Link"
|
||||
|
||||
#: .\api\models_work.py:108
|
||||
msgid "链接列表"
|
||||
msgstr "Link List"
|
||||
|
||||
#: .\api\views_api.py:19
|
||||
msgid "请求方式错误!请使用POST方式。"
|
||||
msgstr "Request method error! Please use the POST method."
|
||||
|
||||
#: .\api\views_api.py:33
|
||||
msgid "帐号或密码错误!请重试,多次重试后将被锁定IP!"
|
||||
msgstr "Account or password error! Please retry. After multiple retries, the IP will be locked!"
|
||||
|
||||
#: .\api\views_api.py:71
|
||||
msgid "请求方式错误!"
|
||||
msgstr "Request method error!"
|
||||
|
||||
#: .\api\views_api.py:79
|
||||
msgid "异常请求!"
|
||||
msgstr "Abnormal request!"
|
||||
|
||||
#: .\api\views_api.py:92 .\api\views_api.py:212
|
||||
msgid "错误的提交方式!"
|
||||
msgstr "Incorrect submission method!"
|
||||
|
||||
#: .\api\views_api.py:120
|
||||
msgid "拉取列表错误!"
|
||||
msgstr "Error fetching list!"
|
||||
|
||||
#: .\api\views_api.py:199
|
||||
msgid "更新地址簿有误"
|
||||
msgstr "Error updating address book"
|
||||
|
||||
#: .\api\views_api.py:246 .\api\views_front.py:207 .\api\views_front.py:226
|
||||
msgid "在线"
|
||||
msgstr "Online"
|
||||
|
||||
#: .\api\views_api.py:252
|
||||
msgid "好的"
|
||||
msgstr "Okay"
|
||||
|
||||
#: .\api\views_front.py:50
|
||||
msgid "model_to_dict接收的参数必须是模型对象"
|
||||
msgstr "The parameter received by model_to_dict must be a model object"
|
||||
|
||||
#: .\api\views_front.py:55
|
||||
#, python-brace-format
|
||||
msgid "model_to_dict,要替换成{replace_field}字段已经存在了"
|
||||
msgstr "model_to_dict, the field to be replaced with {replace_field} already exists"
|
||||
|
||||
#: .\api\views_front.py:60
|
||||
#, python-brace-format
|
||||
msgid "model_to_dict,要新增默认值,但字段{default_key}已经存在了"
|
||||
msgstr "model_to_dict, to add default values, but the field {default_key} already exists"
|
||||
|
||||
#: .\api\views_front.py:134
|
||||
msgid "出了点问题,未获取用户名或密码。"
|
||||
msgstr "There was a problem, username or password not obtained."
|
||||
|
||||
#: .\api\views_front.py:141
|
||||
msgid "帐号或密码错误!"
|
||||
msgstr "Account or password error!"
|
||||
|
||||
#: .\api\views_front.py:153
|
||||
msgid "当前未开放注册,请联系管理员!"
|
||||
msgstr "Registration is currently not open, please contact the administrator!"
|
||||
|
||||
#: .\api\views_front.py:160
|
||||
msgid "用户名不得小于3位"
|
||||
msgstr "Username must be at least 3 characters"
|
||||
|
||||
#: .\api\views_front.py:165
|
||||
msgid "密码长度不符合要求, 应在8~20位。"
|
||||
msgstr "Password length does not meet requirements, should be between 8~20 characters."
|
||||
|
||||
#: .\api\views_front.py:171
|
||||
msgid "用户名已存在。"
|
||||
msgstr "Username already exists."
|
||||
|
||||
#: .\api\views_front.py:207 .\api\views_front.py:226
|
||||
msgid "离线"
|
||||
msgstr "Offline"
|
||||
|
||||
#: .\api\views_front.py:210
|
||||
msgid "是"
|
||||
msgstr "Yes"
|
||||
|
||||
#: .\api\views_front.py:210
|
||||
msgid "否"
|
||||
msgstr "No"
|
||||
|
||||
#: .\api\views_front.py:252
|
||||
msgid "设备信息表"
|
||||
msgstr "Device Information Table"
|
||||
|
||||
#: .\api\views_front.py:351
|
||||
msgid "数据为空。"
|
||||
msgstr "Data is empty."
|
||||
@ -43,6 +43,7 @@ MYSQL_PASSWORD = os.environ.get("MYSQL_PASSWORD", '-')
|
||||
MYSQL_PORT = os.environ.get("MYSQL_PORT", '3306')
|
||||
#==========数据库配置 结束=====================
|
||||
|
||||
LANGUAGE_CODE = os.environ.get("MYSQL_PORT", 'zh-hans')
|
||||
|
||||
# Application definition
|
||||
|
||||
@ -60,6 +61,7 @@ INSTALLED_APPS = [
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
#'django.middleware.csrf.CsrfViewMiddleware', # 取消post的验证。
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
@ -135,7 +137,8 @@ AUTH_PASSWORD_VALIDATORS = [
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/3.1/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'zh-hans'
|
||||
#LANGUAGE_CODE = 'zh-hans'
|
||||
|
||||
TIME_ZONE = 'Asia/Shanghai'
|
||||
|
||||
USE_I18N = True
|
||||
@ -158,3 +161,13 @@ else:
|
||||
|
||||
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 新增
|
||||
|
||||
LANGUAGES = (
|
||||
('zh-hans', '中文简体'),
|
||||
('en', 'English'),
|
||||
|
||||
)
|
||||
|
||||
LOCALE_PATHS = (
|
||||
os.path.join(BASE_DIR, 'locale'),
|
||||
)
|
||||
@ -25,7 +25,10 @@ else:
|
||||
from django.conf.urls import url, include
|
||||
from django.views import static ##新增
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('i18n/', include('django.conf.urls.i18n')),
|
||||
path('admin/', admin.site.urls),
|
||||
url(r'^$', index),
|
||||
url(r'^api/', include('api.urls')),
|
||||
|
||||
4
新建文本文档.txt
Normal file
4
新建文本文档.txt
Normal file
@ -0,0 +1,4 @@
|
||||
python manage.py makemessages -l zh_Hans -i xlwt -i django
|
||||
python manage.py makemessages -l en -i xlwt -i django
|
||||
|
||||
python manage.py compilemessages --pythonpath E:\python_workspace\rustdesk-server-api-python\rustdesk_server_api_github\locale\zh_Hans\LC_MESSAGES
|
||||
Loading…
Reference in New Issue
Block a user