feat: 初始化项目

This commit is contained in:
gary 2022-06-06 15:39:31 +08:00
parent adb8d56e50
commit db085f14a0
239 changed files with 17918 additions and 1 deletions

26
.github/workflows/deploy.yml vendored Normal file
View File

@ -0,0 +1,26 @@
name: Build And Deploy vue3-composition-admin
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2.3.1
with:
persist-credentials: false
- name: Install and Build
run: |
yarn
yarn build:prod
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.VUE3_ACCESS_TOKEN }}
publish_dir: docs/.vuepress/dist

BIN
IMAGE/QQ.JPG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

276
README.md
View File

@ -1,2 +1,276 @@
# frontend-recharge-system-vue
<p align="center">
<a href="https://github.com/rcyj-FED/vue3-composition-admin-docs" target="_blank">
<img width="180" src="https://github.com/rcyj-FED/vue3-composition-admin-docs/blob/main/docs/.vuepress/public/icons/android-chrome-192x192.png" alt="logo">
</a>
</p>
<p align="center">
<a href="https://github.com/vuejs/vue">
<img src="https://img.shields.io/badge/vue-3.0-brightgreen.svg" alt="vue">
</a>
<a href="https://github.com/element-plus/element-plus">
<img src="https://img.shields.io/badge/element--plus-1.x-blue" alt="element-plus">
</a>
<a href="https://github.com/vuejs/vuex">
<img src="https://img.shields.io/badge/vuex-4.0-brightgreen" alt="vuex">
</a>
<a href="https://github.com/intlify/vue-i18n-next">
<img src="https://img.shields.io/badge/vue--i18n--next-9.0-brightgreen" alt="vue-i18n-next">
</a>
<a href="https://github.com/npm/npm">
<img src="https://img.shields.io/badge/npm-6.1.8-blue" alt="npm">
</a>
<a href="https://gitter.im/vue3Admin/community">
<img src="https://badges.gitter.im/Join%20Chat.svg" alt="gitter">
</a>
</p>
> vue3-composition-admin 是一个管理端模板解决方案它是基于vue3,ts和element-plus项目都是以composition api风格编写。
## 简介
项目的基础版本出自于源于花裤衩大佬的 vue-element-admin。
版本:
vue2+js版本[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
vue2+ts版本[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
vue3 发布之后性能增强速度vue2的倍数打包体积都在减小treeshakingcomposition api 增加了项目可读性。
项目目的:
- 学习vue3+ts
- 保持 composition api 风格
在线demo演示地址https://admin-tmpl-test.rencaiyoujia.cn/
## 相关项目
- 基于该项目[RuoYi-Vue3](https://github.com/rcyj-FED/RuoYi-Vue3) (后端路由案例)
- 微应用乾坤版本[RuoYi-Vue3-qinkun](https://github.com/RainManGO/RuoYi-Vue3-qiankun)
- 国内gitee版本 [vue3-composition-admin](https://gitee.com/codeZyZ_admin/vue3-composition-admin)
### 功能
```text
- 用户管理
- 登录(视频背景)
- 注销
- 权限验证
- 页面权限
- 指令权限
- 权限配置
- 二步登录
- 多环境发布 (对应serve,build)
- dev
- test
- prod
- 全局功能
- iconfont
- 国际化多语言
- 多种动态换肤
- 动态侧边栏(支持多级路由嵌套)
- 动态面包屑
- 快捷导航(标签页)
- 本地/后端 mock 数据
- Screenfull全屏
- 自适应收缩侧边栏
- 编辑器
- 富文本
- Excel
- 导出excel
- 导入excel
- 前端可视化excel
- 导出zip
- 表格
- 动态表格
- 拖拽表格
- 内联编辑
- 错误页面
- 401
- 404
- 組件
- 头像上传
- 返回顶部
- 拖拽Dialog
- 拖拽Select
- 拖拽看板
- 列表拖拽
- Dropzone
- Sticky
- CountTo (to do)
- 综合实例
- 错误日志
- Dashboard
- 引导页
- ECharts 图表
- Clipboard(剪贴复制)
```
### 目录结构
```
admin-tmpl
├─ .env.dev.build # 开发环境
├─ .env.dev.serve # 开发本地本地
├─ .env.prod.build # 生产环境
├─ .env.prod.serve # 生产环境本地
├─ .env.test.build # 测试环境
├─ .env.test.serve # 测试环境本地
├─ .eslintrc.js # eslint
├─ README.md
├─ dist # 打包dist
├─ mock # mock服务
├─ public # 静态资源
├─ src # 源码
│ ├─ @types # ts 声明
│ ├─ apis # 接口请求
│ ├─ assets # webpack打包的资源
│ ├─ components # 公共组件
│ ├─ config # 全部配置
│ ├─ constant # 常量
│ ├─ directives # 全局指令
│ ├─ layout # 全局Layout
│ ├─ locales # 国际化
│ ├─ model # 全部model存放
│ ├─ plugins # 插件
│ ├─ router # 路由
│ ├─ store # 全局store管理
│ ├─ styles # 全局样式
│ ├─ utils # 全局公共方法
│ └─ views # 所有业务页面
├─ tsconfig.json # ts 编译配置
└─ vue.config.js # vue-cli 配置
```
## HighLight
项目均已最新技术实现Vue3配套升级全家桶和涉及的插件组件等
项目采用技术:
- vue3 + composition api
- typescript3.9
- sass (dart sass)
- [echats5](https://github.com/apache/echarts)
vue next 系列:
- [element-plus](https://github.com/element-plus/element-plus)
- [vue-router-next](https://github.com/vuejs/vue-router-next)
- [vuex-4.0](https://github.com/vuejs/vuex)
- [vue-i18n-next](https://github.com/intlify/vue-i18n-next)
## Document
- [博客文档地址](https://blog.csdn.net/zy_flyway/category_6335128.html)
- [文档地址](https://rcyj-fed.github.io/vue3-composition-admin-docs/)
- [文档项目git地址](https://github.com/rcyj-FED/vue3-composition-admin-docs)
## Setup
项目主要是前端和mock servernode
### 前后端都启动
```shell
yarn
yarn start
```
### 单独启动 Mock
后台模拟服务器和其他版本不同采用koa2+Faker进行模拟。
- [Koa2](https://github.com/koajs/koa)
- [Faker](https://github.com/Marak/faker.js)
启动mock server:
```shell
yarn mock
```
mock 需要部署到服务器单独项目地址https://github.com/rcyj-FED/admin-tmpl-mock
mock在线测试地址https://admin-tmpl-mock-test.rencaiyoujia.cn/
### 单独启动 vue admin
```shell
yarn serve:dev
```
多环境命令查看package.json script:
``` shell
"serve:dev": "cross-env NODE_ENV=development dotenv -e .env.dev.serve vue-cli-service serve",
"build:dev": "cross-env NODE_ENV=production dotenv -e .env.dev.build vue-cli-service build",
"serve:test": "cross-env NODE_ENV=development dotenv -e .env.test.serve vue-cli-service serve",
"build:test": "cross-env NODE_ENV=production dotenv -e .env.test.build vue-cli-service build",
"serve:prod": "cross-env NODE_ENV=development dotenv -e .env.prod.serve vue-cli-service serve",
"build:prod": "cross-env NODE_ENV=production dotenv -e .env.prod.build vue-cli-service build",
```
### eslint
```shell
yarn lint
```
提交自动检测:
```json
"gitHooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"*.{js,jsx,vue,ts,tsx}": [
"vue-cli-service lint",
"git add"
]
}
```
## Browsers support
Modern browsers and Internet Explorer 10+.
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| IE10, IE11, Edge | last 2 versions | last 2 versions | last 2 versions |
## 讨论交流QQ群584617908
<p align="left">
<a target="_blank">
<img width="180" src="https://github.com/RainManGO/vue3-composition-admin/blob/main/IMAGE/QQ.JPG" alt="qq">
</a>
</p>
## License
[MIT](https://github.com/rcyj-FED/vue3-composition-admin/blob/main/LICENSE)
Copyright (c) 2021-present

7
docker/Dockerfile Normal file
View File

@ -0,0 +1,7 @@
FROM nginx:1.14-alpine
ARG PROJECT_DIR="dist"
COPY --chown=nginx:nginx ${PROJECT_DIR} /usr/share/nginx/html/release
COPY default.conf /etc/nginx/conf.d/
WORKDIR /usr/share/nginx/html/release

38
docker/default.conf Normal file
View File

@ -0,0 +1,38 @@
server {
listen 80;
server_name localhost;
client_max_body_size 100m;
client_body_buffer_size 128k;
proxy_connect_timeout 5;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
auth_basic "status";
location / {
root /usr/share/nginx/html/release;
index index.html index.htm;
try_files $uri $uri/ /index.html; #VUE项目配置路由必须
}
location ^~ /assessh5 {
alias /usr/share/nginx/html/release; # inflow uni-app H5编译文件的目录,index.html所在目录
try_files $uri $uri/ /index.html last;
index index.html index.htm;
}
# location /inflow {
# try_files $uri $uri/ /inflow/index.html;
# root /usr/share/nginx/html/inflow/;
# index index.html;
# }
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

66
k8smanifests/deploy.yaml Normal file
View File

@ -0,0 +1,66 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ${NAME}
name: ${NAME}
namespace: ${NAMESPACE}
spec:
replicas: ${REPLICAS}
selector:
matchLabels:
app: ${NAME}
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
app: ${NAME}
spec:
containers:
- name: ${NAME}
image: ${DOCKERIMAGE}
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: ${SERVER_PORT}
protocol: TCP
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: ${SERVER_PORT}
scheme: HTTP
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: ${SERVER_PORT}
scheme: HTTP
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
startupProbe:
httpGet:
path: /
port: ${SERVER_PORT}
scheme: HTTP
failureThreshold: 60
periodSeconds: 10
timeoutSeconds: 3
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: "1"
memory: 1500Mi
imagePullSecrets:
- name: aliyun-registry-secret
- name: aliyun-registry-vpc-secret

26
k8smanifests/ingress.yaml Normal file
View File

@ -0,0 +1,26 @@
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/client-body-buffer-size: 128k
nginx.ingress.kubernetes.io/proxy-body-size: 100m
nginx.ingress.kubernetes.io/proxy-buffer-size: 4k
nginx.ingress.kubernetes.io/proxy-connect-timeout: "5"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
name: ${NAME}
namespace: ${NAMESPACE}
spec:
rules:
- host: ${INGRESS_HOST}
http:
paths:
- backend:
serviceName: ${NAME}
servicePort: ${SERVER_PORT}
path: /
tls:
- hosts:
- ${INGRESS_HOST}
secretName: ${INGRESS_TLS_SECRET}

14
k8smanifests/svc.yaml Normal file
View File

@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: ${NAME}
namespace: ${NAMESPACE}
spec:
ports:
- name: http
port: ${SERVER_PORT}
protocol: TCP
targetPort: ${SERVER_PORT}
selector:
app: ${NAME}
type: ClusterIP

2
mock/constant.ts Normal file
View File

@ -0,0 +1,2 @@
export const BASE_PATH_MAP = Symbol('path_map');
export const ROUTER_MAP = Symbol('route_map');

142
mock/controller/article.ts Normal file
View File

@ -0,0 +1,142 @@
/*
* @Description:table列表接口
* @Author: ZY
* @Date: 2020-12-28 09:46:46
* @LastEditors: ZY
* @LastEditTime: 2021-01-21 17:31:24
*/
import { post, prefix, get } from "../requestDecorator";
import faker from 'faker'
export interface ArticleModel {
id: number
status: string
title: string
abstractContent: string
fullContent: string
sourceURL: string
imageURL: string
timestamp: number
platforms: string[]
disableComment: boolean
importance: number
author: string
reviewer: string
type: string
pageviews: number
}
const articleList: ArticleModel[] = []
const articleCount = 100
const mockFullContent = '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
for (let i = 0; i < articleCount; i++) {
articleList.push({
id: i,
status: faker.random.arrayElement(['published', 'draft']),
title: faker.lorem.sentence(6, 10),
abstractContent: faker.lorem.sentences(2),
fullContent: mockFullContent,
sourceURL: faker.internet.url(),
imageURL: faker.image.imageUrl(),
timestamp: faker.date.past().getTime(),
platforms: [faker.random.arrayElement(['a-platform', 'b-platform', 'c-platform'])],
disableComment: faker.random.boolean(),
importance: faker.random.number({ min: 1, max: 3 }),
author: faker.name.findName(),
reviewer: faker.name.findName(),
type: faker.random.arrayElement(['CN', 'US', 'JP', 'EU']),
pageviews: faker.random.number({ min: 300, max: 500 })
})
}
@prefix('/article')
export default class Article {
@post('/articles')
async getArticles(ctx: any) {
const { importance, type, title, page = 1, limit = 20, sort } = ctx.request.body
let mockList = articleList.filter(item => {
if (importance && item.importance !== +importance) return false
if (type && item.type !== type) return false
if (title && item.title.indexOf(title as string) < 0) return false
return true
})
if (sort === '-id') {
mockList = mockList.reverse()
}
const pageList = mockList.filter((_, index) => index < (limit as number) * (page as number) && index >= (limit as number) * (page as number - 1))
return {
total: mockList.length,
items: pageList
}
}
@get('/articleInfo')
async getArticle(ctx: any) {
const { id } = ctx.query
for (const article of articleList) {
if (article.id.toString() === id) {
return article
}
}
return {
code: 70001,
message: 'Article not found'
}
}
@post('/createArticle')
createArticle(ctx: any) {
const { article } = ctx.request.body
return {
code: 20000,
data: {
article
}
}
}
@post('/updateArticle')
updateArticle(ctx: any) {
const article = ctx.request.body
for (const v of articleList) {
if (v.id.toString() == article.id) {
return article
}
}
return {
code: 70001,
message: 'Article not found'
}
}
@post('/deleteArticle')
deleteArticle(ctx: any) {
console.log(ctx)
return {
code: 20000
}
}
@get('/getPageviews')
getPageviews(ctx: any) {
console.log(ctx)
return {
code: 20000,
data: {
pageviews: [
{ key: 'PC', pageviews: 1024 },
{ key: 'Mobile', pageviews: 1024 },
{ key: 'iOS', pageviews: 1024 },
{ key: 'Android', pageviews: 1024 }
]
}
}
}
}

51
mock/controller/role.ts Normal file
View File

@ -0,0 +1,51 @@
/*
* @Description:
* @Author: ZY
* @Date: 2021-01-12 15:20:37
* @LastEditors: ZY
* @LastEditTime: 2021-01-12 16:45:25
*/
import roles,{routes} from "../mockdb/role";
import faker from "faker";
import { post, prefix ,get,put,del} from "../requestDecorator";
@prefix('/roles')
export default class Roles {
@get('/getRoles')
async getRoles() {
return {
total: roles.length,
items: roles
}
}
@put('/createRole')
async createRole(){
return {
key: faker.random.number({ min: 3, max: 10000 })
}
}
@post('/updateRole')
async updateRole(ctx:any){
const {role} = ctx.request.body
return {
role
}
}
@del('/deleteRole')
async deleteRole(){
return 'delete success'
}
@get('/getRoutes')
async getRoutes() {
return {
routes
}
}
}

26
mock/controller/type.d.ts vendored Normal file
View File

@ -0,0 +1,26 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-28 15:13:48
* @LastEditors: ZY
* @LastEditTime: 2021-01-12 15:22:27
*/
export interface UserBean {
id: number
username: string
password: string
name: string
email: string
phone: string
avatar: string
introduction: string
roles: string[]
}
export interface RoleBean {
key: string
name: string
description: string
routes: any
}

48
mock/controller/user.ts Normal file
View File

@ -0,0 +1,48 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-28 09:46:46
* @LastEditors: ZY
* @LastEditTime: 2021-01-23 15:54:34
*/
import { post, prefix ,get} from "../requestDecorator";
import userList from "../mockdb/userList";
import * as Koa from 'koa';
@prefix('/user')
export default class User {
@post('/login')
async login(ctx:any) {
const {username} = ctx.request.body
for (const user of userList) {
if (user.username === username) {
return {
accessToken: username + '-token'
}
}
}
return ctx.throw(401);
}
@get('/userInfo')
async getUserInfo(ctx:Koa.Context){
let token = ctx.request.header.token
return token === 'admin-token' ? userList[0] : userList[1]
}
@get('/getUsers')
async getUsers(ctx:any){
const { name } = ctx.query
const users = userList.filter(user => {
const lowerCaseName = user.name.toLowerCase()
return !(name && lowerCaseName.indexOf((name as string).toLowerCase()) < 0)
})
return{
code: 20000,
data: {
items: users
}
}
}
}

View File

@ -0,0 +1,42 @@
/*
* @Description:
* @Autor: ZY
* @Date: 2020-11-11 13:59:28
* @LastEditors: ZY
* @LastEditTime: 2020-12-29 09:04:03
*/
import log from '../utils/logger'
import { MiddleWare } from '../type'
export type ResultInfo = {
code:number;
msg?:string;
data?:any;
err?:any
}
/**
* handler
*/
export const ResultHandler: MiddleWare = () => async (ctx, next) => {
const r :ResultInfo= {code:0};
try {
const data:any = await next();
r.code = 0;
r.msg = 'success'
r.data = data;
} catch (err) {
log.error(err);
log.error('xxx'+err.statusCode);
r.code = err.statusCode
switch (err.statusCode) {
case 102:
r.msg = "用户不存在";
break;
default:
break;
}
}
ctx.body = r;
};

67
mock/mock.ts Normal file
View File

@ -0,0 +1,67 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-09 17:02:35
* @LastEditors: ZY
* @LastEditTime: 2021-01-25 20:02:35
*/
import Koa, { Context } from "koa";
import koaBody from "koa-body";
import koaRouter from "koa-router";
import addRouter from "./router";
import logger from "koa-logger";
import log4js from "log4js";
import {ResultHandler} from './middleware/resultHandler'
import chalk from "chalk";
import cors from "koa2-cors";
const app = new Koa();
app.use(cors());
const router = new koaRouter();
const port = 3300;
const log4 = log4js.getLogger();
log4.level = "debug";
//日志打印
app.use(logger(info => {
log4.debug(info);
}));
app.use(koaBody());
app.use( async (ctx,next)=>{
await next()
// log4.debug(chalk.green('请求路径: ') + ctx.request.url);
log4.debug(chalk.green('请求body: ') + JSON.stringify(ctx.request.body));
log4.debug(chalk.green('返回数据: ')+ JSON.stringify(ctx.body));
})
app.use(ResultHandler());
//加载路由
addRouter(router);
//启动路由
app.use(router.routes()).use(router.allowedMethods());
app.use(async (ctx: Context) => {
log4.error(`404 ${ctx.message} : ${ctx.href}`);
ctx.status = 404;
ctx.body = "404! api not found !";
});
// koa already had middleware to deal with the error, just register the error event
app.on("error", (err, ctx: Context) => {
log4.error(err); //log all errors
ctx.status = 500;
if (ctx.app.env !== "development") {
//throw the error to frontEnd when in the develop mode
ctx.res.end(err.stack); //finish the response
}
});
app.listen(port, () => {
log4.debug("mock server running at: http://localhost:%d", port);
});

44
mock/mockdb/role.ts Normal file
View File

@ -0,0 +1,44 @@
/*
* @Description:
* @Author: ZY
* @Date: 2021-01-12 15:25:09
* @LastEditors: ZY
* @LastEditTime: 2021-01-12 16:18:19
*/
import { RoleBean } from "controller/type";
import { asyncRoutes, constantRoutes } from './routes'
export const routes = [...constantRoutes, ...asyncRoutes]
const roles: RoleBean[] = [
{
key: 'admin',
name: 'admin',
description: 'Super Administrator. Have access to view all pages.',
routes: routes
},
{
key: 'editor',
name: 'editor',
description: 'Normal Editor. Can see all pages except permission page',
routes: routes.filter(i => i.path !== '/permission') // Just a mock
},
{
key: 'visitor',
name: 'visitor',
description: 'Just a visitor. Can only see the home page and the document page',
routes: [{
path: '',
redirect: 'dashboard',
children: [
{
path: 'dashboard',
name: 'Dashboard',
meta: { title: 'dashboard', icon: 'dashboard' }
}
]
}]
}
]
export default roles

610
mock/mockdb/routes.ts Normal file
View File

@ -0,0 +1,610 @@
// Just a mock data
export const constantRoutes = [
{
path: '/redirect',
component: 'Layout',
meta: { hidden: true },
children: [
{
path: '/redirect/:path(.*)',
component: 'views/redirect/index'
}
]
},
{
path: '/login',
component: 'views/login/index',
meta: { hidden: true }
},
{
path: '/auth-redirect',
component: 'views/login/auth-redirect',
meta: { hidden: true }
},
{
path: '/404',
component: 'views/error-page/404',
meta: { hidden: true }
},
{
path: '/401',
component: 'views/error-page/401',
meta: { hidden: true }
},
{
path: '',
component: 'Layout',
redirect: 'dashboard',
children: [
{
path: 'dashboard',
component: 'views/dashboard/index',
name: 'Dashboard',
meta: {
title: 'dashboard',
icon: 'dashboard',
affix: true
}
}
]
},
{
path: '/documentation',
component: 'Layout',
children: [
{
path: 'index',
component: 'views/documentation/index',
name: 'Documentation',
meta: {
title: 'documentation',
icon: 'documentation',
affix: true
}
}
]
},
{
path: '/guide',
component: 'Layout',
redirect: '/guide/index',
children: [
{
path: 'index',
component: 'views/guide/index',
name: 'Guide',
meta: {
title: 'guide',
icon: 'guide',
noCache: true
}
}
]
}
]
export const asyncRoutes = [
{
path: '/permission',
component: 'Layout',
redirect: '/permission/index',
meta: {
title: 'permission',
icon: 'lock',
roles: ['admin', 'editor'],
alwaysShow: true
},
children: [
{
path: 'page',
component: 'views/permission/page',
name: 'PagePermission',
meta: {
title: 'pagePermission',
roles: ['admin']
}
},
{
path: 'directive',
component: 'views/permission/directive',
name: 'DirectivePermission',
meta: {
title: 'directivePermission'
}
},
{
path: 'role',
component: 'views/permission/role',
name: 'RolePermission',
meta: {
title: 'rolePermission',
roles: ['admin']
}
}
]
},
{
path: '/icon',
component: 'Layout',
children: [
{
path: 'index',
component: 'views/icons/index',
name: 'Icons',
meta: {
title: 'icons',
icon: 'icon',
noCache: true
}
}
]
},
{
path: '/components',
component: 'Layout',
redirect: 'noredirect',
name: 'ComponentDemo',
meta: {
title: 'components',
icon: 'component'
},
children: [
{
path: 'tinymce',
component: 'views/components-demo/tinymce',
name: 'TinymceDemo',
meta: { title: 'tinymce' }
},
{
path: 'markdown',
component: 'views/components-demo/markdown',
name: 'MarkdownDemo',
meta: { title: 'markdown' }
},
{
path: 'json-editor',
component: 'views/components-demo/json-editor',
name: 'JsonEditorDemo',
meta: { title: 'jsonEditor' }
},
{
path: 'split-pane',
component: 'views/components-demo/split-pane',
name: 'SplitPaneDemo',
meta: { title: 'splitPane' }
},
{
path: 'avatar-upload',
component: 'views/components-demo/avatar-upload',
name: 'AvatarUploadDemo',
meta: { title: 'avatarUpload' }
},
{
path: 'dropzone',
component: 'views/components-demo/dropzone',
name: 'DropzoneDemo',
meta: { title: 'dropzone' }
},
{
path: 'sticky',
component: 'views/components-demo/sticky',
name: 'StickyDemo',
meta: { title: 'sticky' }
},
{
path: 'count-to',
component: 'views/components-demo/count-to',
name: 'CountToDemo',
meta: { title: 'countTo' }
},
{
path: 'mixin',
component: 'views/components-demo/mixin',
name: 'ComponentMixinDemo',
meta: { title: 'componentMixin' }
},
{
path: 'back-to-top',
component: 'views/components-demo/back-to-top',
name: 'BackToTopDemo',
meta: { title: 'backToTop' }
},
{
path: 'draggable-dialog',
component: 'views/components-demo/draggable-dialog',
name: 'DraggableDialogDemo',
meta: { title: 'draggableDialog' }
},
{
path: 'draggable-select',
component: 'views/components-demo/draggable-select',
name: 'DraggableSelectDemo',
meta: { title: 'draggableSelect' }
},
{
path: 'draggable-list',
component: 'views/components-demo/draggable-list',
name: 'DraggableListDemo',
meta: { title: 'draggableList' }
},
{
path: 'draggable-kanban',
component: 'views/components-demo/draggable-kanban',
name: 'DraggableKanbanDemo',
meta: { title: 'draggableKanban' }
}
]
},
{
path: '/charts',
component: 'Layout',
redirect: 'noredirect',
name: 'Charts',
meta: {
title: 'charts',
icon: 'chart'
},
children: [
{
path: 'bar-chart',
component: 'views/charts/bar-chart',
name: 'BarChartDemo',
meta: {
title: 'barChart',
noCache: true
}
},
{
path: 'line-chart',
component: 'views/charts/line-chart',
name: 'LineChartDemo',
meta: {
title: 'lineChart',
noCache: true
}
},
{
path: 'mixedchart',
component: 'views/charts/mixed-chart',
name: 'MixedChartDemo',
meta: {
title: 'mixedChart',
noCache: true
}
}
]
},
{
path: '/nested',
component: 'Layout',
redirect: '/nested/menu1/menu1-1',
name: 'Nested',
meta: {
title: 'nested',
icon: 'nested'
},
children: [
{
path: 'menu1',
component: 'views/nested/menu1/index',
redirect: '/nested/menu1/menu1-1',
name: 'Menu1',
meta: { title: 'menu1' },
children: [
{
path: 'menu1-1',
component: 'views/nested/menu1/menu1-1/index',
name: 'Menu1-1',
meta: { title: 'menu1-1' }
},
{
path: 'menu1-2',
component: 'views/nested/menu1/menu1-2/index',
name: 'Menu1-2',
redirect: '/nested/menu1/menu1-2/menu1-2-1',
meta: { title: 'menu1-2' },
children: [
{
path: 'menu1-2-1',
component: 'views/nested/menu1/menu1-2/menu1-2-1/index',
name: 'Menu1-2-1',
meta: { title: 'menu1-2-1' }
},
{
path: 'menu1-2-2',
component: 'views/nested/menu1/menu1-2/menu1-2-2/index',
name: 'Menu1-2-2',
meta: { title: 'menu1-2-2' }
}
]
},
{
path: 'menu1-3',
component: 'views/nested/menu1/menu1-3/index',
name: 'Menu1-3',
meta: { title: 'menu1-3' }
}
]
},
{
path: 'menu2',
name: 'Menu2',
component: 'views/nested/menu2/index',
meta: { title: 'menu2' }
}
]
},
{
path: '/table',
component: 'Layout',
redirect: '/table/complex-table',
name: 'Table',
meta: {
title: 'table',
icon: 'table'
},
children: [
{
path: 'dynamic-table',
component: 'views/table/dynamic-table/index',
name: 'DynamicTable',
meta: { title: 'dynamicTable' }
},
{
path: 'draggable-table',
component: 'views/table/draggable-table',
name: 'DraggableTable',
meta: { title: 'draggableTable' }
},
{
path: 'inline-edit-table',
component: 'views/table/inline-edit-table',
name: 'InlineEditTable',
meta: { title: 'inlineEditTable' }
},
{
path: 'complex-table',
component: 'views/table/complex-table',
name: 'ComplexTable',
meta: { title: 'complexTable' }
}
]
},
{
path: '/example',
component: 'Layout',
redirect: '/example/list',
name: 'Example',
meta: {
title: 'example',
icon: 'example'
},
children: [
{
path: 'create',
component: 'views/example/create',
name: 'CreateArticle',
meta: {
title: 'createArticle',
icon: 'edit'
}
},
{
path: 'edit/:id(\\d+)',
component: 'views/example/edit',
name: 'EditArticle',
meta: {
title: 'editArticle',
noCache: true,
activeMenu: '/example/list',
hidden: true
}
},
{
path: 'list',
component: 'views/example/list',
name: 'ArticleList',
meta: {
title: 'articleList',
icon: 'list'
}
}
]
},
{
path: '/tab',
component: 'Layout',
children: [
{
path: 'index',
component: 'views/tab/index',
name: 'Tab',
meta: {
title: 'tab',
icon: 'tab'
}
}
]
},
{
path: '/error',
component: 'Layout',
redirect: 'noredirect',
name: 'ErrorPages',
meta: {
title: 'errorPages',
icon: '404'
},
children: [
{
path: '401',
component: 'views/error-page/401',
name: 'Page401',
meta: {
title: 'page401',
noCache: true
}
},
{
path: '404',
component: 'views/error-page/404',
name: 'Page404',
meta: {
title: 'page404',
noCache: true
}
}
]
},
{
path: '/error-log',
component: 'Layout',
redirect: 'noredirect',
children: [
{
path: 'log',
component: 'views/error-log/index',
name: 'ErrorLog',
meta: {
title: 'errorLog',
icon: 'bug'
}
}
]
},
{
path: '/excel',
component: 'Layout',
redirect: '/excel/export-excel',
name: 'Excel',
meta: {
title: 'excel',
icon: 'excel'
},
children: [
{
path: 'export-excel',
component: 'views/excel/export-excel',
name: 'ExportExcel',
meta: { title: 'exportExcel' }
},
{
path: 'export-selected-excel',
component: 'views/excel/select-excell',
name: 'SelectExcel',
meta: { title: 'selectExcel' }
},
{
path: 'export-merge-header',
component: 'views/excel/merge-header',
name: 'MergeHeader',
meta: { title: 'mergeHeader' }
},
{
path: 'upload-excel',
component: 'views/excel/upload-excel',
name: 'UploadExcel',
meta: { title: 'uploadExcel' }
}
]
},
{
path: '/zip',
component: 'Layout',
redirect: '/zip/download',
meta: {
title: 'zip',
icon: 'zip',
alwaysShow: true
},
children: [
{
path: 'download',
component: 'views/zip/index',
name: 'ExportZip',
meta: { title: 'exportZip' }
}
]
},
{
path: '/pdf',
component: 'Layout',
redirect: '/pdf/index',
children: [
{
path: 'index',
component: 'views/pdf/index',
name: 'PDF',
meta: {
title: 'pdf',
icon: 'pdf'
}
}
]
},
{
path: '/pdf-download-example',
component: 'views/pdf/download',
meta: { hidden: true }
},
{
path: '/theme',
component: 'Layout',
redirect: 'noredirect',
children: [
{
path: 'index',
component: 'views/theme/index',
name: 'Theme',
meta: {
title: 'theme',
icon: 'theme'
}
}
]
},
{
path: '/clipboard',
component: 'Layout',
redirect: 'noredirect',
children: [
{
path: 'index',
component: 'views/clipboard/index',
name: 'Clipboard',
meta: {
title: 'clipboard',
icon: 'clipboard'
}
}
]
},
{
path: '/i18n',
component: 'Layout',
children: [
{
path: 'index',
component: 'views/i18n-demo/index',
name: 'I18n',
meta: {
title: 'i18n',
icon: 'international'
}
}
]
},
{
path: 'https://github.com/rcyj-FED/vue3-composition-admin',
meta: {
title: 'externalLink',
icon: 'link'
}
},
{
path: '*',
redirect: '/404',
meta: { hidden: true }
}
]

53
mock/mockdb/userList.ts Normal file
View File

@ -0,0 +1,53 @@
import { UserBean } from "controller/type";
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-28 14:58:13
* @LastEditors: ZY
* @LastEditTime: 2020-12-28 15:16:58
*/
import faker from 'faker'
const userList: UserBean[] = [
{
id: 0,
username: 'admin',
password: 'any',
name: 'Super Admin',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
introduction: 'I am a super administrator',
email: 'admin@test.com',
phone: '1234567890',
roles: ['admin'],
},
{
id: 1,
username: 'editor',
password: 'any',
name: 'Normal Editor',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
introduction: 'I am an editor',
email: 'editor@test.com',
phone: '1234567890',
roles: ['editor'],
}
]
const userCount = 100
for (let i = 2; i < userCount; i++) {
userList.push({
id: i,
username: 'user_' + faker.random.alphaNumeric(9),
password: faker.random.alphaNumeric(20),
name: faker.name.findName(),
avatar: faker.image.imageUrl(),
introduction: faker.lorem.sentence(20),
email: faker.internet.email(),
phone: faker.phone.phoneNumber(),
roles: ['visitor']
})
}
export default userList

55
mock/requestDecorator.ts Normal file
View File

@ -0,0 +1,55 @@
import 'reflect-metadata'
import { ROUTER_MAP ,BASE_PATH_MAP} from './constant'
/**
* @desc http method
* @param {string} method - http method getposthead
* @return Decorator -
*/
function createMethodDecorator(method: string) {
// 装饰器接收路由 path 作为参数
return function httpMethodDecorator(path: string) {
return (proto: any, name: string) => {
const target = proto.constructor;
const routeMap = Reflect.getMetadata(ROUTER_MAP, target, 'method') || [];
routeMap.push({ name, method, path });
Reflect.defineMetadata(ROUTER_MAP, routeMap, target, 'method');
};
};
}
/**
*
* @param className
*/
function createClassDecorator() {
// 装饰器接收路由 path 作为参数
return function httpMethodDecorator(basePath: string):ClassDecorator {
return (proto: any) => {
const target = proto;
const pathMap = Reflect.getMetadata(BASE_PATH_MAP, target) || [];
pathMap.push({path:basePath});
Reflect.defineMetadata(BASE_PATH_MAP, pathMap, target);
};
};
}
// 路径前缀
export const prefix = createClassDecorator()
// 导出 http method 装饰器
export const post = createMethodDecorator('post');
export const get = createMethodDecorator('get');
export const del = createMethodDecorator('del');
export const put = createMethodDecorator('put');
export const patch = createMethodDecorator('patch');
export const options = createMethodDecorator('options');
export const head = createMethodDecorator('head');
export const all = createMethodDecorator('all');

43
mock/router.ts Normal file
View File

@ -0,0 +1,43 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-10 10:09:06
* @LastEditors: ZY
* @LastEditTime: 2020-12-10 14:41:18
*/
import 'reflect-metadata'
import fs from 'fs'
import path from 'path'
import {ROUTER_MAP, BASE_PATH_MAP} from './constant'
import {RouteMeta, PathMeta} from './type'
import Router from 'koa-router'
const addRouter = (router: Router) => {
const ctrPath = path.join(__dirname, 'controller');
const modules: ObjectConstructor[] = [];
// 扫描controller文件夹收集所有controller
fs.readdirSync(ctrPath).forEach(name => {
if (/^[^.]+\.(t|j)s$/.test(name)) {
modules.push(require(path.join(ctrPath, name)).default)
}
});
// 结合meta数据添加路由 和 验证
modules.forEach(m => {
const routerMap: RouteMeta[] = Reflect.getMetadata(ROUTER_MAP, m, 'method') || [];
const basePathMap: PathMeta[] = Reflect.getMetadata(BASE_PATH_MAP, m) || [];
const basePath:PathMeta = basePathMap.pop();
if (routerMap.length) {
const ctr = new m();
routerMap.forEach(route => {
// const {name, method, path, isVerify} = route;
const {name, method, path} = route;
const newPath:String = basePath ? (basePath.path + path) : path;
// router[method](newPath, jwt(newPath, isVerify), ctr[name]);
router[method](newPath, ctr[name]);
})
}
})
}
export default addRouter

31
mock/tsconfig.json Normal file
View File

@ -0,0 +1,31 @@
{
"compilerOptions": {
"baseUrl": ".",
"outDir": "./dist",
"module": "commonjs",
"target": "esnext",
"allowSyntheticDefaultImports": true,
"importHelpers": true,
"strict": false,
"moduleResolution": "node",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedParameters": true,
"noUnusedLocals": true,
"noImplicitReturns": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"allowJs": true,
"sourceMap": true,
},
"include": [
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules",
"dist"
]
}

39
mock/type.d.ts vendored Normal file
View File

@ -0,0 +1,39 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-10 09:51:09
* @LastEditors: ZY
* @LastEditTime: 2021-01-23 10:53:46
*/
import {Context, Next} from "koa"
// type PlainObject = { [P: string]: any };
type PlainObject = Record<string, any>;
type ParamObject = Record<string, any>;
type MysqlResult = {
affectedRows?: number;
insertId?: string;
}
type PathMeta = {
name: string;
path: string;
}
type RouteMeta = {
name: string;
method: string;
path: string;
isVerify: boolean;
}
type MiddleWare = (...arg: any[]) => (ctx: Context, next?: Next) => Promise<void>;
export {
MysqlResult,
PlainObject,
RouteMeta,
MiddleWare,
PathMeta,
ParamObject
}

5
mock/utils/logger.ts Normal file
View File

@ -0,0 +1,5 @@
import log4js from 'log4js'
const log = log4js.getLogger('default');
export const errlog = log4js.getLogger('err');
export default log

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.00251 14.9297L0 1.07422H6.14651L8.00251 4.27503L9.84583 1.07422H16L8.00251 14.9297Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 215 B

24
public/index.html Normal file
View File

@ -0,0 +1,24 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2020-12-07 10:30:20
* @LastEditors: SCY
* @LastEditTime: 2021-04-02 14:34:42
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<script src="//at.alicdn.com/t/font_2288564_y9n0hmrs19.js"></script>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>

2
public/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Disallow:

17
public/tinymce/README.md Normal file
View File

@ -0,0 +1,17 @@
# Tinymce
## Docs
Check [Vue integration doc for Tinymce](https://www.tiny.cloud/docs/integrations/vue/#installingthetinymcevuejsintegrationusingnpm).
## Language
Resources under `langs` folder are copied from [tinymce language package](https://www.tiny.cloud/get-tiny/language-packages).
## Skin
First download latest tinymce release from [offical website](https://www.tiny.cloud/get-tiny/self-hosted/) , resources under `skins` folder are copied from `skins/ui/oxide`.
## Emojis
First download latest tinymce release from [offical website](https://www.tiny.cloud/get-tiny/self-hosted/), `emojis.min.js` file is copied from `plugins/emoticons/js`.

2
public/tinymce/emojis.min.js vendored Normal file

File diff suppressed because one or more lines are too long

419
public/tinymce/langs/es.js Normal file
View File

@ -0,0 +1,419 @@
tinymce.addI18n('es', {
Redo: 'Rehacer',
Undo: 'Deshacer',
Cut: 'Cortar',
Copy: 'Copiar',
Paste: 'Pegar',
'Select all': 'Seleccionar todo',
'New document': 'Nuevo documento',
Ok: 'Ok',
Cancel: 'Cancelar',
'Visual aids': 'Ayudas visuales',
Bold: 'Negrita',
Italic: 'Cursiva',
Underline: 'Subrayado',
Strikethrough: 'Tachado',
Superscript: 'Super\u00edndice',
Subscript: 'Sub\u00edndice',
'Clear formatting': 'Limpiar formato',
'Align left': 'Alinear a la izquierda',
'Align center': 'Alinear al centro',
'Align right': 'Alinear a la derecha',
Justify: 'Justificar',
'Bullet list': 'Lista de vi\u00f1etas',
'Numbered list': 'Lista numerada',
'Decrease indent': 'Disminuir sangr\u00eda',
'Increase indent': 'Incrementar sangr\u00eda',
Close: 'Cerrar',
Formats: 'Formatos',
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.',
Headers: 'Encabezados',
'Header 1': 'Encabezado 1',
'Header 2': 'Encabezado 2',
'Header 3': 'Encabezado 3',
'Header 4': 'Encabezado 4',
'Header 5': 'Encabezado 5',
'Header 6': 'Encabezado 6',
Headings: 'Encabezados',
'Heading 1': 'Encabezado 1',
'Heading 2': 'Encabezado 2',
'Heading 3': 'Encabezado 3',
'Heading 4': 'Encabezado 4',
'Heading 5': 'Encabezado 5',
'Heading 6': 'Encabezado 6',
Preformatted: 'Con formato previo',
Div: 'Div',
Pre: 'Pre',
Code: 'C\u00f3digo',
Paragraph: 'P\u00e1rrafo',
Blockquote: 'Blockquote',
Inline: 'Alineado',
Blocks: 'Bloques',
'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.',
Fonts: 'Fuentes',
'Font Sizes': 'Tama\u00f1os de fuente',
Class: 'Clase',
'Browse for an image': 'Buscar una imagen',
OR: 'OR',
'Drop an image here': 'Arrastre una imagen aqu\u00ed',
Upload: 'Cargar',
Block: 'Bloque',
Align: 'Alinear',
Default: 'Por defecto',
Circle: 'C\u00edrculo',
Disc: 'Disco',
Square: 'Cuadrado',
'Lower Alpha': 'Inferior Alfa',
'Lower Greek': 'Inferior Griega',
'Lower Roman': 'Inferior Romana',
'Upper Alpha': 'Superior Alfa',
'Upper Roman': 'Superior Romana',
'Anchor...': 'Anclaje...',
Name: 'Nombre',
Id: 'Id',
'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.',
'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?',
'Restore last draft': 'Restaurar el \u00faltimo borrador',
'Special character...': 'Car\u00e1cter especial...',
'Source code': 'C\u00f3digo fuente',
'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba',
Language: 'Idioma',
'Code sample...': 'Ejemplo de c\u00f3digo...',
'Color Picker': 'Selector de colores',
R: 'R',
G: 'V',
B: 'A',
'Left to right': 'De izquierda a derecha',
'Right to left': 'De derecha a izquierda',
'Emoticons...': 'Emoticones...',
'Metadata and Document Properties': 'Metadatos y propiedades del documento',
Title: 'T\u00edtulo',
Keywords: 'Palabras clave',
Description: 'Descripci\u00f3n',
Robots: 'Robots',
Author: 'Autor',
Encoding: 'Codificaci\u00f3n',
Fullscreen: 'Pantalla completa',
Action: 'Acci\u00f3n',
Shortcut: 'Atajo',
Help: 'Ayuda',
Address: 'Direcci\u00f3n',
'Focus to menubar': 'Enfocar la barra del men\u00fa',
'Focus to toolbar': 'Enfocar la barra de herramientas',
'Focus to element path': 'Enfocar la ruta del elemento',
'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual',
'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)',
'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)',
'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)',
'Plugins installed ({0}):': 'Plugins instalados ({0}):',
'Premium plugins:': 'Complementos premium:',
'Learn more...': 'Aprende m\u00e1s...',
'You are using {0}': 'Estas usando {0}',
Plugins: 'Complementos',
'Handy Shortcuts': 'Accesos directos',
'Horizontal line': 'L\u00ednea horizontal',
'Insert\/edit image': 'Insertar\/editar imagen',
'Image description': 'Descripci\u00f3n de la imagen',
Source: 'Enlace',
Dimensions: 'Dimensiones',
'Constrain proportions': 'Restringir proporciones',
General: 'General',
Advanced: 'Avanzado',
Style: 'Estilo',
'Vertical space': 'Espacio vertical',
'Horizontal space': 'Espacio horizontal',
Border: 'Borde',
'Insert image': 'Insertar imagen',
'Image...': 'Imagen...',
'Image list': 'Lista de im\u00e1genes',
'Rotate counterclockwise': 'Girar a la izquierda',
'Rotate clockwise': 'Girar a la derecha',
'Flip vertically': 'Invertir verticalmente',
'Flip horizontally': 'Invertir horizontalmente',
'Edit image': 'Editar imagen',
'Image options': 'Opciones de imagen',
'Zoom in': 'Acercar',
'Zoom out': 'Alejar',
Crop: 'Recortar',
Resize: 'Redimensionar',
Orientation: 'Orientaci\u00f3n',
Brightness: 'Brillo',
Sharpen: 'Forma',
Contrast: 'Contraste',
'Color levels': 'Niveles de color',
Gamma: 'Gamma',
Invert: 'Invertir',
Apply: 'Aplicar',
Back: 'Atr\u00e1s',
'Insert date\/time': 'Insertar fecha\/hora',
'Date\/time': 'Fecha\/hora',
'Insert\/Edit Link': 'Insertar\/editar enlace',
'Insert\/edit link': 'Insertar\/editar enlace',
'Text to display': 'Texto para mostrar',
Url: 'URL',
'Open link in...': 'Abrir enlace en...',
'Current window': 'Ventana actual',
None: 'Ninguno',
'New window': 'Nueva ventana',
'Remove link': 'Quitar enlace',
Anchors: 'Anclas',
'Link...': 'Enlace...',
'Paste or type a link': 'Pega o introduce un enlace',
'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?',
'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?',
'Link list': 'Lista de enlaces',
'Insert video': 'Insertar video',
'Insert\/edit video': 'Insertar\/editar video',
'Insert\/edit media': 'Insertar\/editar medio',
'Alternative source': 'Enlace alternativo',
'Alternative source URL': 'Origen de URL alternativo',
'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)',
'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo',
Embed: 'Incrustado',
'Media...': 'Medios...',
'Nonbreaking space': 'Espacio fijo',
'Page break': 'Salto de p\u00e1gina',
'Paste as text': 'Pegar como texto',
Preview: 'Previsualizar',
'Print...': 'Imprimir...',
Save: 'Guardar',
Find: 'Buscar',
'Replace with': 'Reemplazar con',
Replace: 'Reemplazar',
'Replace all': 'Reemplazar todo',
Previous: 'Anterior',
Next: 'Siguiente',
'Find and replace...': 'Buscar y reemplazar...',
'Could not find the specified string.': 'No se encuentra la cadena de texto especificada',
'Match case': 'Coincidencia exacta',
'Find whole words only': 'Solo palabras completas',
'Spell check': 'Revisar ortograf\u00eda',
Ignore: 'Ignorar',
'Ignore all': 'Ignorar todos',
Finish: 'Finalizar',
'Add to Dictionary': 'A\u00f1adir al Diccionario',
'Insert table': 'Insertar tabla',
'Table properties': 'Propiedades de la tabla',
'Delete table': 'Eliminar tabla',
Cell: 'Celda',
Row: 'Fila',
Column: 'Columna',
'Cell properties': 'Propiedades de la celda',
'Merge cells': 'Combinar celdas',
'Split cell': 'Dividir celdas',
'Insert row before': 'Insertar fila antes',
'Insert row after': 'Insertar fila despu\u00e9s ',
'Delete row': 'Eliminar fila',
'Row properties': 'Propiedades de la fila',
'Cut row': 'Cortar fila',
'Copy row': 'Copiar fila',
'Paste row before': 'Pegar la fila antes',
'Paste row after': 'Pegar la fila despu\u00e9s',
'Insert column before': 'Insertar columna antes',
'Insert column after': 'Insertar columna despu\u00e9s',
'Delete column': 'Eliminar columna',
Cols: 'Columnas',
Rows: 'Filas',
Width: 'Ancho',
Height: 'Alto',
'Cell spacing': 'Espacio entre celdas',
'Cell padding': 'Relleno de celda',
'Show caption': 'Mostrar t\u00edtulo',
Left: 'Izquierda',
Center: 'Centrado',
Right: 'Derecha',
'Cell type': 'Tipo de celda',
Scope: '\u00c1mbito',
Alignment: 'Alineaci\u00f3n',
'H Align': 'Alineamiento Horizontal',
'V Align': 'Alineamiento Vertical',
Top: 'Arriba',
Middle: 'Centro',
Bottom: 'Abajo',
'Header cell': 'Celda de la cebecera',
'Row group': 'Grupo de filas',
'Column group': 'Grupo de columnas',
'Row type': 'Tipo de fila',
Header: 'Cabecera',
Body: 'Cuerpo',
Footer: 'Pie de p\u00e1gina',
'Border color': 'Color del borde',
'Insert template...': 'Insertar plantilla...',
Templates: 'Plantillas',
Template: 'Plantilla',
'Text color': 'Color del texto',
'Background color': 'Color de fondo',
'Custom...': 'Personalizar...',
'Custom color': 'Color personalizado',
'No color': 'Sin color',
'Remove color': 'Quitar color',
'Table of Contents': 'Tabla de contenidos',
'Show blocks': 'Mostrar bloques',
'Show invisible characters': 'Mostrar caracteres invisibles',
'Word count': 'Contar palabras',
Count: 'Recuento',
Document: 'Documento',
Selection: 'Selecci\u00f3n',
Words: 'Palabras',
'Words: {0}': 'Palabras: {0}',
'{0} words': '{0} palabras',
File: 'Archivo',
Edit: 'Editar',
Insert: 'Insertar',
View: 'Ver',
Format: 'Formato',
Table: 'Tabla',
Tools: 'Herramientas',
'Powered by {0}': 'Desarrollado por {0}',
'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda',
'Image title': 'Titulo de imagen',
'Border width': 'Ancho de borde',
'Border style': 'Estilo de borde',
Error: 'Error',
Warn: 'Advertencia',
Valid: 'V\u00e1lido',
'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro',
'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.',
'System Font': 'Fuente de sistema',
'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}',
'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}',
'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}',
'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}',
example: 'ejemplo',
Search: 'Buscar',
All: 'Todo',
Currency: 'Divisa',
Text: 'Texto',
Quotations: 'Comillas',
Mathematical: 'S\u00edmbolo matem\u00e1tico',
'Extended Latin': 'Latino extendido A',
Symbols: 'S\u00edmbolos',
Arrows: 'Flechas',
'User Defined': 'Definido por el usuario',
'dollar sign': 'signo de d\u00f3lar',
'currency sign': 'signo de divisa',
'euro-currency sign': 'signo de euro',
'colon sign': 'signo de dos puntos',
'cruzeiro sign': 'signo de cruceiro',
'french franc sign': 'signo de franco franc\u00e9s',
'lira sign': 'signo de lira',
'mill sign': 'signo de mill',
'naira sign': 'signo de naira',
'peseta sign': 'signo de peseta',
'rupee sign': 'signo de rupia',
'won sign': 'signo de won',
'new sheqel sign': 'signo de nuevo s\u00e9quel',
'dong sign': 'signo de dong',
'kip sign': 'signo de kip',
'tugrik sign': 'signo de tugrik',
'drachma sign': 'signo de dracma',
'german penny symbol': 'signo de penique alem\u00e1n',
'peso sign': 'signo de peso',
'guarani sign': 'signo de guaran\u00ed',
'austral sign': 'signo de austral',
'hryvnia sign': 'signo de grivna',
'cedi sign': 'signo de cedi',
'livre tournois sign': 'signo de libra tornesa',
'spesmilo sign': 'signo de spesmilo',
'tenge sign': 'signo de tenge',
'indian rupee sign': 'signo de rupia india',
'turkish lira sign': 'signo de lira turca',
'nordic mark sign': 'signo de marco n\u00f3rdico',
'manat sign': 'signo de manat',
'ruble sign': 'signo de rublo',
'yen character': 'car\u00e1cter de yen',
'yuan character': 'car\u00e1cter de yuan',
'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n',
'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan',
'Loading emoticons...': 'Cargando emoticonos...',
'Could not load emoticons': 'No se han podido cargar los emoticonos',
People: 'Personas',
'Animals and Nature': 'Animales y naturaleza',
'Food and Drink': 'Comida y bebida',
Activity: 'Actividad',
'Travel and Places': 'Viajes y lugares',
Objects: 'Objetos',
Flags: 'Banderas',
Characters: 'Caracteres',
'Characters (no spaces)': 'Caracteres (sin espacios)',
'{0} characters': '{0} caracteres',
'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.',
'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.',
Update: 'Actualizar',
'Color swatch': 'Muestrario de colores',
Turquoise: 'Turquesa',
Green: 'Verde',
Blue: 'Azul',
Purple: 'P\u00farpura',
'Navy Blue': 'Azul marino',
'Dark Turquoise': 'Turquesa oscuro',
'Dark Green': 'Verde oscuro',
'Medium Blue': 'Azul medio',
'Medium Purple': 'P\u00farpura medio',
'Midnight Blue': 'Azul medio',
Yellow: 'Amarillo',
Orange: 'Naranja',
Red: 'Rojo',
'Light Gray': 'Gris claro',
Gray: 'Gris',
'Dark Yellow': 'Amarillo oscuro',
'Dark Orange': 'Naranja oscuro',
'Dark Red': 'Rojo oscuro',
'Medium Gray': 'Gris medio',
'Dark Gray': 'Gris oscuro',
'Light Green': 'Verde claro',
'Light Yellow': 'Amarillo claro',
'Light Red': 'Rojo claro',
'Light Purple': 'Morado claro',
'Light Blue': 'Azul claro',
'Dark Purple': 'Morado oscuro',
'Dark Blue': 'Azul oscuro',
Black: 'Negro',
White: 'Blanco',
'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa',
'Open help dialog': 'Abrir di\u00e1logo de ayuda',
history: 'historial',
styles: 'estilos',
formatting: 'formato',
alignment: 'alineaci\u00f3n',
indentation: 'sangr\u00eda',
'permanent pen': 'bol\u00edgrafo permanente',
comments: 'comentarios',
'Format Painter': 'Copiar formato',
'Insert\/edit iframe': 'Insertar\/editar iframe',
Capitalization: 'Uso de may\u00fasculas',
lowercase: 'min\u00fasculas',
UPPERCASE: 'MAY\u00daSCULAS',
'Title Case': 'Tipo T\u00edtulo',
'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente',
'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...',
Font: 'Fuente',
Size: 'Tama\u00f1o',
'More...': 'M\u00e1s...',
'Spellcheck Language': 'Corrector',
'Select...': 'Seleccionar...',
Preferences: 'Preferencias',
Yes: 'S\u00ed',
No: 'No',
'Keyboard Navigation': 'Navegaci\u00f3n con el teclado',
Version: 'Versi\u00f3n',
Anchor: 'Ancla',
'Special character': 'Car\u00e1cter especial',
'Code sample': 'Ejemplo de c\u00f3digo',
Color: 'Color',
Emoticons: 'Emoticonos',
'Document properties': 'Propiedades del documento',
Image: 'Imagen',
'Insert link': 'Insertar enlace',
Target: 'Destino',
Link: 'Enlace',
Poster: 'Miniatura',
Media: 'Media',
Print: 'Imprimir',
Prev: 'Anterior',
'Find and replace': 'Buscar y reemplazar',
'Whole words': 'Palabras completas',
Spellcheck: 'Corrector ortogr\u00e1fico',
Caption: 'Subt\u00edtulo',
'Insert template': 'Insertar plantilla'
})

419
public/tinymce/langs/it.js Normal file
View File

@ -0,0 +1,419 @@
tinymce.addI18n('it',{
"Redo": "Ripristina",
"Undo": "Annulla",
"Cut": "Taglia",
"Copy": "Copia",
"Paste": "Incolla",
"Select all": "Seleziona tutto",
"New document": "Nuovo documento",
"Ok": "OK",
"Cancel": "Annulla",
"Visual aids": "Aiuti visivi",
"Bold": "Grassetto",
"Italic": "Corsivo",
"Underline": "Sottolineato",
"Strikethrough": "Barrato",
"Superscript": "Apice",
"Subscript": "Pedice",
"Clear formatting": "Cancella la formattazione",
"Align left": "Allinea a sinistra",
"Align center": "Allinea al centro",
"Align right": "Allinea a destra",
"Justify": "Giustifica",
"Bullet list": "Elenco puntato",
"Numbered list": "Elenco numerato",
"Decrease indent": "Riduci rientro",
"Increase indent": "Aumenta rientro",
"Close": "Chiudi",
"Formats": "Formati",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il browser non supporta l'accesso diretto alla cartella degli appunti. Usare i tasti di scelta rapida Ctrl+X\/C\/V.",
"Headers": "Intestazioni",
"Header 1": "Intestazione 1",
"Header 2": "Intestazione 2",
"Header 3": "Intestazione 3",
"Header 4": "Intestazione 4",
"Header 5": "Intestazione 5",
"Header 6": "Intestazione 6",
"Headings": "Titoli",
"Heading 1": "Titolo 1",
"Heading 2": "Titolo 2",
"Heading 3": "Titolo 3",
"Heading 4": "Titolo 4",
"Heading 5": "Titolo 5",
"Heading 6": "Titolo 6",
"Preformatted": "Preformattato",
"Div": "Div",
"Pre": "Pre",
"Code": "Codice",
"Paragraph": "Paragrafo",
"Blockquote": "Blockquote",
"Inline": "In linea",
"Blocks": "Blocchi",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti sono incollati come testo normale se non disattivi l'opzione.",
"Fonts": "Caratteri",
"Font Sizes": "Dimensioni caratteri",
"Class": "Classe",
"Browse for an image": "Cerca un'immagine",
"OR": "OPPURE",
"Drop an image here": "Rilasciare un'immagine qui",
"Upload": "Carica",
"Block": "Blocco",
"Align": "Allinea",
"Default": "Default",
"Circle": "Cerchio",
"Disc": "Disco",
"Square": "Quadrato",
"Lower Alpha": "Alpha Minore",
"Lower Greek": "Greek Minore",
"Lower Roman": "Roman Minore",
"Upper Alpha": "Alpha Superiore",
"Upper Roman": "Roman Superiore",
"Anchor...": "Ancoraggio...",
"Name": "Nome",
"Id": "Id",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'id dovrebbe cominciare con una lettera, seguito solo da lettere, numeri, linee, punti, virgole.",
"You have unsaved changes are you sure you want to navigate away?": "Non hai salvato delle modifiche, sei sicuro di andartene?",
"Restore last draft": "Ripristina l'ultima bozza.",
"Special character...": "Carattere speciale...",
"Source code": "Codice Sorgente",
"Insert\/Edit code sample": "Inserisci\/Modifica esempio di codice",
"Language": "Lingua",
"Code sample...": "Esempio di codice...",
"Color Picker": "Selezione colori",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "Da Sinistra a Destra",
"Right to left": "Da Destra a Sinistra",
"Emoticons...": "Emoticon...",
"Metadata and Document Properties": "Metadata e propriet\u00e0 del documento",
"Title": "Titolo",
"Keywords": "Parola Chiave",
"Description": "Descrizione",
"Robots": "Robot",
"Author": "Autore",
"Encoding": "Codifica",
"Fullscreen": "Schermo Intero",
"Action": "Azione",
"Shortcut": "Scorciatoia",
"Help": "Aiuto",
"Address": "Indirizzo",
"Focus to menubar": "Focus sulla barra del menu",
"Focus to toolbar": "Focus sulla barra degli strumenti",
"Focus to element path": "Focus sul percorso dell'elemento",
"Focus to contextual toolbar": "Focus sulla barra degli strumenti contestuale",
"Insert link (if link plugin activated)": "Inserisci link (se il plugin link \u00e8 attivato)",
"Save (if save plugin activated)": "Salva (se il plugin save \u00e8 attivato)",
"Find (if searchreplace plugin activated)": "Trova (se il plugin searchreplace \u00e8 attivato)",
"Plugins installed ({0}):": "Plugin installati ({0}):",
"Premium plugins:": "Plugin Premium:",
"Learn more...": "Per saperne di pi\u00f9...",
"You are using {0}": "Stai usando {0}",
"Plugins": "Plugin",
"Handy Shortcuts": "Scorciatoia pratica",
"Horizontal line": "Linea Orizzontale",
"Insert\/edit image": "Aggiungi\/Modifica Immagine",
"Image description": "Descrizione Immagine",
"Source": "Fonte",
"Dimensions": "Dimenzioni",
"Constrain proportions": "Mantieni Proporzioni",
"General": "Generale",
"Advanced": "Avanzato",
"Style": "Stile",
"Vertical space": "Spazio Verticale",
"Horizontal space": "Spazio Orizzontale",
"Border": "Bordo",
"Insert image": "Inserisci immagine",
"Image...": "Immagine...",
"Image list": "Elenco immagini",
"Rotate counterclockwise": "Ruota in senso antiorario",
"Rotate clockwise": "Ruota in senso orario",
"Flip vertically": "Rifletti verticalmente",
"Flip horizontally": "Rifletti orizzontalmente",
"Edit image": "Modifica immagine",
"Image options": "Opzioni immagine",
"Zoom in": "Ingrandisci",
"Zoom out": "Rimpicciolisci",
"Crop": "Taglia",
"Resize": "Ridimensiona",
"Orientation": "Orientamento",
"Brightness": "Luminosit\u00e0",
"Sharpen": "Contrasta",
"Contrast": "Contrasto",
"Color levels": "Livelli colore",
"Gamma": "Gamma",
"Invert": "Inverti",
"Apply": "Applica",
"Back": "Indietro",
"Insert date\/time": "Inserisci Data\/Ora",
"Date\/time": "Data\/Ora",
"Insert\/Edit Link": "Inserisci\/modifica collegamento",
"Insert\/edit link": "Inserisci\/Modifica Link",
"Text to display": "Testo da Visualizzare",
"Url": "Url",
"Open link in...": "Apri collegamento in...",
"Current window": "Finestra corrente",
"None": "No",
"New window": "Nuova Finestra",
"Remove link": "Rimuovi link",
"Anchors": "Anchors",
"Link...": "Collegamento...",
"Paste or type a link": "Incolla o digita un collegamento",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Vuoi aggiungere il prefisso necessario mailto:?",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Vuoi aggiungere il prefisso necessario http:\/\/?",
"Link list": "Elenco link",
"Insert video": "Inserisci Video",
"Insert\/edit video": "Inserisci\/Modifica Video",
"Insert\/edit media": "Inserisci\/Modifica Media",
"Alternative source": "Alternativo",
"Alternative source URL": "URL sorgente alternativa",
"Media poster (Image URL)": "Poster dell'oggetto multimediale (URL dell'immagine)",
"Paste your embed code below:": "Incolla il codice d'incorporamento qui:",
"Embed": "Incorporare",
"Media...": "Oggetto multimediale...",
"Nonbreaking space": "Spazio unificatore",
"Page break": "Interruzione di pagina",
"Paste as text": "incolla come testo",
"Preview": "Anteprima",
"Print...": "Stampa...",
"Save": "Salva",
"Find": "Trova",
"Replace with": "Sostituisci Con",
"Replace": "Sostituisci",
"Replace all": "Sostituisci Tutto",
"Previous": "Indietro",
"Next": "Successivo",
"Find and replace...": "Trova e sostituisci...",
"Could not find the specified string.": "Impossibile trovare la parola specifica.",
"Match case": "Maiuscole\/Minuscole ",
"Find whole words only": "Trova solo parole intere",
"Spell check": "Controllo ortografia",
"Ignore": "Ignora",
"Ignore all": "Ignora Tutto",
"Finish": "Termina",
"Add to Dictionary": "Aggiungi al Dizionario",
"Insert table": "Inserisci Tabella",
"Table properties": "Propiet\u00e0 della Tabella",
"Delete table": "Cancella Tabella",
"Cell": "Cella",
"Row": "Riga",
"Column": "Colonna",
"Cell properties": "Propiet\u00e0 della Cella",
"Merge cells": "Unisci Cella",
"Split cell": "Dividi Cella",
"Insert row before": "Inserisci una Riga Prima",
"Insert row after": "Inserisci una Riga Dopo",
"Delete row": "Cancella Riga",
"Row properties": "Propriet\u00e0 della Riga",
"Cut row": "Taglia Riga",
"Copy row": "Copia Riga",
"Paste row before": "Incolla una Riga Prima",
"Paste row after": "Incolla una Riga Dopo",
"Insert column before": "Inserisci una Colonna Prima",
"Insert column after": "Inserisci una Colonna Dopo",
"Delete column": "Cancella Colonna",
"Cols": "Colonne",
"Rows": "Righe",
"Width": "Larghezza",
"Height": "Altezza",
"Cell spacing": "Spaziatura della Cella",
"Cell padding": "Padding della Cella",
"Show caption": "Mostra didascalia",
"Left": "Sinistra",
"Center": "Centro",
"Right": "Destra",
"Cell type": "Tipo di Cella",
"Scope": "Campo",
"Alignment": "Allineamento",
"H Align": "Allineamento H",
"V Align": "Allineamento V",
"Top": "In alto",
"Middle": "In mezzo",
"Bottom": "In fondo",
"Header cell": "cella d'intestazione",
"Row group": "Gruppo di Righe",
"Column group": "Gruppo di Colonne",
"Row type": "Tipo di Riga",
"Header": "Header",
"Body": "Body",
"Footer": "Footer",
"Border color": "Colore bordo",
"Insert template...": "Inserisci modello...",
"Templates": "Template",
"Template": "Modello",
"Text color": "Colore Testo",
"Background color": "Colore Background",
"Custom...": "Personalizzato...",
"Custom color": "Colore personalizzato",
"No color": "Nessun colore",
"Remove color": "Rimuovi colore",
"Table of Contents": "Tabella dei contenuti",
"Show blocks": "Mostra Blocchi",
"Show invisible characters": "Mostra Caratteri Invisibili",
"Word count": "Conteggio parole",
"Count": "Conteggio",
"Document": "Documento",
"Selection": "Selezione",
"Words": "Parole",
"Words: {0}": "Parole: {0}",
"{0} words": "{0} parole",
"File": "File",
"Edit": "Modifica",
"Insert": "Inserisci",
"View": "Visualiza",
"Format": "Formato",
"Table": "Tabella",
"Tools": "Strumenti",
"Powered by {0}": "Fornito da {0}",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Premi ALT-F9 per il men\u00f9. Premi ALT-F10 per la barra degli strumenti. Premi ALT-0 per l'aiuto.",
"Image title": "Titolo immagine",
"Border width": "Larghezza del bordo",
"Border style": "Stile del bordo",
"Error": "Errore",
"Warn": "Avviso",
"Valid": "Valido",
"To open the popup, press Shift+Enter": "Per aprire il popup, premere Shift+Invio",
"Rich Text Area. Press ALT-0 for help.": "Area di testo RTF. Premere ALT-0 per la guida.",
"System Font": "Carattere di sistema",
"Failed to upload image: {0}": "Caricamento immagine fallito: {0}",
"Failed to load plugin: {0} from url {1}": "Caricamento plugin fallito: {0} dall'URL {1}",
"Failed to load plugin url: {0}": "Caricamento URL plugin fallito: {0}",
"Failed to initialize plugin: {0}": "Inizializzazione plugin fallita: {0}",
"example": "esempio",
"Search": "Cerca",
"All": "Tutto",
"Currency": "Valuta",
"Text": "Testo",
"Quotations": "Citazioni",
"Mathematical": "Caratteri matematici",
"Extended Latin": "Latino esteso",
"Symbols": "Simboli",
"Arrows": "Frecce",
"User Defined": "Definito dall'utente",
"dollar sign": "simbolo del dollaro",
"currency sign": "simbolo di valuta",
"euro-currency sign": "simbolo dell'euro",
"colon sign": "simbolo del col\u00f3n",
"cruzeiro sign": "simbolo del cruzeiro",
"french franc sign": "simbolo del franco francese",
"lira sign": "simbolo della lira",
"mill sign": "simbolo del mill",
"naira sign": "simbolo della naira",
"peseta sign": "simbolo della peseta",
"rupee sign": "simbolo della rup\u00eca",
"won sign": "simbolo del won",
"new sheqel sign": "simbolo del nuovo shekel",
"dong sign": "simbolo del dong",
"kip sign": "simbolo del kip",
"tugrik sign": "simbolo del tugrik",
"drachma sign": "simbolo della dracma",
"german penny symbol": "simbolo del pfennig tedesco",
"peso sign": "simbolo del peso",
"guarani sign": "simbolo del guaran\u00ec",
"austral sign": "simbolo dell'austral",
"hryvnia sign": "simbolo della hryvnia",
"cedi sign": "simbolo del cedi",
"livre tournois sign": "simbolo della lira di Tours",
"spesmilo sign": "simbolo dello spesmilo",
"tenge sign": "simbolo del tenge",
"indian rupee sign": "simbolo della rup\u00eca indiana",
"turkish lira sign": "simbolo della lira turca",
"nordic mark sign": "simbolo del marco nordico",
"manat sign": "simbolo del manat",
"ruble sign": "simbolo del rublo",
"yen character": "simbolo dello yen",
"yuan character": "simbolo dello yuan",
"yuan character, in hong kong and taiwan": "simbolo dello yuan, Hong Kong e Taiwan",
"yen\/yuan character variant one": "simbolo yen\/yuan variante uno",
"Loading emoticons...": "Caricamento emoticon in corso",
"Could not load emoticons": "Impossibile caricare emoticon",
"People": "Persone",
"Animals and Nature": "Animali e natura",
"Food and Drink": "Cibi e bevande",
"Activity": "Attivit\u00e0",
"Travel and Places": "Viaggi e luoghi",
"Objects": "Oggetti",
"Flags": "Bandiere",
"Characters": "Caratteri",
"Characters (no spaces)": "Caratteri (senza spazi)",
"{0} characters": "{0} caratteri",
"Error: Form submit field collision.": "Errore: Conflitto di campi nel modulo inviato.",
"Error: No form element found.": "Errore: Nessun elemento di modulo trovato.",
"Update": "Aggiorna",
"Color swatch": "Campione di colore",
"Turquoise": "Turchese",
"Green": "Verde",
"Blue": "Blu",
"Purple": "Viola",
"Navy Blue": "Blu scuro",
"Dark Turquoise": "Turchese scuro",
"Dark Green": "Verde scuro",
"Medium Blue": "Blu medio",
"Medium Purple": "Viola medio",
"Midnight Blue": "Blu notte",
"Yellow": "Giallo",
"Orange": "Arancio",
"Red": "Rosso",
"Light Gray": "Grigio chiaro",
"Gray": "Grigio",
"Dark Yellow": "Giallo scuro",
"Dark Orange": "Arancio scuro",
"Dark Red": "Rosso scuro",
"Medium Gray": "Grigio medio",
"Dark Gray": "Grigio scuro",
"Light Green": "Verde chiaro",
"Light Yellow": "Giallo chiaro",
"Light Red": "Rosso chiaro",
"Light Purple": "Viola chiaro",
"Light Blue": "Azzurro",
"Dark Purple": "Viola scuro",
"Dark Blue": "Blu scuro",
"Black": "Nero",
"White": "Bianco",
"Switch to or from fullscreen mode": "Attiva\/disattiva la modalit\u00e0 schermo intero",
"Open help dialog": "Apri la finestra di aiuto",
"history": "cronologia",
"styles": "stili",
"formatting": "formattazione",
"alignment": "allineamento",
"indentation": "indentazione",
"permanent pen": "penna indelebile",
"comments": "commenti",
"Format Painter": "Copia formattazione",
"Insert\/edit iframe": "Inserisci\/modifica iframe",
"Capitalization": "Maiuscole\/minuscole",
"lowercase": "minuscole",
"UPPERCASE": "MAIUSCOLE",
"Title Case": "Iniziali Maiuscole",
"Permanent Pen Properties": "Propriet\u00e0 penna indelebile",
"Permanent pen properties...": "Propriet\u00e0 penna indelebile...",
"Font": "Carattere",
"Size": "Dimensione carattere",
"More...": "Altro\u2026",
"Spellcheck Language": "Lingua controllo ortografico",
"Select...": "Seleziona...",
"Preferences": "Preferenze",
"Yes": "S\u00ec",
"No": "No",
"Keyboard Navigation": "Navigazione tramite tastiera",
"Version": "Versione",
"Anchor": "Fissa",
"Special character": "Carattere Speciale",
"Code sample": "Esempio di codice",
"Color": "Colore",
"Emoticons": "Emoction",
"Document properties": "Propriet\u00e0 Documento",
"Image": "Immagine",
"Insert link": "Inserisci il Link",
"Target": "Target",
"Link": "Collegamento",
"Poster": "Anteprima",
"Media": "Media",
"Print": "Stampa",
"Prev": "Precedente",
"Find and replace": "Trova e Sostituisci",
"Whole words": "Parole Sbagliate",
"Spellcheck": "Controllo ortografico",
"Caption": "Didascalia",
"Insert template": "Inserisci Template"
});

419
public/tinymce/langs/ja.js Normal file
View File

@ -0,0 +1,419 @@
tinymce.addI18n('ja',{
"Redo": "\u3084\u308a\u76f4\u3057",
"Undo": "\u5143\u306b\u623b\u3059",
"Cut": "\u5207\u308a\u53d6\u308a",
"Copy": "\u30b3\u30d4\u30fc",
"Paste": "\u8cbc\u308a\u4ed8\u3051",
"Select all": "\u3059\u3079\u3066\u9078\u629e",
"New document": "\u65b0\u898f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
"Ok": "OK",
"Cancel": "\u53d6\u6d88",
"Visual aids": "\u8868\u306e\u67a0\u7dda\u3092\u70b9\u7dda\u3067\u8868\u793a",
"Bold": "\u592a\u5b57",
"Italic": "\u659c\u4f53",
"Underline": "\u4e0b\u7dda",
"Strikethrough": "\u53d6\u6d88\u7dda",
"Superscript": "\u4e0a\u4ed8\u304d",
"Subscript": "\u4e0b\u4ed8\u304d",
"Clear formatting": "\u66f8\u5f0f\u3092\u30af\u30ea\u30a2",
"Align left": "\u5de6\u63c3\u3048",
"Align center": "\u4e2d\u592e\u63c3\u3048",
"Align right": "\u53f3\u63c3\u3048",
"Justify": "\u4e21\u7aef\u63c3\u3048",
"Bullet list": "\u7b87\u6761\u66f8\u304d",
"Numbered list": "\u756a\u53f7\u4ed8\u304d\u7b87\u6761\u66f8\u304d",
"Decrease indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u6e1b\u3089\u3059",
"Increase indent": "\u30a4\u30f3\u30c7\u30f3\u30c8\u3092\u5897\u3084\u3059",
"Close": "\u9589\u3058\u308b",
"Formats": "\u66f8\u5f0f",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u306f\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8\uff08Ctrl+X, Ctrl+C, Ctrl+V\uff09\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
"Headers": "\u30d8\u30c3\u30c0\u30fc",
"Header 1": "\u30d8\u30c3\u30c0\u30fc 1",
"Header 2": "\u30d8\u30c3\u30c0\u30fc 2",
"Header 3": "\u30d8\u30c3\u30c0\u30fc 3",
"Header 4": "\u30d8\u30c3\u30c0\u30fc 4",
"Header 5": "\u30d8\u30c3\u30c0\u30fc 5",
"Header 6": "\u30d8\u30c3\u30c0\u30fc 6",
"Headings": "\u898b\u51fa\u3057",
"Heading 1": "\u898b\u51fa\u30571",
"Heading 2": "\u898b\u51fa\u30572",
"Heading 3": "\u898b\u51fa\u30573",
"Heading 4": "\u898b\u51fa\u30574",
"Heading 5": "\u898b\u51fa\u30575",
"Heading 6": "\u898b\u51fa\u30576",
"Preformatted": "\u66f8\u5f0f\u8a2d\u5b9a\u6e08\u307f",
"Div": "Div",
"Pre": "Pre",
"Code": "\u30b3\u30fc\u30c9",
"Paragraph": "\u6bb5\u843d",
"Blockquote": "Blockquote",
"Inline": "\u30a4\u30f3\u30e9\u30a4\u30f3",
"Blocks": "\u30d6\u30ed\u30c3\u30af",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u8cbc\u308a\u4ed8\u3051\u306f\u73fe\u5728\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30e2\u30fc\u30c9\u3067\u3059\u3002\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u30aa\u30d5\u306b\u3057\u306a\u3044\u9650\u308a\u5185\u5bb9\u306f\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051\u3089\u308c\u307e\u3059\u3002",
"Fonts": "\u30d5\u30a9\u30f3\u30c8",
"Font Sizes": "\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba",
"Class": "\u30af\u30e9\u30b9",
"Browse for an image": "\u753b\u50cf\u3092\u53c2\u7167",
"OR": "OR",
"Drop an image here": "\u3053\u3053\u306b\u753b\u50cf\u3092\u30c9\u30ed\u30c3\u30d7",
"Upload": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
"Block": "\u30d6\u30ed\u30c3\u30af",
"Align": "\u914d\u7f6e",
"Default": "\u30c7\u30d5\u30a9\u30eb\u30c8",
"Circle": "\u5186",
"Disc": "\u70b9",
"Square": "\u56db\u89d2",
"Lower Alpha": "\u5c0f\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8",
"Lower Greek": "\u5c0f\u6587\u5b57\u306e\u30ae\u30ea\u30b7\u30e3\u6587\u5b57",
"Lower Roman": "\u5c0f\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57",
"Upper Alpha": "\u5927\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8",
"Upper Roman": "\u5927\u6587\u5b57\u306e\u30ed\u30fc\u30de\u6570\u5b57",
"Anchor...": "\u30a2\u30f3\u30ab\u30fc...",
"Name": "\u30a2\u30f3\u30ab\u30fc\u540d",
"Id": "Id",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "ID\u306f\u6587\u5b57\u3067\u59cb\u307e\u308a\u3001\u6587\u5b57\u3001\u6570\u5b57\u3001\u30c0\u30c3\u30b7\u30e5\u3001\u30c9\u30c3\u30c8\u3001\u30b3\u30ed\u30f3\u307e\u305f\u306f\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2\u3067\u59cb\u307e\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
"You have unsaved changes are you sure you want to navigate away?": "\u307e\u3060\u4fdd\u5b58\u3057\u3066\u3044\u306a\u3044\u5909\u66f4\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u672c\u5f53\u306b\u3053\u306e\u30da\u30fc\u30b8\u3092\u96e2\u308c\u307e\u3059\u304b\uff1f",
"Restore last draft": "\u524d\u56de\u306e\u4e0b\u66f8\u304d\u3092\u5fa9\u6d3b\u3055\u305b\u308b",
"Special character...": "\u7279\u6b8a\u6587\u5b57...",
"Source code": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9",
"Insert\/Edit code sample": "\u30b3\u30fc\u30c9\u30b5\u30f3\u30d7\u30eb\u306e\u633f\u5165\u30fb\u7de8\u96c6",
"Language": "\u8a00\u8a9e",
"Code sample...": "\u30b3\u30fc\u30c9\u306e\u30b5\u30f3\u30d7\u30eb...",
"Color Picker": "\u30ab\u30e9\u30fc\u30d4\u30c3\u30ab\u30fc",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\u5de6\u304b\u3089\u53f3",
"Right to left": "\u53f3\u304b\u3089\u5de6",
"Emoticons...": "\u7d75\u6587\u5b57...",
"Metadata and Document Properties": "\u30e1\u30bf\u30c7\u30fc\u30bf\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3",
"Title": "\u30bf\u30a4\u30c8\u30eb",
"Keywords": "\u30ad\u30fc\u30ef\u30fc\u30c9",
"Description": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u5185\u5bb9",
"Robots": "\u30ed\u30dc\u30c3\u30c4",
"Author": "\u8457\u8005",
"Encoding": "\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0",
"Fullscreen": "\u5168\u753b\u9762\u8868\u793a",
"Action": "\u30a2\u30af\u30b7\u30e7\u30f3",
"Shortcut": "\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8",
"Help": "\u30d8\u30eb\u30d7",
"Address": "\u30a2\u30c9\u30ec\u30b9",
"Focus to menubar": "\u30e1\u30cb\u30e5\u30fc\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9",
"Focus to toolbar": "\u30c4\u30fc\u30eb\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9",
"Focus to element path": "\u8981\u7d20\u30d1\u30b9\u306b\u30d5\u30a9\u30fc\u30ab\u30b9",
"Focus to contextual toolbar": "\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c4\u30fc\u30eb\u30d0\u30fc\u306b\u30d5\u30a9\u30fc\u30ab\u30b9",
"Insert link (if link plugin activated)": "\u30ea\u30f3\u30af\u3092\u633f\u5165 (\u30ea\u30f3\u30af\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)",
"Save (if save plugin activated)": "\u4fdd\u5b58 (\u4fdd\u5b58\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)",
"Find (if searchreplace plugin activated)": "\u691c\u7d22(\u7f6e\u63db\u30d7\u30e9\u30b0\u30a4\u30f3\u6709\u52b9\u6642)",
"Plugins installed ({0}):": "\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u30d7\u30e9\u30b0\u30a4\u30f3 ({0}):",
"Premium plugins:": "\u30d7\u30ec\u30df\u30a2\u30e0\u30d7\u30e9\u30b0\u30a4\u30f3:",
"Learn more...": "\u8a73\u7d30...",
"You are using {0}": "\u3042\u306a\u305f\u306f {0} \u4f7f\u7528\u4e2d",
"Plugins": "\u30d7\u30e9\u30b0\u30a4\u30f3",
"Handy Shortcuts": "\u4fbf\u5229\u306a\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8",
"Horizontal line": "\u6c34\u5e73\u7f6b\u7dda",
"Insert\/edit image": "\u753b\u50cf\u306e\u633f\u5165\u30fb\u7de8\u96c6",
"Image description": "\u753b\u50cf\u306e\u8aac\u660e\u6587",
"Source": "\u753b\u50cf\u306e\u30bd\u30fc\u30b9",
"Dimensions": "\u753b\u50cf\u30b5\u30a4\u30ba\uff08\u6a2a\u30fb\u7e26\uff09",
"Constrain proportions": "\u7e26\u6a2a\u6bd4\u3092\u4fdd\u6301\u3059\u308b",
"General": "\u4e00\u822c",
"Advanced": "\u8a73\u7d30\u8a2d\u5b9a",
"Style": "\u30b9\u30bf\u30a4\u30eb",
"Vertical space": "\u7e26\u65b9\u5411\u306e\u4f59\u767d",
"Horizontal space": "\u6a2a\u65b9\u5411\u306e\u4f59\u767d",
"Border": "\u67a0\u7dda",
"Insert image": "\u753b\u50cf\u306e\u633f\u5165",
"Image...": "\u753b\u50cf..",
"Image list": "\u753b\u50cf\u4e00\u89a7",
"Rotate counterclockwise": "\u53cd\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2",
"Rotate clockwise": "\u6642\u8a08\u56de\u308a\u306b\u56de\u8ee2",
"Flip vertically": "\u4e0a\u4e0b\u306b\u53cd\u8ee2",
"Flip horizontally": "\u6c34\u5e73\u306b\u53cd\u8ee2",
"Edit image": "\u753b\u50cf\u306e\u7de8\u96c6",
"Image options": "\u753b\u50cf\u30aa\u30d7\u30b7\u30e7\u30f3",
"Zoom in": "\u30ba\u30fc\u30e0\u30a4\u30f3",
"Zoom out": "\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8",
"Crop": "\u30af\u30ed\u30c3\u30d7",
"Resize": "\u30ea\u30b5\u30a4\u30ba",
"Orientation": "\u5411\u304d",
"Brightness": "\u660e\u308b\u3055",
"Sharpen": "\u30b7\u30e3\u30fc\u30d7\u5316",
"Contrast": "\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8",
"Color levels": "\u30ab\u30e9\u30fc\u30ec\u30d9\u30eb",
"Gamma": "\u30ac\u30f3\u30de",
"Invert": "\u53cd\u8ee2",
"Apply": "\u9069\u7528",
"Back": "\u623b\u308b",
"Insert date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b",
"Date\/time": "\u65e5\u4ed8\u30fb\u6642\u523b",
"Insert\/Edit Link": "\u30ea\u30f3\u30af\u306e\u633f\u5165\/\u7de8\u96c6",
"Insert\/edit link": "\u30ea\u30f3\u30af\u306e\u633f\u5165\u30fb\u7de8\u96c6",
"Text to display": "\u30ea\u30f3\u30af\u5143\u30c6\u30ad\u30b9\u30c8",
"Url": "\u30ea\u30f3\u30af\u5148URL",
"Open link in...": "\u30ea\u30f3\u30af\u306e\u958b\u304d\u65b9...",
"Current window": "\u540c\u3058\u30a6\u30a3\u30f3\u30c9\u30a6",
"None": "\u306a\u3057",
"New window": "\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6",
"Remove link": "\u30ea\u30f3\u30af\u306e\u524a\u9664",
"Anchors": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09",
"Link...": "\u30ea\u30f3\u30af...",
"Paste or type a link": "\u30ea\u30f3\u30af\u3092\u30da\u30fc\u30b9\u30c8\u307e\u305f\u306f\u5165\u529b",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u3088\u3046\u3067\u3059\u3002\u300cmailto:\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u5165\u529b\u3055\u308c\u305fURL\u306f\u5916\u90e8\u30ea\u30f3\u30af\u306e\u3088\u3046\u3067\u3059\u3002\u300chttp:\/\/\u300d\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f",
"Link list": "\u30ea\u30f3\u30af\u4e00\u89a7",
"Insert video": "\u52d5\u753b",
"Insert\/edit video": "\u52d5\u753b\u306e\u633f\u5165\u30fb\u7de8\u96c6",
"Insert\/edit media": "\u30e1\u30c7\u30a3\u30a2\u306e\u633f\u5165\u30fb\u7de8\u96c6",
"Alternative source": "\u4ee3\u66ff\u52d5\u753b\u306e\u5834\u6240",
"Alternative source URL": "\u4ee3\u66ff\u30bd\u30fc\u30b9URL",
"Media poster (Image URL)": "\u30e1\u30c7\u30a3\u30a2\u30dd\u30b9\u30bf\u30fc (\u753b\u50cfURL)",
"Paste your embed code below:": "\u57cb\u3081\u8fbc\u307f\u7528\u30b3\u30fc\u30c9\u3092\u4e0b\u8a18\u306b\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002",
"Embed": "\u57cb\u3081\u8fbc\u307f",
"Media...": "\u30e1\u30c7\u30a3\u30a2\u2026",
"Nonbreaking space": "\u56fa\u5b9a\u30b9\u30da\u30fc\u30b9\uff08&nbsp;\uff09",
"Page break": "\u30da\u30fc\u30b8\u533a\u5207\u308a",
"Paste as text": "\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u8cbc\u308a\u4ed8\u3051",
"Preview": "\u30d7\u30ec\u30d3\u30e5\u30fc",
"Print...": "\u5370\u5237...",
"Save": "\u4fdd\u5b58",
"Find": "\u691c\u7d22",
"Replace with": "\u7f6e\u304d\u63db\u3048\u308b\u6587\u5b57",
"Replace": "\u7f6e\u304d\u63db\u3048",
"Replace all": "\u5168\u3066\u3092\u7f6e\u304d\u63db\u3048\u308b",
"Previous": "\u524d\u3078",
"Next": "\u6b21",
"Find and replace...": "\u7f6e\u63db...",
"Could not find the specified string.": "\u304a\u63a2\u3057\u306e\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002",
"Match case": "\u5927\u6587\u5b57\u30fb\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3059\u308b",
"Find whole words only": "\u8a9e\u5168\u4f53\u3092\u542b\u3080\u3082\u306e\u306e\u307f\u691c\u7d22",
"Spell check": "\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af",
"Ignore": "\u7121\u8996",
"Ignore all": "\u5168\u3066\u3092\u7121\u8996",
"Finish": "\u7d42\u4e86",
"Add to Dictionary": "\u8f9e\u66f8\u306b\u8ffd\u52a0",
"Insert table": "\u8868\u306e\u633f\u5165",
"Table properties": "\u8868\u306e\u8a73\u7d30\u8a2d\u5b9a",
"Delete table": "\u8868\u306e\u524a\u9664",
"Cell": "\u30bb\u30eb",
"Row": "\u884c",
"Column": "\u5217",
"Cell properties": "\u30bb\u30eb\u306e\u8a73\u7d30\u8a2d\u5b9a",
"Merge cells": "\u30bb\u30eb\u306e\u7d50\u5408",
"Split cell": "\u30bb\u30eb\u306e\u5206\u5272",
"Insert row before": "\u4e0a\u5074\u306b\u884c\u3092\u633f\u5165",
"Insert row after": "\u4e0b\u5074\u306b\u884c\u3092\u633f\u5165",
"Delete row": "\u884c\u306e\u524a\u9664",
"Row properties": "\u884c\u306e\u8a73\u7d30\u8a2d\u5b9a",
"Cut row": "\u884c\u306e\u5207\u308a\u53d6\u308a",
"Copy row": "\u884c\u306e\u30b3\u30d4\u30fc",
"Paste row before": "\u4e0a\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051",
"Paste row after": "\u4e0b\u5074\u306b\u884c\u3092\u8cbc\u308a\u4ed8\u3051",
"Insert column before": "\u5de6\u5074\u306b\u5217\u3092\u633f\u5165",
"Insert column after": "\u53f3\u5074\u306b\u5217\u3092\u633f\u5165",
"Delete column": "\u5217\u306e\u524a\u9664",
"Cols": "\u5217\u6570",
"Rows": "\u884c\u6570",
"Width": "\u5e45",
"Height": "\u9ad8\u3055",
"Cell spacing": "\u30bb\u30eb\u306e\u9593\u9694",
"Cell padding": "\u30bb\u30eb\u5185\u4f59\u767d\uff08\u30d1\u30c7\u30a3\u30f3\u30b0\uff09",
"Show caption": "\u30ad\u30e3\u30d7\u30b7\u30e7\u30f3\u306e\u8868\u793a",
"Left": "\u5de6\u5bc4\u305b",
"Center": "\u4e2d\u592e\u63c3\u3048",
"Right": "\u53f3\u5bc4\u305b",
"Cell type": "\u30bb\u30eb\u30bf\u30a4\u30d7",
"Scope": "\u30b9\u30b3\u30fc\u30d7",
"Alignment": "\u914d\u7f6e",
"H Align": "\u6c34\u5e73\u65b9\u5411\u306e\u914d\u7f6e",
"V Align": "\u5782\u76f4\u65b9\u5411\u306e\u914d\u7f6e",
"Top": "\u4e0a",
"Middle": "\u4e2d\u592e",
"Bottom": "\u4e0b",
"Header cell": "\u30d8\u30c3\u30c0\u30fc\u30bb\u30eb",
"Row group": "\u884c\u30b0\u30eb\u30fc\u30d7",
"Column group": "\u5217\u30b0\u30eb\u30fc\u30d7",
"Row type": "\u884c\u30bf\u30a4\u30d7",
"Header": "\u30d8\u30c3\u30c0\u30fc",
"Body": "\u30dc\u30c7\u30a3\u30fc",
"Footer": "\u30d5\u30c3\u30bf\u30fc",
"Border color": "\u67a0\u7dda\u306e\u8272",
"Insert template...": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u633f\u5165..",
"Templates": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u540d",
"Template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
"Text color": "\u30c6\u30ad\u30b9\u30c8\u306e\u8272",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u30ab\u30b9\u30bf\u30e0...",
"Custom color": "\u30ab\u30b9\u30bf\u30e0\u30ab\u30e9\u30fc",
"No color": "\u30ab\u30e9\u30fc\u306a\u3057",
"Remove color": "\u8272\u8a2d\u5b9a\u3092\u89e3\u9664",
"Table of Contents": "\u76ee\u6b21",
"Show blocks": "\u6587\u7ae0\u306e\u533a\u5207\u308a\u3092\u70b9\u7dda\u3067\u8868\u793a",
"Show invisible characters": "\u4e0d\u53ef\u8996\u6587\u5b57\u3092\u8868\u793a",
"Word count": "\u6587\u5b57\u6570\u30ab\u30a6\u30f3\u30c8",
"Count": "\u30ab\u30a6\u30f3\u30c8",
"Document": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8",
"Selection": "\u9078\u629e",
"Words": "\u5358\u8a9e\u6570",
"Words: {0}": "\u5358\u8a9e\u6570: {0}",
"{0} words": "{0} \u30ef\u30fc\u30c9",
"File": "\u30d5\u30a1\u30a4\u30eb",
"Edit": "\u7de8\u96c6",
"Insert": "\u633f\u5165",
"View": "\u8868\u793a",
"Format": "\u66f8\u5f0f",
"Table": "\u8868",
"Tools": "\u30c4\u30fc\u30eb",
"Powered by {0}": "Powered by {0}",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u66f8\u5f0f\u4ed8\u304d\u30c6\u30ad\u30b9\u30c8\u306e\u7de8\u96c6\u753b\u9762\u3002ALT-F9\u3067\u30e1\u30cb\u30e5\u30fc\u3001ALT-F10\u3067\u30c4\u30fc\u30eb\u30d0\u30fc\u3001ALT-0\u3067\u30d8\u30eb\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002",
"Image title": "\u753b\u50cf\u30bf\u30a4\u30c8\u30eb",
"Border width": "\u67a0\u7dda\u5e45",
"Border style": "\u67a0\u7dda\u30b9\u30bf\u30a4\u30eb",
"Error": "\u30a8\u30e9\u30fc",
"Warn": "\u8b66\u544a",
"Valid": "\u6709\u52b9",
"To open the popup, press Shift+Enter": "\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7\u3092\u958b\u304f\u306b\u306f\u3001Shift+Enter\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044",
"Rich Text Area. Press ALT-0 for help.": "\u30ea\u30c3\u30c1\u30c6\u30ad\u30b9\u30c8\u30a8\u30ea\u30a2\u3002Alt-0\u3067\u30d8\u30eb\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002",
"System Font": "\u30b7\u30b9\u30c6\u30e0\u30d5\u30a9\u30f3\u30c8",
"Failed to upload image: {0}": "\u753b\u50cf{0}\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
"Failed to load plugin: {0} from url {1}": "URL{1}\u304b\u3089\u306e\u30d7\u30e9\u30b0\u30a4\u30f3{0}\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
"Failed to load plugin url: {0}": "\u30d7\u30e9\u30b0\u30a4\u30f3\u306eURL{0}\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f",
"Failed to initialize plugin: {0}": "\u30d7\u30e9\u30b0\u30a4\u30f3{0}\u306e\u521d\u671f\u5316\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
"example": "\u4f8b",
"Search": "\u691c\u7d22",
"All": "\u3059\u3079\u3066",
"Currency": "\u901a\u8ca8",
"Text": "\u30c6\u30ad\u30b9\u30c8",
"Quotations": "\u5f15\u7528",
"Mathematical": "\u6570\u5b66\u8a18\u53f7",
"Extended Latin": "\u30e9\u30c6\u30f3\u6587\u5b57\u62e1\u5f35",
"Symbols": "\u8a18\u53f7",
"Arrows": "\u77e2\u5370",
"User Defined": "\u30e6\u30fc\u30b6\u30fc\u5b9a\u7fa9",
"dollar sign": "\u30c9\u30eb\u8a18\u53f7",
"currency sign": "\u901a\u8ca8\u8a18\u53f7",
"euro-currency sign": "\u30e6\u30fc\u30ed\u8a18\u53f7",
"colon sign": "\u30b3\u30ed\u30f3\u8a18\u53f7",
"cruzeiro sign": "\u30af\u30eb\u30bc\u30a4\u30ed\u8a18\u53f7",
"french franc sign": "\u30d5\u30e9\u30f3\u30b9\u30d5\u30e9\u30f3\u8a18\u53f7",
"lira sign": "\u30ea\u30e9\u8a18\u53f7",
"mill sign": "\u30df\u30eb\u8a18\u53f7",
"naira sign": "\u30ca\u30a4\u30e9\u8a18\u53f7",
"peseta sign": "\u30da\u30bb\u30bf\u8a18\u53f7",
"rupee sign": "\u30eb\u30d4\u30fc\u8a18\u53f7",
"won sign": "\u30a6\u30a9\u30f3\u8a18\u53f7",
"new sheqel sign": "\u65b0\u30b7\u30a7\u30b1\u30eb\u8a18\u53f7",
"dong sign": "\u30c9\u30f3\u8a18\u53f7",
"kip sign": "\u30ad\u30fc\u30d7\u8a18\u53f7",
"tugrik sign": "\u30c8\u30a5\u30b0\u30eb\u30b0\u8a18\u53f7",
"drachma sign": "\u30c9\u30e9\u30af\u30de\u8a18\u53f7",
"german penny symbol": "\u30c9\u30a4\u30c4\u30da\u30cb\u30fc\u8a18\u53f7",
"peso sign": "\u30da\u30bd\u8a18\u53f7",
"guarani sign": "\u30ac\u30e9\u30cb\u8a18\u53f7",
"austral sign": "\u30a2\u30a6\u30b9\u30c8\u30e9\u30eb\u8a18\u53f7",
"hryvnia sign": "\u30d5\u30ea\u30f4\u30cb\u30e3\u8a18\u53f7",
"cedi sign": "\u30bb\u30c7\u30a3\u8a18\u53f7",
"livre tournois sign": "\u30c8\u30a5\u30fc\u30eb\u30dd\u30f3\u30c9\u8a18\u53f7",
"spesmilo sign": "\u30b9\u30da\u30b9\u30df\u30fc\u30ed\u8a18\u53f7",
"tenge sign": "\u30c6\u30f3\u30b2\u8a18\u53f7",
"indian rupee sign": "\u30a4\u30f3\u30c9\u30eb\u30d4\u30fc\u8a18\u53f7",
"turkish lira sign": "\u30c8\u30eb\u30b3\u30ea\u30e9\u8a18\u53f7",
"nordic mark sign": "\u5317\u6b27\u30de\u30eb\u30af\u8a18\u53f7",
"manat sign": "\u30de\u30ca\u30c8\u8a18\u53f7",
"ruble sign": "\u30eb\u30fc\u30d6\u30eb\u8a18\u53f7",
"yen character": "\u5186\u8a18\u53f7",
"yuan character": "\u4eba\u6c11\u5143\u8a18\u53f7",
"yuan character, in hong kong and taiwan": "\u9999\u6e2f\u304a\u3088\u3073\u53f0\u6e7e\u306b\u304a\u3051\u308b\u5143\u8a18\u53f7",
"yen\/yuan character variant one": "\u5186\/\u5143\u8a18\u53f7\u306e\u30d0\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3",
"Loading emoticons...": "\u7d75\u6587\u5b57\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059...",
"Could not load emoticons": "\u7d75\u6587\u5b57\u304c\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002",
"People": "\u4eba",
"Animals and Nature": "\u52d5\u7269\u3068\u81ea\u7136",
"Food and Drink": "\u98df\u3079\u7269\u3068\u98f2\u307f\u7269",
"Activity": "\u884c\u52d5",
"Travel and Places": "\u65c5\u884c\u3068\u5834\u6240",
"Objects": "\u7269",
"Flags": "\u65d7",
"Characters": "\u6587\u5b57\u6570",
"Characters (no spaces)": "\u6587\u5b57\u6570 (\u30b9\u30da\u30fc\u30b9\u306a\u3057)",
"{0} characters": "{0}\u6587\u5b57",
"Error: Form submit field collision.": "\u30a8\u30e9\u30fc\uff1a\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u7af6\u5408\u3057\u3066\u3044\u307e\u3059\u3002",
"Error: No form element found.": "\u30a8\u30e9\u30fc\uff1a\u30d5\u30a9\u30fc\u30e0\u8981\u7d20\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002",
"Update": "\u66f4\u65b0",
"Color swatch": "\u8272\u306e\u898b\u672c",
"Turquoise": "\u30bf\u30fc\u30b3\u30a4\u30ba",
"Green": "\u30b0\u30ea\u30fc\u30f3",
"Blue": "\u30d6\u30eb\u30fc",
"Purple": "\u30d1\u30fc\u30d7\u30eb",
"Navy Blue": "\u30cd\u30a4\u30d3\u30fc",
"Dark Turquoise": "\u30c0\u30fc\u30af\u30bf\u30fc\u30b3\u30a4\u30ba",
"Dark Green": "\u30c0\u30fc\u30af\u30b0\u30ea\u30fc\u30f3",
"Medium Blue": "\u30e1\u30c7\u30a3\u30a2\u30e0\u30d6\u30eb\u30fc",
"Medium Purple": "\u30df\u30c7\u30a3\u30a2\u30e0\u30d1\u30fc\u30d7\u30eb",
"Midnight Blue": "\u30df\u30c3\u30c9\u30ca\u30a4\u30c8\u30d6\u30eb\u30fc",
"Yellow": "\u30a4\u30a8\u30ed\u30fc",
"Orange": "\u30aa\u30ec\u30f3\u30b8",
"Red": "\u30ec\u30c3\u30c9",
"Light Gray": "\u30e9\u30a4\u30c8\u30b0\u30ec\u30fc",
"Gray": "\u30b0\u30ec\u30fc",
"Dark Yellow": "\u30c0\u30fc\u30af\u30a4\u30a8\u30ed\u30fc",
"Dark Orange": "\u30c0\u30fc\u30af\u30aa\u30ec\u30f3\u30b8",
"Dark Red": "\u30c0\u30fc\u30af\u30ec\u30c3\u30c9",
"Medium Gray": "\u30df\u30c7\u30a3\u30a2\u30e0\u30b0\u30ec\u30fc",
"Dark Gray": "\u30c0\u30fc\u30af\u30b0\u30ec\u30fc",
"Light Green": "\u30e9\u30a4\u30c8\u30b0\u30ea\u30fc\u30f3",
"Light Yellow": "\u30e9\u30a4\u30c8\u30a4\u30a8\u30ed\u30fc",
"Light Red": "\u30e9\u30a4\u30c8\u30ec\u30c3\u30c9",
"Light Purple": "\u30e9\u30a4\u30c8\u30d1\u30fc\u30d7\u30eb",
"Light Blue": "\u30e9\u30a4\u30c8\u30d6\u30eb\u30fc",
"Dark Purple": "\u30c0\u30fc\u30af\u30d1\u30fc\u30d7\u30eb",
"Dark Blue": "\u30c0\u30fc\u30af\u30d6\u30eb\u30fc",
"Black": "\u30d6\u30e9\u30c3\u30af",
"White": "\u30db\u30ef\u30a4\u30c8",
"Switch to or from fullscreen mode": "\u30d5\u30eb\u30b9\u30af\u30ea\u30fc\u30f3\u30e2\u30fc\u30c9\u5207\u66ff",
"Open help dialog": "\u30d8\u30eb\u30d7\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u958b\u304f",
"history": "\u5c65\u6b74",
"styles": "\u30b9\u30bf\u30a4\u30eb",
"formatting": "\u66f8\u5f0f",
"alignment": "\u914d\u7f6e",
"indentation": "\u30a4\u30f3\u30c7\u30f3\u30c8",
"permanent pen": "\u86cd\u5149\u30da\u30f3",
"comments": "\u30b3\u30e1\u30f3\u30c8",
"Format Painter": "\u66f8\u5f0f\u306e\u30b3\u30d4\u30fc\/\u8cbc\u308a\u4ed8\u3051",
"Insert\/edit iframe": "iframe\u306e\u633f\u5165\/\u7de8\u96c6",
"Capitalization": "\u5927\u6587\u5b57\u5316",
"lowercase": "\u5c0f\u6587\u5b57",
"UPPERCASE": "\u5927\u6587\u5b57",
"Title Case": "\u30bf\u30a4\u30c8\u30eb\u6587\u5b57",
"Permanent Pen Properties": "\u86cd\u5149\u30da\u30f3\u306e\u30d7\u30ed\u30d1\u30c6\u30a3",
"Permanent pen properties...": "\u86cd\u5149\u30da\u30f3\u306e\u30d7\u30ed\u30d1\u30c6\u30a3...",
"Font": "\u30d5\u30a9\u30f3\u30c8",
"Size": "\u30b5\u30a4\u30ba",
"More...": "\u8a73\u7d30...",
"Spellcheck Language": "\u8a00\u8a9e\u306e\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af",
"Select...": "\u9078\u629e...",
"Preferences": "\u30d7\u30ea\u30d5\u30a1\u30ec\u30f3\u30b9",
"Yes": "\u306f\u3044",
"No": "\u3044\u3044\u3048",
"Keyboard Navigation": "\u30ad\u30fc\u30dc\u30fc\u30c9\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3",
"Version": "\u30d0\u30fc\u30b8\u30e7\u30f3",
"Anchor": "\u30a2\u30f3\u30ab\u30fc\uff08\u30ea\u30f3\u30af\u306e\u5230\u9054\u70b9\uff09",
"Special character": "\u7279\u6b8a\u6587\u5b57",
"Code sample": "\u30b3\u30fc\u30c9\u30b5\u30f3\u30d7\u30eb",
"Color": "\u30ab\u30e9\u30fc",
"Emoticons": "\u7d75\u6587\u5b57",
"Document properties": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3",
"Image": "\u753b\u50cf",
"Insert link": "\u30ea\u30f3\u30af",
"Target": "\u30bf\u30fc\u30b2\u30c3\u30c8\u5c5e\u6027",
"Link": "\u30ea\u30f3\u30af",
"Poster": "\u4ee3\u66ff\u753b\u50cf\u306e\u5834\u6240",
"Media": "\u30e1\u30c7\u30a3\u30a2",
"Print": "\u5370\u5237",
"Prev": "\u524d",
"Find and replace": "\u691c\u7d22\u3068\u7f6e\u304d\u63db\u3048",
"Whole words": "\u5358\u8a9e\u5358\u4f4d\u3067\u691c\u7d22\u3059\u308b",
"Spellcheck": "\u30b9\u30da\u30eb\u30c1\u30a7\u30c3\u30af",
"Caption": "\u8868\u984c",
"Insert template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u633f\u5165"
});

View File

@ -0,0 +1,419 @@
tinymce.addI18n('ko_KR',{
"Redo": "\ub2e4\uc2dc \uc2e4\ud589",
"Undo": "\uc2e4\ud589 \ucde8\uc18c",
"Cut": "\uc798\ub77c\ub0b4\uae30",
"Copy": "\ubcf5\uc0ac",
"Paste": "\ubd99\uc5ec\ub123\uae30",
"Select all": "\uc804\uccb4\uc120\ud0dd",
"New document": "\uc0c8 \ubb38\uc11c",
"Ok": "\ud655\uc778",
"Cancel": "\ucde8\uc18c",
"Visual aids": "\uc2dc\uac01\uad50\uc7ac",
"Bold": "\uad75\uac8c",
"Italic": "\uae30\uc6b8\uc784\uaf34",
"Underline": "\ubc11\uc904",
"Strikethrough": "\ucde8\uc18c\uc120",
"Superscript": "\uc704 \ucca8\uc790",
"Subscript": "\uc544\ub798 \ucca8\uc790",
"Clear formatting": "\uc11c\uc2dd \uc9c0\uc6b0\uae30",
"Align left": "\uc67c\ucabd \ub9de\ucda4",
"Align center": "\uac00\uc6b4\ub370 \ub9de\ucda4",
"Align right": "\uc624\ub978\ucabd \ub9de\ucda4",
"Justify": "\uc591\ucabd \ub9de\ucda4",
"Bullet list": "\uae00\uba38\ub9ac \uae30\ud638 \ubaa9\ub85d",
"Numbered list": "\ubc88\ud638 \ub9e4\uae30\uae30 \ubaa9\ub85d",
"Decrease indent": "\ub0b4\uc5b4\uc4f0\uae30",
"Increase indent": "\ub4e4\uc5ec\uc4f0\uae30",
"Close": "\ub2eb\uae30",
"Formats": "\uc11c\uc2dd",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\ube0c\ub77c\uc6b0\uc800\uac00 \ud074\ub9bd\ubcf4\ub4dc \uc811\uadfc\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Ctrl+X\/C\/V \ub2e8\ucd95\ud0a4\ub97c \uc774\uc6a9\ud558\uc2ed\uc2dc\uc624.",
"Headers": "\uba38\ub9ac\uae00",
"Header 1": "\uba38\ub9ac\uae00 1",
"Header 2": "\uba38\ub9ac\uae00 2",
"Header 3": "\uba38\ub9ac\uae00 3",
"Header 4": "\uba38\ub9ac\uae00 4",
"Header 5": "\uba38\ub9ac\uae00 5",
"Header 6": "\uba38\ub9ac\uae00 6",
"Headings": "\uc81c\ubaa9",
"Heading 1": "\uc81c\ubaa9 1",
"Heading 2": "\uc81c\ubaa9 2",
"Heading 3": "\uc81c\ubaa9 3",
"Heading 4": "\uc81c\ubaa9 4",
"Heading 5": "\uc81c\ubaa9 5",
"Heading 6": "\uc81c\ubaa9 6",
"Preformatted": "\uc11c\uc2dd \ubbf8\uc124\uc815",
"Div": "Div",
"Pre": "Pre",
"Code": "\ucf54\ub4dc",
"Paragraph": "\ub2e8\ub77d",
"Blockquote": "\uc778\uc6a9\ubb38",
"Inline": "\uc778\ub77c\uc778",
"Blocks": "\ube14\ub85d",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\uc2a4\ud0c0\uc77c\ubcf5\uc0ac \ub044\uae30. \uc774 \uc635\uc158\uc744 \ub044\uae30 \uc804\uc5d0\ub294 \ubcf5\uc0ac \uc2dc, \uc2a4\ud0c0\uc77c\uc774 \ubcf5\uc0ac\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.",
"Fonts": "\uae00\uaf34",
"Font Sizes": "\uae00\uaf34 \ud06c\uae30",
"Class": "\ud074\ub798\uc2a4",
"Browse for an image": "\uc774\ubbf8\uc9c0 \ucc3e\uae30",
"OR": "\ub610\ub294",
"Drop an image here": "\uc5ec\uae30\ub85c \uc774\ubbf8\uc9c0 \ub04c\uc5b4\uc624\uae30",
"Upload": "\uc5c5\ub85c\ub4dc",
"Block": "\ube14\ub85d",
"Align": "\uc815\ub82c",
"Default": "\uae30\ubcf8",
"Circle": "\uc6d0",
"Disc": "\uc6d0\ubc18",
"Square": "\uc0ac\uac01",
"Lower Alpha": "\uc54c\ud30c\ubcb3 \uc18c\ubb38\uc790",
"Lower Greek": "\uadf8\ub9ac\uc2a4\uc5b4 \uc18c\ubb38\uc790",
"Lower Roman": "\ub85c\ub9c8\uc790 \uc18c\ubb38\uc790",
"Upper Alpha": "\uc54c\ud30c\ubcb3 \uc18c\ubb38\uc790",
"Upper Roman": "\ub85c\ub9c8\uc790 \ub300\ubb38\uc790",
"Anchor...": "\uc575\ucee4...",
"Name": "\uc774\ub984",
"Id": "\uc544\uc774\ub514",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\uc544\uc774\ub514\ub294 \ubb38\uc790, \uc22b\uc790, \ub300\uc2dc, \uc810, \ucf5c\ub860 \ub610\ub294 \ubc11\uc904\ub85c \uc2dc\uc791\ud574\uc57c\ud569\ub2c8\ub2e4.",
"You have unsaved changes are you sure you want to navigate away?": "\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \uc815\ubcf4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud398\uc774\uc9c0\ub97c \ubc97\uc5b4\ub098\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"Restore last draft": "\ub9c8\uc9c0\ub9c9 \ucd08\uc548 \ubcf5\uc6d0",
"Special character...": "\ud2b9\uc218 \ubb38\uc790...",
"Source code": "\uc18c\uc2a4\ucf54\ub4dc",
"Insert\/Edit code sample": "\ucf54\ub4dc\uc0d8\ud50c \uc0bd\uc785\/\ud3b8\uc9d1",
"Language": "\uc5b8\uc5b4",
"Code sample...": "\ucf54\ub4dc \uc0d8\ud50c...",
"Color Picker": "\uc0c9 \uc120\ud0dd\uae30",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd",
"Right to left": "\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd",
"Emoticons...": "\uc774\ubaa8\ud2f0\ucf58...",
"Metadata and Document Properties": "\uba54\ud0c0\ub370\uc774\ud130\uc640 \ubb38\uc11c \uc18d\uc131",
"Title": "\uc81c\ubaa9",
"Keywords": "\ud0a4\uc6cc\ub4dc",
"Description": "\uc124\uba85",
"Robots": "\ub85c\ubd07",
"Author": "\uc800\uc790",
"Encoding": "\uc778\ucf54\ub529",
"Fullscreen": "\uc804\uccb4\ud654\uba74",
"Action": "\ub3d9\uc791",
"Shortcut": "\ub2e8\ucd95\ud0a4",
"Help": "\ub3c4\uc6c0\ub9d0",
"Address": "\uc8fc\uc18c",
"Focus to menubar": "\uba54\ub274\uc5d0 \ud3ec\ucee4\uc2a4",
"Focus to toolbar": "\ud234\ubc14\uc5d0 \ud3ec\ucee4\uc2a4",
"Focus to element path": "element path\uc5d0 \ud3ec\ucee4\uc2a4",
"Focus to contextual toolbar": "\ucf04\ud14d\uc2a4\ud2b8 \ud234\ubc14\uc5d0 \ud3ec\ucee4\uc2a4",
"Insert link (if link plugin activated)": "\ub9c1\ud06c \uc0bd\uc785 (link \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)",
"Save (if save plugin activated)": "\uc800\uc7a5 (save \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)",
"Find (if searchreplace plugin activated)": "\ucc3e\uae30(searchreplace \ud50c\ub7ec\uadf8\uc778\uc774 \ud65c\uc131\ud654\ub41c \uc0c1\ud0dc\uc5d0\uc11c)",
"Plugins installed ({0}):": "\uc124\uce58\ub41c \ud50c\ub7ec\uadf8\uc778 ({0}):",
"Premium plugins:": "\uace0\uae09 \ud50c\ub7ec\uadf8\uc778",
"Learn more...": "\uc880 \ub354 \uc0b4\ud3b4\ubcf4\uae30",
"You are using {0}": "{0}\ub97c \uc0ac\uc6a9\uc911",
"Plugins": "\ud50c\ub7ec\uadf8\uc778",
"Handy Shortcuts": "\ub2e8\ucd95\ud0a4",
"Horizontal line": "\uac00\ub85c",
"Insert\/edit image": "\uc774\ubbf8\uc9c0 \uc0bd\uc785\/\uc218\uc815",
"Image description": "\uc774\ubbf8\uc9c0 \uc124\uba85",
"Source": "\uc18c\uc2a4",
"Dimensions": "\ud06c\uae30",
"Constrain proportions": "\uc791\uc5c5 \uc81c\ud55c",
"General": "\uc77c\ubc18",
"Advanced": "\uace0\uae09",
"Style": "\uc2a4\ud0c0\uc77c",
"Vertical space": "\uc218\uc9c1 \uacf5\ubc31",
"Horizontal space": "\uc218\ud3c9 \uacf5\ubc31",
"Border": "\ud14c\ub450\ub9ac",
"Insert image": "\uc774\ubbf8\uc9c0 \uc0bd\uc785",
"Image...": "\uc774\ubbf8\uc9c0...",
"Image list": "\uc774\ubbf8\uc9c0 \ubaa9\ub85d",
"Rotate counterclockwise": "\uc2dc\uacc4\ubc18\ub300\ubc29\ud5a5\uc73c\ub85c \ud68c\uc804",
"Rotate clockwise": "\uc2dc\uacc4\ubc29\ud5a5\uc73c\ub85c \ud68c\uc804",
"Flip vertically": "\uc218\uc9c1 \ub4a4\uc9d1\uae30",
"Flip horizontally": "\uc218\ud3c9 \ub4a4\uc9d1\uae30",
"Edit image": "\uc774\ubbf8\uc9c0 \ud3b8\uc9d1",
"Image options": "\uc774\ubbf8\uc9c0 \uc635\uc158",
"Zoom in": "\ud655\ub300",
"Zoom out": "\ucd95\uc18c",
"Crop": "\uc790\ub974\uae30",
"Resize": "\ud06c\uae30 \uc870\uc808",
"Orientation": "\ubc29\ud5a5",
"Brightness": "\ubc1d\uae30",
"Sharpen": "\uc120\uba85\ud558\uac8c",
"Contrast": "\ub300\ube44",
"Color levels": "\uc0c9\uc0c1\ub808\ubca8",
"Gamma": "\uac10\ub9c8",
"Invert": "\ubc18\uc804",
"Apply": "\uc801\uc6a9",
"Back": "\ub4a4\ub85c",
"Insert date\/time": "\ub0a0\uc9dc\/\uc2dc\uac04\uc0bd\uc785",
"Date\/time": "\ub0a0\uc9dc\/\uc2dc\uac04",
"Insert\/Edit Link": "\ub9c1\ud06c \uc0bd\uc785\/\ud3b8\uc9d1",
"Insert\/edit link": "\ub9c1\ud06c \uc0bd\uc785\/\uc218\uc815",
"Text to display": "\ubcf8\ubb38",
"Url": "\uc8fc\uc18c",
"Open link in...": "...\uc5d0\uc11c \ub9c1\ud06c \uc5f4\uae30",
"Current window": "\ud604\uc7ac \ucc3d",
"None": "\uc5c6\uc74c",
"New window": "\uc0c8\ucc3d",
"Remove link": "\ub9c1\ud06c\uc0ad\uc81c",
"Anchors": "\ucc45\uac08\ud53c",
"Link...": "\ub9c1\ud06c...",
"Paste or type a link": "\ub9c1\ud06c\ub97c \ubd99\uc5ec\ub123\uac70\ub098 \uc785\ub825\ud558\uc138\uc694",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\ud604\uc7ac E-mail\uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc168\uc2b5\ub2c8\ub2e4. E-mail \uc8fc\uc18c\uc5d0 \ub9c1\ud06c\ub97c \uac78\uae4c\uc694?",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\ud604\uc7ac \uc6f9\uc0ac\uc774\ud2b8 \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uc168\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uc8fc\uc18c\uc5d0 \ub9c1\ud06c\ub97c \uac78\uae4c\uc694?",
"Link list": "\ub9c1\ud06c \ub9ac\uc2a4\ud2b8",
"Insert video": "\ube44\ub514\uc624 \uc0bd\uc785",
"Insert\/edit video": "\ube44\ub514\uc624 \uc0bd\uc785\/\uc218\uc815",
"Insert\/edit media": "\ubbf8\ub514\uc5b4 \uc0bd\uc785\/\uc218\uc815",
"Alternative source": "\ub300\uccb4 \uc18c\uc2a4",
"Alternative source URL": "\ub300\uccb4 \uc6d0\ubcf8 URL",
"Media poster (Image URL)": "\ub300\ud45c \uc774\ubbf8\uc9c0(\uc774\ubbf8\uc9c0 URL)",
"Paste your embed code below:": "\uc544\ub798\uc5d0 \ucf54\ub4dc\ub97c \ubd99\uc5ec\ub123\uc73c\uc138\uc694:",
"Embed": "\uc0bd\uc785",
"Media...": "\ubbf8\ub514\uc5b4...",
"Nonbreaking space": "\ub744\uc5b4\uc4f0\uae30",
"Page break": "\ud398\uc774\uc9c0 \uad6c\ubd84\uc790",
"Paste as text": "\ud14d\uc2a4\ud2b8\ub85c \ubd99\uc5ec\ub123\uae30",
"Preview": "\ubbf8\ub9ac\ubcf4\uae30",
"Print...": "\uc778\uc1c4...",
"Save": "\uc800\uc7a5",
"Find": "\ucc3e\uae30",
"Replace with": "\uad50\uccb4",
"Replace": "\uad50\uccb4",
"Replace all": "\uc804\uccb4 \uad50\uccb4",
"Previous": "\uc774\uc804",
"Next": "\ub2e4\uc74c",
"Find and replace...": "\ucc3e\uae30 \ubc0f \ubc14\uafb8\uae30...",
"Could not find the specified string.": "\ubb38\uc790\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"Match case": "\ub300\uc18c\ubb38\uc790 \uc77c\uce58",
"Find whole words only": "\ubaa8\ub450 \uc77c\uce58\ud558\ub294 \ubb38\uc790 \ucc3e\uae30",
"Spell check": "\ub9de\ucda4\ubc95 \uac80\uc0ac",
"Ignore": "\ubb34\uc2dc",
"Ignore all": "\uc804\uccb4\ubb34\uc2dc",
"Finish": "\uc644\ub8cc",
"Add to Dictionary": "\uc0ac\uc804\uc5d0 \ucd94\uac00",
"Insert table": "\ud14c\uc774\ube14 \uc0bd\uc785",
"Table properties": "\ud14c\uc774\ube14 \uc18d\uc131",
"Delete table": "\ud14c\uc774\ube14 \uc0ad\uc81c",
"Cell": "\uc140",
"Row": "\uc5f4",
"Column": "\ud589",
"Cell properties": "\uc140 \uc18d",
"Merge cells": "\uc140 \ud569\uce58\uae30",
"Split cell": "\uc140 \ub098\ub204\uae30",
"Insert row before": "\uc774\uc804\uc5d0 \ud589 \uc0bd\uc785",
"Insert row after": "\ub2e4\uc74c\uc5d0 \ud589 \uc0bd\uc785",
"Delete row": "\ud589 \uc9c0\uc6b0\uae30",
"Row properties": "\ud589 \uc18d\uc131",
"Cut row": "\ud589 \uc798\ub77c\ub0b4\uae30",
"Copy row": "\ud589 \ubcf5\uc0ac",
"Paste row before": "\uc774\uc804\uc5d0 \ud589 \ubd99\uc5ec\ub123\uae30",
"Paste row after": "\ub2e4\uc74c\uc5d0 \ud589 \ubd99\uc5ec\ub123\uae30",
"Insert column before": "\uc774\uc804\uc5d0 \ud589 \uc0bd\uc785",
"Insert column after": "\ub2e4\uc74c\uc5d0 \uc5f4 \uc0bd\uc785",
"Delete column": "\uc5f4 \uc9c0\uc6b0\uae30",
"Cols": "\uc5f4",
"Rows": "\ud589",
"Width": "\ub113\uc774",
"Height": "\ub192\uc774",
"Cell spacing": "\uc140 \uac04\uaca9",
"Cell padding": "\uc140 \uc548\ucabd \uc5ec\ubc31",
"Show caption": "\ucea1\uc158 \ud45c\uc2dc",
"Left": "\uc67c\ucabd",
"Center": "\uac00\uc6b4\ub370",
"Right": "\uc624\ub978\ucabd",
"Cell type": "\uc140 \ud0c0\uc785",
"Scope": "\ubc94\uc704",
"Alignment": "\uc815\ub82c",
"H Align": "\uac00\ub85c \uc815\ub82c",
"V Align": "\uc138\ub85c \uc815\ub82c",
"Top": "\uc0c1\ub2e8",
"Middle": "\uc911\uac04",
"Bottom": "\ud558\ub2e8",
"Header cell": "\ud5e4\ub354 \uc140",
"Row group": "\ud589 \uadf8\ub8f9",
"Column group": "\uc5f4 \uadf8\ub8f9",
"Row type": "\ud589 \ud0c0\uc785",
"Header": "\ud5e4\ub354",
"Body": "\ubc14\ub514",
"Footer": "\ud478\ud130",
"Border color": "\ud14c\ub450\ub9ac \uc0c9",
"Insert template...": "\ud15c\ud50c\ub9bf \uc0bd\uc785...",
"Templates": "\ud15c\ud50c\ub9bf",
"Template": "\ud15c\ud50c\ub9bf",
"Text color": "\ubb38\uc790 \uc0c9\uae54",
"Background color": "\ubc30\uacbd\uc0c9",
"Custom...": "\uc9c1\uc811 \uc0c9\uae54 \uc9c0\uc815\ud558\uae30",
"Custom color": "\uc9c1\uc811 \uc9c0\uc815\ud55c \uc0c9\uae54",
"No color": "\uc0c9\uc0c1 \uc5c6\uc74c",
"Remove color": "\uc0c9 \uc81c\uac70",
"Table of Contents": "\ubaa9\ucc28",
"Show blocks": "\ube14\ub7ed \ubcf4\uc5ec\uc8fc\uae30",
"Show invisible characters": "\uc548\ubcf4\uc774\ub294 \ubb38\uc790 \ubcf4\uc774\uae30",
"Word count": "\ub2e8\uc5b4 \uc218",
"Count": "\uac1c\uc218",
"Document": "\ubb38\uc11c",
"Selection": "\uc120\ud0dd",
"Words": "\ub2e8\uc5b4",
"Words: {0}": "\ub2e8\uc5b4: {0}",
"{0} words": "{0} \ub2e8\uc5b4",
"File": "\ud30c\uc77c",
"Edit": "\uc218\uc815",
"Insert": "\uc0bd\uc785",
"View": "\ubcf4\uae30",
"Format": "\ud3ec\ub9f7",
"Table": "\ud14c\uc774\ube14",
"Tools": "\ub3c4\uad6c",
"Powered by {0}": "Powered by {0}",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\uc11c\uc2dd \uc788\ub294 \ud14d\uc2a4\ud2b8 \ud3b8\uc9d1\uae30 \uc785\ub2c8\ub2e4. ALT-F9\ub97c \ub204\ub974\uba74 \uba54\ub274, ALT-F10\ub97c \ub204\ub974\uba74 \ud234\ubc14, ALT-0\uc744 \ub204\ub974\uba74 \ub3c4\uc6c0\ub9d0\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"Image title": "\uc774\ubbf8\uc9c0 \uc81c\ubaa9",
"Border width": "\ud14c\ub450\ub9ac \ub450\uaed8",
"Border style": "\ud14c\ub450\ub9ac \uc2a4\ud0c0\uc77c",
"Error": "\uc624\ub958",
"Warn": "\uacbd\uace0",
"Valid": "\uc720\ud6a8\ud568",
"To open the popup, press Shift+Enter": "\ud31d\uc5c5\uc744 \uc5f4\ub824\uba74 Shift+Enter\ub97c \ub204\ub974\uc2ed\uc2dc\uc624.",
"Rich Text Area. Press ALT-0 for help.": "\uc11c\uc2dd \uc788\ub294 \ud14d\uc2a4\ud2b8 \uc601\uc5ed. ALT-0\uc744 \ub204\ub974\uba74 \ub3c4\uc6c0\ub9d0\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"System Font": "\uc2dc\uc2a4\ud15c \uae00\uaf34",
"Failed to upload image: {0}": "\uc774\ubbf8\uc9c0 \uc5c5\ub85c\ub4dc \uc2e4\ud328: {0}",
"Failed to load plugin: {0} from url {1}": "\ud50c\ub7ec\uadf8\uc778 \ub85c\ub4dc \uc2e4\ud328: URL: {1}\uc5d0\uc11c\uc758 {0}",
"Failed to load plugin url: {0}": "\ud50c\ub7ec\uadf8\uc778 URL \ub85c\ub4dc \uc2e4\ud328: {0}",
"Failed to initialize plugin: {0}": "\ud50c\ub7ec\uadf8\uc778 \ucd08\uae30\ud654 \uc2e4\ud328: {0}",
"example": "\uc608\uc81c",
"Search": "\uac80\uc0c9",
"All": "\ubaa8\ub450",
"Currency": "\ud1b5\ud654",
"Text": "\ud14d\uc2a4\ud2b8",
"Quotations": "\uc778\uc6a9\ubb38",
"Mathematical": "\uc218\ud559",
"Extended Latin": "\ud655\uc7a5 \ub77c\ud2f4\uc5b4",
"Symbols": "\uae30\ud638",
"Arrows": "\ud654\uc0b4\ud45c",
"User Defined": "\uc0ac\uc6a9\uc790 \uc815\uc758",
"dollar sign": "\ub2ec\ub7ec \uae30\ud638",
"currency sign": "\ud1b5\ud654 \uae30\ud638",
"euro-currency sign": "\uc720\ub85c\ud654 \uae30\ud638",
"colon sign": "\ucf5c\ub860 \uae30\ud638",
"cruzeiro sign": "\ud06c\ub8e8\uc81c\uc774\ub8e8 \uae30\ud638",
"french franc sign": "\ud504\ub791\uc2a4 \ud504\ub791 \uae30\ud638",
"lira sign": "\ub9ac\ub77c \uae30\ud638",
"mill sign": "\ubc00 \uae30\ud638",
"naira sign": "\ub098\uc774\ub77c \uae30\ud638",
"peseta sign": "\ud398\uc138\ud0c0 \uae30\ud638",
"rupee sign": "\ub8e8\ud53c \uae30\ud638",
"won sign": "\uc6d0 \uae30\ud638",
"new sheqel sign": "\ub274 \uc138\ucf08 \uae30\ud638",
"dong sign": "\ub3d9 \uae30\ud638",
"kip sign": "\ud0b5 \uae30\ud638",
"tugrik sign": "\ud22c\uadf8\ub9ac\ud06c \uae30\ud638",
"drachma sign": "\ub4dc\ub77c\ud06c\ub9c8 \uae30\ud638",
"german penny symbol": "\ub3c5\uc77c \ud398\ub2c8 \uae30\ud638",
"peso sign": "\ud398\uc18c \uae30\ud638",
"guarani sign": "\uacfc\ub77c\ub2c8 \uae30\ud638",
"austral sign": "\uc544\uc6b0\uc2a4\ud2b8\ub784 \uae30\ud638",
"hryvnia sign": "\uadf8\ub9ac\ube0c\ub098 \uae30\ud638",
"cedi sign": "\uc138\ub514 \uae30\ud638",
"livre tournois sign": "\ub9ac\ube0c\ub974 \ud2b8\ub974\ub204\uc544 \uae30\ud638",
"spesmilo sign": "\uc2a4\ud398\uc2a4\ubc00\ub85c \uae30\ud638",
"tenge sign": "\ud161\uac8c \uae30\ud638",
"indian rupee sign": "\uc778\ub3c4 \ub8e8\ud53c \uae30\ud638",
"turkish lira sign": "\ud130\ud0a4 \ub9ac\ub77c \uae30\ud638",
"nordic mark sign": "\ub178\ub974\ub515 \ub9c8\ub974\ud06c \uae30\ud638",
"manat sign": "\ub9c8\ub098\ud2b8 \uae30\ud638",
"ruble sign": "\ub8e8\ube14 \uae30\ud638",
"yen character": "\uc5d4 \uae30\ud638",
"yuan character": "\uc704\uc548 \uae30\ud638",
"yuan character, in hong kong and taiwan": "\ub300\ub9cc \uc704\uc548 \uae30\ud638",
"yen\/yuan character variant one": "\uc5d4\/\uc704\uc548 \ubb38\uc790 \ubcc0\ud615",
"Loading emoticons...": "\uc774\ubaa8\ud2f0\ucf58 \ubd88\ub7ec\uc624\ub294 \uc911...",
"Could not load emoticons": "\uc774\ubaa8\ud2f0\ucf58\uc744 \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c",
"People": "\uc0ac\ub78c",
"Animals and Nature": "\ub3d9\ubb3c\uacfc \uc790\uc5f0",
"Food and Drink": "\uc74c\uc2dd\uacfc \uc74c\ub8cc",
"Activity": "\ud65c\ub3d9",
"Travel and Places": "\uc5ec\ud589\uacfc \uc7a5\uc18c",
"Objects": "\ubb3c\uac74",
"Flags": "\uae43\ubc1c",
"Characters": "\ubb38\uc790",
"Characters (no spaces)": "\ubb38\uc790(\uacf5\ubc31 \uc5c6\uc74c)",
"{0} characters": "{0} \ubb38\uc790",
"Error: Form submit field collision.": "\uc624\ub958: \uc591\uc2dd \uc81c\ucd9c \ud544\ub4dc \ubd88\uc77c\uce58",
"Error: No form element found.": "\uc624\ub958: \uc591\uc2dd \ud56d\ubaa9 \uc5c6\uc74c",
"Update": "\uc5c5\ub370\uc774\ud2b8",
"Color swatch": "\uc0c9\uc0c1 \uacac\ubcf8",
"Turquoise": "\uccad\ub85d\uc0c9",
"Green": "\ucd08\ub85d\uc0c9",
"Blue": "\ud30c\ub780\uc0c9",
"Purple": "\ubcf4\ub77c\uc0c9",
"Navy Blue": "\ub0a8\uc0c9",
"Dark Turquoise": "\uc9c4\ud55c \uccad\ub85d\uc0c9",
"Dark Green": "\uc9c4\ud55c \ucd08\ub85d\uc0c9",
"Medium Blue": "\uc911\uac04 \ud30c\ub780\uc0c9",
"Medium Purple": "\uc911\uac04 \ubcf4\ub77c\uc0c9",
"Midnight Blue": "\uc9c4\ud55c \ud30c\ub780\uc0c9",
"Yellow": "\ub178\ub780\uc0c9",
"Orange": "\uc8fc\ud669\uc0c9",
"Red": "\ube68\uac04\uc0c9",
"Light Gray": "\ubc1d\uc740 \ud68c\uc0c9",
"Gray": "\ud68c\uc0c9",
"Dark Yellow": "\uc9c4\ud55c \ub178\ub780\uc0c9",
"Dark Orange": "\uc9c4\ud55c \uc8fc\ud669\uc0c9",
"Dark Red": "\uc9c4\ud55c \ube68\uac04\uc0c9",
"Medium Gray": "\uc911\uac04 \ud68c\uc0c9",
"Dark Gray": "\uc9c4\ud55c \ud68c\uc0c9",
"Light Green": "\ubc1d\uc740 \ub179\uc0c9",
"Light Yellow": "\ubc1d\uc740 \ub178\ub780\uc0c9",
"Light Red": "\ubc1d\uc740 \ube68\uac04\uc0c9",
"Light Purple": "\ubc1d\uc740 \ubcf4\ub77c\uc0c9",
"Light Blue": "\ubc1d\uc740 \ud30c\ub780\uc0c9",
"Dark Purple": "\uc9c4\ud55c \ubcf4\ub77c\uc0c9",
"Dark Blue": "\uc9c4\ud55c \ud30c\ub780\uc0c9",
"Black": "\uac80\uc740\uc0c9",
"White": "\ud770\uc0c9",
"Switch to or from fullscreen mode": "\uc804\uccb4 \ud654\uba74\uc73c\ub85c\/\uc5d0\uc11c \uc804\ud658",
"Open help dialog": "\ub3c4\uc6c0\ub9d0 \ub300\ud654\ucc3d \uc5f4\uae30",
"history": "\uae30\ub85d",
"styles": "\uc2a4\ud0c0\uc77c",
"formatting": "\ud3ec\ub9f7\ud305",
"alignment": "\uc815\ub82c",
"indentation": "\ub4e4\uc5ec\uc4f0\uae30",
"permanent pen": "\uc720\uc131\ud39c",
"comments": "\uc8fc\uc11d",
"Format Painter": "\uc11c\uc2dd \ubcf5\uc0ac",
"Insert\/edit iframe": "\uc544\uc774\ud504\ub808\uc784 \uc0bd\uc785\/\ud3b8\uc9d1",
"Capitalization": "\ub300\ubb38\uc790\ud654",
"lowercase": "\uc18c\ubb38\uc790",
"UPPERCASE": "\ub300\ubb38\uc790",
"Title Case": "\uc81c\ubaa9\uc744 \ub300\ubb38\uc790\ud654",
"Permanent Pen Properties": "\uc601\uad6c \ud39c \ud2b9\uc131",
"Permanent pen properties...": "\uc601\uad6c \ud39c \ud2b9\uc131...",
"Font": "\uae00\uaf34",
"Size": "\ud06c\uae30",
"More...": "\ub354 \ubcf4\uae30...",
"Spellcheck Language": "\ub9de\ucda4\ubc95 \uac80\uc0ac \uc5b8\uc5b4",
"Select...": "\uc120\ud0dd...",
"Preferences": "\ud658\uacbd\uc124\uc815",
"Yes": "\ub124",
"No": "\uc544\ub2c8\uc624",
"Keyboard Navigation": "\ud0a4 \uc120\ud0dd",
"Version": "\ubc84\uc804",
"Anchor": "\uc575\ucee4",
"Special character": "\ud2b9\uc218\ubb38\uc790",
"Code sample": "\ucf54\ub4dc\uc0d8\ud50c",
"Color": "\uc0c9\uc0c1",
"Emoticons": "\uc774\ubaa8\ud2f0\ucf58",
"Document properties": "\ubb38\uc11c \uc18d\uc131",
"Image": "\uc774\ubbf8\uc9c0",
"Insert link": "\ub9c1\ud06c \uc0bd\uc785 ",
"Target": "\ub300\uc0c1",
"Link": "\ub9c1\ud06c",
"Poster": "\ud3ec\uc2a4\ud130",
"Media": "\ubbf8\ub514\uc5b4",
"Print": "\ucd9c\ub825",
"Prev": "\uc774\uc804",
"Find and replace": "\ucc3e\uc544\uc11c \uad50\uccb4",
"Whole words": "\uc804\uccb4 \ub2e8\uc5b4",
"Spellcheck": "\ubb38\ubc95\uccb4\ud06c",
"Caption": "\ucea1\uc158",
"Insert template": "\ud15c\ud50c\ub9bf \uc0bd\uc785"
});

View File

@ -0,0 +1,419 @@
tinymce.addI18n('zh_CN', {
Redo: '\u91cd\u505a',
Undo: '\u64a4\u9500',
Cut: '\u526a\u5207',
Copy: '\u590d\u5236',
Paste: '\u7c98\u8d34',
'Select all': '\u5168\u9009',
'New document': '\u65b0\u6587\u4ef6',
Ok: '\u786e\u5b9a',
Cancel: '\u53d6\u6d88',
'Visual aids': '\u7f51\u683c\u7ebf',
Bold: '\u7c97\u4f53',
Italic: '\u659c\u4f53',
Underline: '\u4e0b\u5212\u7ebf',
Strikethrough: '\u5220\u9664\u7ebf',
Superscript: '\u4e0a\u6807',
Subscript: '\u4e0b\u6807',
'Clear formatting': '\u6e05\u9664\u683c\u5f0f',
'Align left': '\u5de6\u8fb9\u5bf9\u9f50',
'Align center': '\u4e2d\u95f4\u5bf9\u9f50',
'Align right': '\u53f3\u8fb9\u5bf9\u9f50',
Justify: '\u4e24\u7aef\u5bf9\u9f50',
'Bullet list': '\u9879\u76ee\u7b26\u53f7',
'Numbered list': '\u7f16\u53f7\u5217\u8868',
'Decrease indent': '\u51cf\u5c11\u7f29\u8fdb',
'Increase indent': '\u589e\u52a0\u7f29\u8fdb',
Close: '\u5173\u95ed',
Formats: '\u683c\u5f0f',
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": '\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002',
Headers: '\u6807\u9898',
'Header 1': '\u6807\u98981',
'Header 2': '\u6807\u98982',
'Header 3': '\u6807\u98983',
'Header 4': '\u6807\u98984',
'Header 5': '\u6807\u98985',
'Header 6': '\u6807\u98986',
Headings: '\u6807\u9898',
'Heading 1': '\u6807\u98981',
'Heading 2': '\u6807\u98982',
'Heading 3': '\u6807\u98983',
'Heading 4': '\u6807\u98984',
'Heading 5': '\u6807\u98985',
'Heading 6': '\u6807\u98986',
Preformatted: '\u9884\u5148\u683c\u5f0f\u5316\u7684',
Div: 'Div',
Pre: 'Pre',
Code: '\u4ee3\u7801',
Paragraph: '\u6bb5\u843d',
Blockquote: '\u5f15\u6587\u533a\u5757',
Inline: '\u6587\u672c',
Blocks: '\u57fa\u5757',
'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': '\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002',
Fonts: '\u5b57\u4f53',
'Font Sizes': '\u5b57\u53f7',
Class: '\u7c7b\u578b',
'Browse for an image': '\u6d4f\u89c8\u56fe\u50cf',
OR: '\u6216',
'Drop an image here': '\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64',
Upload: '\u4e0a\u4f20',
Block: '\u5757',
Align: '\u5bf9\u9f50',
Default: '\u9ed8\u8ba4',
Circle: '\u7a7a\u5fc3\u5706',
Disc: '\u5b9e\u5fc3\u5706',
Square: '\u65b9\u5757',
'Lower Alpha': '\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd',
'Lower Greek': '\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd',
'Lower Roman': '\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd',
'Upper Alpha': '\u5927\u5199\u82f1\u6587\u5b57\u6bcd',
'Upper Roman': '\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd',
'Anchor...': '\u951a\u70b9...',
Name: '\u540d\u79f0',
Id: '\u6807\u8bc6\u7b26',
'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': '\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002',
'You have unsaved changes are you sure you want to navigate away?': '\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f',
'Restore last draft': '\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f',
'Special character...': '\u7279\u6b8a\u5b57\u7b26...',
'Source code': '\u6e90\u4ee3\u7801',
'Insert\/Edit code sample': '\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b',
Language: '\u8bed\u8a00',
'Code sample...': '\u793a\u4f8b\u4ee3\u7801...',
'Color Picker': '\u9009\u8272\u5668',
R: 'R',
G: 'G',
B: 'B',
'Left to right': '\u4ece\u5de6\u5230\u53f3',
'Right to left': '\u4ece\u53f3\u5230\u5de6',
'Emoticons...': '\u8868\u60c5\u7b26\u53f7...',
'Metadata and Document Properties': '\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027',
Title: '\u6807\u9898',
Keywords: '\u5173\u952e\u8bcd',
Description: '\u63cf\u8ff0',
Robots: '\u673a\u5668\u4eba',
Author: '\u4f5c\u8005',
Encoding: '\u7f16\u7801',
Fullscreen: '\u5168\u5c4f',
Action: '\u64cd\u4f5c',
Shortcut: '\u5feb\u6377\u952e',
Help: '\u5e2e\u52a9',
Address: '\u5730\u5740',
'Focus to menubar': '\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f',
'Focus to toolbar': '\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f',
'Focus to element path': '\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84',
'Focus to contextual toolbar': '\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355',
'Insert link (if link plugin activated)': '\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)',
'Save (if save plugin activated)': '\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)',
'Find (if searchreplace plugin activated)': '\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)',
'Plugins installed ({0}):': '\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):',
'Premium plugins:': '\u4f18\u79c0\u63d2\u4ef6\uff1a',
'Learn more...': '\u4e86\u89e3\u66f4\u591a...',
'You are using {0}': '\u4f60\u6b63\u5728\u4f7f\u7528 {0}',
Plugins: '\u63d2\u4ef6',
'Handy Shortcuts': '\u5feb\u6377\u952e',
'Horizontal line': '\u6c34\u5e73\u5206\u5272\u7ebf',
'Insert\/edit image': '\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247',
'Image description': '\u56fe\u7247\u63cf\u8ff0',
Source: '\u5730\u5740',
Dimensions: '\u5927\u5c0f',
'Constrain proportions': '\u4fdd\u6301\u7eb5\u6a2a\u6bd4',
General: '\u666e\u901a',
Advanced: '\u9ad8\u7ea7',
Style: '\u6837\u5f0f',
'Vertical space': '\u5782\u76f4\u8fb9\u8ddd',
'Horizontal space': '\u6c34\u5e73\u8fb9\u8ddd',
Border: '\u8fb9\u6846',
'Insert image': '\u63d2\u5165\u56fe\u7247',
'Image...': '\u56fe\u7247...',
'Image list': '\u56fe\u7247\u5217\u8868',
'Rotate counterclockwise': '\u9006\u65f6\u9488\u65cb\u8f6c',
'Rotate clockwise': '\u987a\u65f6\u9488\u65cb\u8f6c',
'Flip vertically': '\u5782\u76f4\u7ffb\u8f6c',
'Flip horizontally': '\u6c34\u5e73\u7ffb\u8f6c',
'Edit image': '\u7f16\u8f91\u56fe\u7247',
'Image options': '\u56fe\u7247\u9009\u9879',
'Zoom in': '\u653e\u5927',
'Zoom out': '\u7f29\u5c0f',
Crop: '\u88c1\u526a',
Resize: '\u8c03\u6574\u5927\u5c0f',
Orientation: '\u65b9\u5411',
Brightness: '\u4eae\u5ea6',
Sharpen: '\u9510\u5316',
Contrast: '\u5bf9\u6bd4\u5ea6',
'Color levels': '\u989c\u8272\u5c42\u6b21',
Gamma: '\u4f3d\u9a6c\u503c',
Invert: '\u53cd\u8f6c',
Apply: '\u5e94\u7528',
Back: '\u540e\u9000',
'Insert date\/time': '\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4',
'Date\/time': '\u65e5\u671f\/\u65f6\u95f4',
'Insert\/Edit Link': '\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5',
'Insert\/edit link': '\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5',
'Text to display': '\u663e\u793a\u6587\u5b57',
Url: '\u5730\u5740',
'Open link in...': '\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...',
'Current window': '\u5f53\u524d\u7a97\u53e3',
None: '\u65e0',
'New window': '\u5728\u65b0\u7a97\u53e3\u6253\u5f00',
'Remove link': '\u5220\u9664\u94fe\u63a5',
Anchors: '\u951a\u70b9',
'Link...': '\u94fe\u63a5...',
'Paste or type a link': '\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5',
'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': '\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f',
'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': '\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f',
'Link list': '\u94fe\u63a5\u5217\u8868',
'Insert video': '\u63d2\u5165\u89c6\u9891',
'Insert\/edit video': '\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891',
'Insert\/edit media': '\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53',
'Alternative source': '\u955c\u50cf',
'Alternative source URL': '\u66ff\u4ee3\u6765\u6e90\u7f51\u5740',
'Media poster (Image URL)': '\u5c01\u9762(\u56fe\u7247\u5730\u5740)',
'Paste your embed code below:': '\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:',
Embed: '\u5185\u5d4c',
'Media...': '\u591a\u5a92\u4f53...',
'Nonbreaking space': '\u4e0d\u95f4\u65ad\u7a7a\u683c',
'Page break': '\u5206\u9875\u7b26',
'Paste as text': '\u7c98\u8d34\u4e3a\u6587\u672c',
Preview: '\u9884\u89c8',
'Print...': '\u6253\u5370...',
Save: '\u4fdd\u5b58',
Find: '\u67e5\u627e',
'Replace with': '\u66ff\u6362\u4e3a',
Replace: '\u66ff\u6362',
'Replace all': '\u5168\u90e8\u66ff\u6362',
Previous: '\u4e0a\u4e00\u4e2a',
Next: '\u4e0b\u4e00\u4e2a',
'Find and replace...': '\u67e5\u627e\u5e76\u66ff\u6362...',
'Could not find the specified string.': '\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.',
'Match case': '\u533a\u5206\u5927\u5c0f\u5199',
'Find whole words only': '\u5168\u5b57\u5339\u914d',
'Spell check': '\u62fc\u5199\u68c0\u67e5',
Ignore: '\u5ffd\u7565',
'Ignore all': '\u5168\u90e8\u5ffd\u7565',
Finish: '\u5b8c\u6210',
'Add to Dictionary': '\u6dfb\u52a0\u5230\u5b57\u5178',
'Insert table': '\u63d2\u5165\u8868\u683c',
'Table properties': '\u8868\u683c\u5c5e\u6027',
'Delete table': '\u5220\u9664\u8868\u683c',
Cell: '\u5355\u5143\u683c',
Row: '\u884c',
Column: '\u5217',
'Cell properties': '\u5355\u5143\u683c\u5c5e\u6027',
'Merge cells': '\u5408\u5e76\u5355\u5143\u683c',
'Split cell': '\u62c6\u5206\u5355\u5143\u683c',
'Insert row before': '\u5728\u4e0a\u65b9\u63d2\u5165',
'Insert row after': '\u5728\u4e0b\u65b9\u63d2\u5165',
'Delete row': '\u5220\u9664\u884c',
'Row properties': '\u884c\u5c5e\u6027',
'Cut row': '\u526a\u5207\u884c',
'Copy row': '\u590d\u5236\u884c',
'Paste row before': '\u7c98\u8d34\u5230\u4e0a\u65b9',
'Paste row after': '\u7c98\u8d34\u5230\u4e0b\u65b9',
'Insert column before': '\u5728\u5de6\u4fa7\u63d2\u5165',
'Insert column after': '\u5728\u53f3\u4fa7\u63d2\u5165',
'Delete column': '\u5220\u9664\u5217',
Cols: '\u5217',
Rows: '\u884c',
Width: '\u5bbd',
Height: '\u9ad8',
'Cell spacing': '\u5355\u5143\u683c\u5916\u95f4\u8ddd',
'Cell padding': '\u5355\u5143\u683c\u5185\u8fb9\u8ddd',
'Show caption': '\u663e\u793a\u6807\u9898',
Left: '\u5de6\u5bf9\u9f50',
Center: '\u5c45\u4e2d',
Right: '\u53f3\u5bf9\u9f50',
'Cell type': '\u5355\u5143\u683c\u7c7b\u578b',
Scope: '\u8303\u56f4',
Alignment: '\u5bf9\u9f50\u65b9\u5f0f',
'H Align': '\u6c34\u5e73\u5bf9\u9f50',
'V Align': '\u5782\u76f4\u5bf9\u9f50',
Top: '\u9876\u90e8\u5bf9\u9f50',
Middle: '\u5782\u76f4\u5c45\u4e2d',
Bottom: '\u5e95\u90e8\u5bf9\u9f50',
'Header cell': '\u8868\u5934\u5355\u5143\u683c',
'Row group': '\u884c\u7ec4',
'Column group': '\u5217\u7ec4',
'Row type': '\u884c\u7c7b\u578b',
Header: '\u8868\u5934',
Body: '\u8868\u4f53',
Footer: '\u8868\u5c3e',
'Border color': '\u8fb9\u6846\u989c\u8272',
'Insert template...': '\u63d2\u5165\u6a21\u677f...',
Templates: '\u6a21\u677f',
Template: '\u6a21\u677f',
'Text color': '\u6587\u5b57\u989c\u8272',
'Background color': '\u80cc\u666f\u8272',
'Custom...': '\u81ea\u5b9a\u4e49...',
'Custom color': '\u81ea\u5b9a\u4e49\u989c\u8272',
'No color': '\u65e0',
'Remove color': '\u79fb\u9664\u989c\u8272',
'Table of Contents': '\u5185\u5bb9\u5217\u8868',
'Show blocks': '\u663e\u793a\u533a\u5757\u8fb9\u6846',
'Show invisible characters': '\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26',
'Word count': '\u5b57\u6570',
Count: '\u8ba1\u6570',
Document: '\u6587\u6863',
Selection: '\u9009\u62e9',
Words: '\u5355\u8bcd',
'Words: {0}': '\u5b57\u6570\uff1a{0}',
'{0} words': '{0} \u5b57',
File: '\u6587\u4ef6',
Edit: '\u7f16\u8f91',
Insert: '\u63d2\u5165',
View: '\u89c6\u56fe',
Format: '\u683c\u5f0f',
Table: '\u8868\u683c',
Tools: '\u5de5\u5177',
'Powered by {0}': '\u7531{0}\u9a71\u52a8',
'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9',
'Image title': '\u56fe\u7247\u6807\u9898',
'Border width': '\u8fb9\u6846\u5bbd\u5ea6',
'Border style': '\u8fb9\u6846\u6837\u5f0f',
Error: '\u9519\u8bef',
Warn: '\u8b66\u544a',
Valid: '\u6709\u6548',
'To open the popup, press Shift+Enter': '\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846',
'Rich Text Area. Press ALT-0 for help.': '\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002',
'System Font': '\u7cfb\u7edf\u5b57\u4f53',
'Failed to upload image: {0}': '\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}',
'Failed to load plugin: {0} from url {1}': '\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}',
'Failed to load plugin url: {0}': '\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}',
'Failed to initialize plugin: {0}': '\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}',
example: '\u793a\u4f8b',
Search: '\u641c\u7d22',
All: '\u5168\u90e8',
Currency: '\u8d27\u5e01',
Text: '\u6587\u5b57',
Quotations: '\u5f15\u7528',
Mathematical: '\u6570\u5b66',
'Extended Latin': '\u62c9\u4e01\u8bed\u6269\u5145',
Symbols: '\u7b26\u53f7',
Arrows: '\u7bad\u5934',
'User Defined': '\u81ea\u5b9a\u4e49',
'dollar sign': '\u7f8e\u5143\u7b26\u53f7',
'currency sign': '\u8d27\u5e01\u7b26\u53f7',
'euro-currency sign': '\u6b27\u5143\u7b26\u53f7',
'colon sign': '\u5192\u53f7',
'cruzeiro sign': '\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7',
'french franc sign': '\u6cd5\u90ce\u7b26\u53f7',
'lira sign': '\u91cc\u62c9\u7b26\u53f7',
'mill sign': '\u5bc6\u5c14\u7b26\u53f7',
'naira sign': '\u5948\u62c9\u7b26\u53f7',
'peseta sign': '\u6bd4\u585e\u5854\u7b26\u53f7',
'rupee sign': '\u5362\u6bd4\u7b26\u53f7',
'won sign': '\u97e9\u5143\u7b26\u53f7',
'new sheqel sign': '\u65b0\u8c22\u514b\u5c14\u7b26\u53f7',
'dong sign': '\u8d8a\u5357\u76fe\u7b26\u53f7',
'kip sign': '\u8001\u631d\u57fa\u666e\u7b26\u53f7',
'tugrik sign': '\u56fe\u683c\u91cc\u514b\u7b26\u53f7',
'drachma sign': '\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7',
'german penny symbol': '\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7',
'peso sign': '\u6bd4\u7d22\u7b26\u53f7',
'guarani sign': '\u74dc\u62c9\u5c3c\u7b26\u53f7',
'austral sign': '\u6fb3\u5143\u7b26\u53f7',
'hryvnia sign': '\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7',
'cedi sign': '\u585e\u5730\u7b26\u53f7',
'livre tournois sign': '\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7',
'spesmilo sign': 'spesmilo\u7b26\u53f7',
'tenge sign': '\u575a\u6208\u7b26\u53f7',
'indian rupee sign': '\u5370\u5ea6\u5362\u6bd4',
'turkish lira sign': '\u571f\u8033\u5176\u91cc\u62c9',
'nordic mark sign': '\u5317\u6b27\u9a6c\u514b',
'manat sign': '\u9a6c\u7eb3\u7279\u7b26\u53f7',
'ruble sign': '\u5362\u5e03\u7b26\u53f7',
'yen character': '\u65e5\u5143\u5b57\u6837',
'yuan character': '\u4eba\u6c11\u5e01\u5143\u5b57\u6837',
'yuan character, in hong kong and taiwan': '\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09',
'yen\/yuan character variant one': '\u5143\u5b57\u6837\uff08\u5927\u5199\uff09',
'Loading emoticons...': '\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...',
'Could not load emoticons': '\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7',
People: '\u4eba\u7c7b',
'Animals and Nature': '\u52a8\u7269\u548c\u81ea\u7136',
'Food and Drink': '\u98df\u7269\u548c\u996e\u54c1',
Activity: '\u6d3b\u52a8',
'Travel and Places': '\u65c5\u6e38\u548c\u5730\u70b9',
Objects: '\u7269\u4ef6',
Flags: '\u65d7\u5e1c',
Characters: '\u5b57\u7b26',
'Characters (no spaces)': '\u5b57\u7b26(\u65e0\u7a7a\u683c)',
'{0} characters': '{0} \u4e2a\u5b57\u7b26',
'Error: Form submit field collision.': '\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002',
'Error: No form element found.': '\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002',
Update: '\u66f4\u65b0',
'Color swatch': '\u989c\u8272\u6837\u672c',
Turquoise: '\u9752\u7eff\u8272',
Green: '\u7eff\u8272',
Blue: '\u84dd\u8272',
Purple: '\u7d2b\u8272',
'Navy Blue': '\u6d77\u519b\u84dd',
'Dark Turquoise': '\u6df1\u84dd\u7eff\u8272',
'Dark Green': '\u6df1\u7eff\u8272',
'Medium Blue': '\u4e2d\u84dd\u8272',
'Medium Purple': '\u4e2d\u7d2b\u8272',
'Midnight Blue': '\u6df1\u84dd\u8272',
Yellow: '\u9ec4\u8272',
Orange: '\u6a59\u8272',
Red: '\u7ea2\u8272',
'Light Gray': '\u6d45\u7070\u8272',
Gray: '\u7070\u8272',
'Dark Yellow': '\u6697\u9ec4\u8272',
'Dark Orange': '\u6df1\u6a59\u8272',
'Dark Red': '\u6df1\u7ea2\u8272',
'Medium Gray': '\u4e2d\u7070\u8272',
'Dark Gray': '\u6df1\u7070\u8272',
'Light Green': '\u6d45\u7eff\u8272',
'Light Yellow': '\u6d45\u9ec4\u8272',
'Light Red': '\u6d45\u7ea2\u8272',
'Light Purple': '\u6d45\u7d2b\u8272',
'Light Blue': '\u6d45\u84dd\u8272',
'Dark Purple': '\u6df1\u7d2b\u8272',
'Dark Blue': '\u6df1\u84dd\u8272',
Black: '\u9ed1\u8272',
White: '\u767d\u8272',
'Switch to or from fullscreen mode': '\u5207\u6362\u5168\u5c4f\u6a21\u5f0f',
'Open help dialog': '\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846',
history: '\u5386\u53f2',
styles: '\u6837\u5f0f',
formatting: '\u683c\u5f0f\u5316',
alignment: '\u5bf9\u9f50',
indentation: '\u7f29\u8fdb',
'permanent pen': '\u8bb0\u53f7\u7b14',
comments: '\u5907\u6ce8',
'Format Painter': '\u683c\u5f0f\u5237',
'Insert\/edit iframe': '\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6',
Capitalization: '\u5927\u5199',
lowercase: '\u5c0f\u5199',
UPPERCASE: '\u5927\u5199',
'Title Case': '\u9996\u5b57\u6bcd\u5927\u5199',
'Permanent Pen Properties': '\u6c38\u4e45\u7b14\u5c5e\u6027',
'Permanent pen properties...': '\u6c38\u4e45\u7b14\u5c5e\u6027...',
Font: '\u5b57\u4f53',
Size: '\u5b57\u53f7',
'More...': '\u66f4\u591a...',
'Spellcheck Language': '\u62fc\u5199\u68c0\u67e5\u8bed\u8a00',
'Select...': '\u9009\u62e9...',
Preferences: '\u9996\u9009\u9879',
Yes: '\u662f',
No: '\u5426',
'Keyboard Navigation': '\u952e\u76d8\u6307\u5f15',
Version: '\u7248\u672c',
Anchor: '\u951a\u70b9',
'Special character': '\u7279\u6b8a\u7b26\u53f7',
'Code sample': '\u4ee3\u7801\u793a\u4f8b',
Color: '\u989c\u8272',
Emoticons: '\u8868\u60c5',
'Document properties': '\u6587\u6863\u5c5e\u6027',
Image: '\u56fe\u7247',
'Insert link': '\u63d2\u5165\u94fe\u63a5',
Target: '\u6253\u5f00\u65b9\u5f0f',
Link: '\u94fe\u63a5',
Poster: '\u5c01\u9762',
Media: '\u5a92\u4f53',
Print: '\u6253\u5370',
Prev: '\u4e0a\u4e00\u4e2a',
'Find and replace': '\u67e5\u627e\u548c\u66ff\u6362',
'Whole words': '\u5168\u5b57\u5339\u914d',
Spellcheck: '\u62fc\u5199\u68c0\u67e5',
Caption: '\u6807\u9898',
'Insert template': '\u63d2\u5165\u6a21\u677f'
})

File diff suppressed because one or more lines are too long

7
public/tinymce/skins/content.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

Binary file not shown.

7
public/tinymce/skins/skin.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

18
src/@types/index.d.ts vendored Normal file
View File

@ -0,0 +1,18 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-19 10:33:47
* @LastEditors: ZY
* @LastEditTime: 2021-01-19 16:05:14
*/
declare module '*.svg'
declare module '*.png'
declare module '*.jpg'
declare module '*.jpeg'
declare module '*.gif'
declare module '*.bmp'
declare module '*.tiff'
declare module '*.yaml'
declare module '*.json'
declare module 'vue-count-to'

19
src/@types/vue-proptery.d.ts vendored Normal file
View File

@ -0,0 +1,19 @@
/*
* @Description:
* @Author: ZY
* @Date: 2020-12-25 09:50:16
* @LastEditors: ZY
* @LastEditTime: 2020-12-30 11:23:35
*/
import { ElMessage } from 'element-plus'
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$message: ElMessage
}
}
declare module 'vue-router' {
interface RouteMeta {
roles?: string[]
}
}

37
src/App.vue Normal file
View File

@ -0,0 +1,37 @@
<!--
* @Description:
* @Autor: ZY
* @Date: 2020-12-07 10:30:20
* @LastEditors: SCY
* @LastEditTime: 2021-04-06 10:11:53
-->
<template>
<router-view />
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
})
</script>
<style lang="scss">
.el-menu-item:hover{
outline: 0 !important;
color: #409EFF !important;
}
.el-submenu__title:focus, .el-submenu__title:hover{
outline: 0 !important;
color: #fff !important;
background: #435EBE !important;
border-radius: 8px !important;
}
.el-menu-item:hover{
outline: 0 !important;
color: #fff !important;
background: #435EBE !important;
border-radius: 8px !important;
}
</style>

34
src/apis/address.ts Normal file
View File

@ -0,0 +1,34 @@
import https from "../utils/https";
import {ContentType, Method} from "axios-mapper";
export async function getAddressList(data: any) {
return await (await https(true)).request('/admin/address/get', Method.POST, data, ContentType.json);
}
export async function makeAddress(data: any) {
return await (await https(true, true)).request('/admin/address/make', Method.POST, data, ContentType.json);
}
export async function getNotifyList(data: any) {
return await (await https(true)).request('/admin/notify/get', Method.POST, data, ContentType.json);
}
export async function triggerNotify(data: any) {
return await (await https(true, true)).request('/admin/notify/trigger', Method.POST, data, ContentType.json);
}
export async function getWithdrawalLog(data: any) {
return await (await https(true)).request('/admin/address/withdrawalLog', Method.POST, data, ContentType.json);
}
export async function withdrawal(data: any) {
return await (await https(true, true)).request('/admin/address/withdrawal', Method.POST, data, ContentType.json);
}
export async function getWithdrawalAccount(data: any) {
return await (await https(true)).request('/admin/address/withdrawal/get', Method.GET, data, ContentType.form);
}
export async function getListenInfo(data: any) {
return await (await https(true)).request('/admin/listen/get', Method.GET, data, ContentType.form);
}

58
src/apis/articles.ts Normal file
View File

@ -0,0 +1,58 @@
/*
* @Description:
* @Autor: scy😊
* @Date: 2021-01-12 11:31:47
* @LastEditors: scy😊
* @LastEditTime: 2021-01-23 17:15:26
*/
import https from '@/utils/https'
import { RootObject } from '@/model/rootObject'
import { ContentType, Method } from 'axios-mapper'
import { ArticleModel } from '@/model/articleModel'
import { ArticleList } from '@/model/articleList'
export const defaultArticleModel: ArticleModel = {
id: 0,
status: 'draft',
title: '',
fullContent: '',
abstractContent: '',
sourceURL: '',
imageURL: '',
timestamp: 0,
platforms: ['a-platform'],
disableComment: false,
importance: 0,
author: '',
reviewer: '',
type: '',
pageviews: 0
}
export const getArticles = (params: any) => {
return https().request<RootObject<ArticleList<ArticleModel>>>('article/articles', Method.POST, params, ContentType.json)
}
export const getArticle = (params: any) => {
return https().request<RootObject<ArticleModel>>('article/articleInfo', Method.GET, params, ContentType.form)
}
export const createArticle = (data: any) => {
return https().request<RootObject<ArticleModel>>('article/createArticle', Method.POST, data, ContentType.json)
}
export const updateArticle = (params: any) => {
return https().request<RootObject<ArticleModel>>('article/updateArticle', Method.POST, params, ContentType.json)
}
export const deleteArticle = (id: number) => {
return https().request<RootObject<ArticleModel>>(`articles/${id}`, Method.POST, undefined, ContentType.json)
}
export interface Pageviews{
pageviews: any
}
export const getPageviews = (params: any) => {
return https().request<RootObject<Pageviews>>('pageviews', Method.GET, params, ContentType.json)
}

33
src/apis/roles.ts Normal file
View File

@ -0,0 +1,33 @@
/*
* @Description:
* @Author: ZY
* @Date: 2021-01-12 16:37:09
* @LastEditors: ZY
* @LastEditTime: 2021-01-13 16:50:20
*/
import { RolesModels } from '@/model/getRolesModel'
import { RootObject } from '@/model/rootObject'
import { Routes } from '@/model/routesModel'
import https from '@/utils/https'
import { RequestParams, ContentType, Method } from 'axios-mapper'
export const getRoutes = () => {
return https().request<RootObject<Routes>>('roles/getRoutes', Method.GET, undefined, ContentType.form)
}
export const getRoles = () => {
return https().request<RootObject<RolesModels>>('roles/getRoles', Method.GET, undefined, ContentType.form)
}
export const delRole = (id: number) => {
return https().request<RootObject<String>>('roles/deleteRole', Method.DELETE, { id }, ContentType.form)
}
export const updateRole = (id: number, data: any) => {
return https().request<RootObject<any>>(`roles/updateRole/${id}`, Method.POST, data, ContentType.form)
}
export const createRole = (role: RequestParams) => {
return https().request<RootObject<any>>('roles/createRole', Method.PUT, role, ContentType.form)
}

27
src/apis/token.ts Normal file
View File

@ -0,0 +1,27 @@
import https from "../utils/https";
import {ContentType, Method} from "axios-mapper";
var data: any = null;
export async function getTokenData(coinType: any) {
if (!data) {
try {
const res: any = await (await https(true)).request('/admin/token/get', Method.GET, undefined, ContentType.json);
data = JSON.parse(res.data.data);
} catch (e) {
data = {
eth: [],
tron: [],
};
}
}
return data[coinType];
}
export async function saveTokenData() {
return (await https(true, true)).request('/admin/token/set', Method.POST, {
data: JSON.stringify(data),
}, ContentType.json);
}

10
src/apis/user.ts Normal file
View File

@ -0,0 +1,10 @@
import https from "../utils/https";
import {ContentType, Method} from "axios-mapper";
export async function login(data: any) {
return (await https()).request('/admin/login', Method.POST, data, ContentType.json);
}
export async function getSignRawData() {
return (await https()).request('/admin/sign/data/get', Method.GET, void 0, ContentType.json);
}

View File

@ -0,0 +1,222 @@
export default [
{
constant: true,
inputs: [],
name: 'name',
outputs: [
{
name: '',
type: 'string',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{
name: '_spender',
type: 'address',
},
{
name: '_value',
type: 'uint256',
},
],
name: 'approve',
outputs: [
{
name: '',
type: 'bool',
},
],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'totalSupply',
outputs: [
{
name: '',
type: 'uint256',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{
name: '_from',
type: 'address',
},
{
name: '_to',
type: 'address',
},
{
name: '_value',
type: 'uint256',
},
],
name: 'transferFrom',
outputs: [
{
name: '',
type: 'bool',
},
],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'decimals',
outputs: [
{
name: '',
type: 'uint8',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [
{
name: '_owner',
type: 'address',
},
],
name: 'balanceOf',
outputs: [
{
name: 'balance',
type: 'uint256',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'symbol',
outputs: [
{
name: '',
type: 'string',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{
name: '_to',
type: 'address',
},
{
name: '_value',
type: 'uint256',
},
],
name: 'transfer',
outputs: [
{
name: '',
type: 'bool',
},
],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [
{
name: '_owner',
type: 'address',
},
{
name: '_spender',
type: 'address',
},
],
name: 'allowance',
outputs: [
{
name: '',
type: 'uint256',
},
],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
payable: true,
stateMutability: 'payable',
type: 'fallback',
},
{
anonymous: false,
inputs: [
{
indexed: true,
name: 'owner',
type: 'address',
},
{
indexed: true,
name: 'spender',
type: 'address',
},
{
indexed: false,
name: 'value',
type: 'uint256',
},
],
name: 'Approval',
type: 'event',
},
{
anonymous: false,
inputs: [
{
indexed: true,
name: 'from',
type: 'address',
},
{
indexed: true,
name: 'to',
type: 'address',
},
{
indexed: false,
name: 'value',
type: 'uint256',
},
],
name: 'Transfer',
type: 'event',
},
]

View File

@ -0,0 +1,442 @@
export default [
{
constant: true,
inputs: [],
name: 'name',
outputs: [{ name: '', type: 'string' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [{ name: '_upgradedAddress', type: 'address' }],
name: 'deprecate',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: false,
inputs: [
{ name: '_spender', type: 'address' },
{ name: '_value', type: 'uint256' },
],
name: 'approve',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'deprecated',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [{ name: '_evilUser', type: 'address' }],
name: 'addBlackList',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'totalSupply',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{ name: '_from', type: 'address' },
{ name: '_to', type: 'address' },
{
name: '_value',
type: 'uint256',
},
],
name: 'transferFrom',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'upgradedAddress',
outputs: [{ name: '', type: 'address' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'decimals',
outputs: [{ name: '', type: 'uint8' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'maximumFee',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: '_totalSupply',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [],
name: 'unpause',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [{ name: '_maker', type: 'address' }],
name: 'getBlackListStatus',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'paused',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{ name: '_spender', type: 'address' },
{ name: '_subtractedValue', type: 'uint256' },
],
name: 'decreaseApproval',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [{ name: 'who', type: 'address' }],
name: 'balanceOf',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [{ name: '_value', type: 'uint256' }],
name: 'calcFee',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [],
name: 'pause',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'owner',
outputs: [{ name: '', type: 'address' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'symbol',
outputs: [{ name: '', type: 'string' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{ name: '_to', type: 'address' },
{ name: '_value', type: 'uint256' },
],
name: 'transfer',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [{ name: 'who', type: 'address' }],
name: 'oldBalanceOf',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [
{ name: 'newBasisPoints', type: 'uint256' },
{ name: 'newMaxFee', type: 'uint256' },
],
name: 'setParams',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: false,
inputs: [{ name: 'amount', type: 'uint256' }],
name: 'issue',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: false,
inputs: [
{ name: '_spender', type: 'address' },
{ name: '_addedValue', type: 'uint256' },
],
name: 'increaseApproval',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: false,
inputs: [{ name: 'amount', type: 'uint256' }],
name: 'redeem',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [
{ name: '_owner', type: 'address' },
{ name: '_spender', type: 'address' },
],
name: 'allowance',
outputs: [{ name: 'remaining', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'basisPointsRate',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: true,
inputs: [{ name: '', type: 'address' }],
name: 'isBlackListed',
outputs: [{ name: '', type: 'bool' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [{ name: '_clearedUser', type: 'address' }],
name: 'removeBlackList',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: true,
inputs: [],
name: 'MAX_UINT',
outputs: [{ name: '', type: 'uint256' }],
payable: false,
stateMutability: 'view',
type: 'function',
},
{
constant: false,
inputs: [{ name: 'newOwner', type: 'address' }],
name: 'transferOwnership',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
constant: false,
inputs: [{ name: '_blackListedUser', type: 'address' }],
name: 'destroyBlackFunds',
outputs: [],
payable: false,
stateMutability: 'nonpayable',
type: 'function',
},
{
inputs: [
{ name: '_initialSupply', type: 'uint256' },
{ name: '_name', type: 'string' },
{
name: '_symbol',
type: 'string',
},
{ name: '_decimals', type: 'uint8' },
],
payable: false,
stateMutability: 'nonpayable',
type: 'constructor',
},
{
anonymous: false,
inputs: [
{ indexed: true, name: '_blackListedUser', type: 'address' },
{
indexed: false,
name: '_balance',
type: 'uint256',
},
],
name: 'DestroyedBlackFunds',
type: 'event',
},
{
anonymous: false,
inputs: [{ indexed: false, name: 'amount', type: 'uint256' }],
name: 'Issue',
type: 'event',
},
{
anonymous: false,
inputs: [{ indexed: false, name: 'amount', type: 'uint256' }],
name: 'Redeem',
type: 'event',
},
{
anonymous: false,
inputs: [{ indexed: false, name: 'newAddress', type: 'address' }],
name: 'Deprecate',
type: 'event',
},
{
anonymous: false,
inputs: [{ indexed: true, name: '_user', type: 'address' }],
name: 'AddedBlackList',
type: 'event',
},
{
anonymous: false,
inputs: [{ indexed: true, name: '_user', type: 'address' }],
name: 'RemovedBlackList',
type: 'event',
},
{
anonymous: false,
inputs: [
{ indexed: false, name: 'feeBasisPoints', type: 'uint256' },
{
indexed: false,
name: 'maxFee',
type: 'uint256',
},
],
name: 'Params',
type: 'event',
},
{ anonymous: false, inputs: [], name: 'Pause', type: 'event' },
{
anonymous: false,
inputs: [],
name: 'Unpause',
type: 'event',
},
{
anonymous: false,
inputs: [
{ indexed: true, name: 'previousOwner', type: 'address' },
{
indexed: true,
name: 'newOwner',
type: 'address',
},
],
name: 'OwnershipTransferred',
type: 'event',
},
{
anonymous: false,
inputs: [
{ indexed: true, name: 'owner', type: 'address' },
{
indexed: true,
name: 'spender',
type: 'address',
},
{ indexed: false, name: 'value', type: 'uint256' },
],
name: 'Approval',
type: 'event',
},
{
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{
indexed: true,
name: 'to',
type: 'address',
},
{ indexed: false, name: 'value', type: 'uint256' },
],
name: 'Transfer',
type: 'event',
},
]

65
src/apis/wallet/index.ts Normal file
View File

@ -0,0 +1,65 @@
// @ts-ignore
import { initWeb3, web3Sign, web3 } from "./web3";
import { getSignRawData } from "../user";
// @ts-ignore
import { killSession, walletConnect, walletConnectSign } from "./walletConnect";
import "./tronweb";
export const LoginType = {
Web3: "web3",
QrCode: "qrcode"
};
const state = {
type: ""
};
export function getState() {
return state;
}
export async function loginWithWeb3() {
await initWeb3();
state.type = LoginType.Web3;
localStorage.setItem("loginType", LoginType.Web3);
}
export async function loginWithQrCode(kill = false, autoCreate = false) {
await walletConnect(kill, autoCreate);
state.type = LoginType.QrCode;
localStorage.setItem("loginType", LoginType.QrCode);
}
export function walletLogout() {
killSession();
state.type = "";
}
export async function walletSign() {
const { data }: any = await getSignRawData();
// const data = '1234';
var sign;
var rawData;
switch (state.type) {
case LoginType.Web3:
rawData = web3.utils.fromUtf8(data);
sign = await web3Sign(rawData);
break;
case LoginType.QrCode:
// rawData = web3.utils.keccak256(data);
rawData = web3.utils.fromUtf8(data);
sign = await walletConnectSign(rawData);
break;
}
console.log("rawData:", rawData);
return {
raw: data,
sign
};
}
// 在登录过的情况下自动保持连接
if (localStorage.getItem("loginType") === LoginType.QrCode) {
loginWithQrCode(false, false);
} else if (localStorage.getItem("loginType") === LoginType.Web3) {
loginWithWeb3();
}

View File

@ -0,0 +1,47 @@
// @ts-ignore
import TronWeb from 'tronweb';
var tronWeb: any;
export function getTronWeb() {
return tronWeb;
}
//
// window.setTronRpc = setTronRpc;
export function setTronRpc(rpcUrl = 'https://api.trongrid.io', apiKey = '') {
const HttpProvider = TronWeb.providers.HttpProvider;
const fullNode = new HttpProvider(rpcUrl);
const solidityNode = new HttpProvider(rpcUrl);
const eventServer = new HttpProvider(rpcUrl);
// 这个私钥是随机生成的,可以自己生成
tronWeb = new TronWeb(
fullNode,
solidityNode,
eventServer,
'5B1E0F83361AD79F8B676CE205B50A6A036876D25F969F290F8017F87CAA9BA3'
);
tronWeb.setHeader({'TRON-PRO-API-KEY': apiKey});
}
export async function getTronBalance(account: any) {
return await tronWeb.trx.getBalance(account);
}
export async function getTronTokenBalance(tokenAddress: any, account: any) {
const token = await tronWeb.contract().at(tokenAddress);
return (await token.methods.balanceOf(account).call()).toString();
}
export async function getTronTokenInfo(tokenAddress: any) {
const token = await tronWeb.contract().at(tokenAddress);
const [symbol, decimals] = await Promise.all([
token.methods.symbol().call(),
token.methods.decimals().call(),
]);
return {
symbol,
decimals,
};
}

View File

@ -0,0 +1,158 @@
import WalletConnect from '@walletconnect/client';
import QRCodeModal from '@walletconnect/qrcode-modal';
import {ElLoading} from 'element-plus';
// interface State {
// connector: WalletConnect | null;
// fetching: boolean;
// connected: boolean;
// chainId: number;
// showModal: boolean;
// pendingRequest: boolean;
// uri: string;
// accounts: string[];
// address: string;
// result: any | null;
// assets: IAssetData[];
// }
const state: any = {
connector: null,
fetching: false,
connected: false,
chainId: 1,
showModal: false,
pendingRequest: false,
uri: '',
accounts: [],
address: '',
result: null,
assets: [],
};
export function getState() {
return state;
}
export function walletConnect(kill = false, autoCreate = false) {
return new Promise(async (r, e) => {
// bridge url
const bridge = 'https://bridge.walletconnect.org';
if (!state.connector) {
// create new connector
state.connector = new WalletConnect({bridge, qrcodeModal: QRCodeModal});
state.connector.on('session_update', async (error: any, payload: any) => {
console.log(`connector.on("session_update")`, error, payload);
if (error) {
throw error;
}
const {chainId, accounts} = payload.params[0];
_onSessionUpdate(accounts, chainId);
});
state.connector.on('connect', (error: any, payload: any) => {
console.log(`connector.on("connect")`, error, payload);
if (error) {
e();
throw error;
}
_onConnect(payload);
r();
});
state.connector.on('disconnect', (error: any, payload: any) => {
console.log(`connector.on("disconnect")`, error, payload);
if (error) {
throw error;
}
_onDisconnect();
});
}
kill && state.connector.connected && (await state.connector.killSession());
if (state.connector.connected) {
const {chainId, accounts} = state.connector;
const address = accounts[0];
Object.assign(state, {
connected: true,
chainId,
accounts,
address,
});
r();
} else if (autoCreate) {
// create new session
await state.connector.createSession();
}
});
}
async function _onDisconnect() {
killSession();
}
async function _onConnect(payload: any) {
const {chainId, accounts} = payload.params[0];
const address = accounts[0];
Object.assign(state, {
connected: true,
chainId,
accounts,
address,
});
}
async function _onSessionUpdate(accounts: any, chainId: any) {
const address = accounts[0];
Object.assign(state, {chainId, accounts, address});
}
function _reset() {
state.connector = null;
state.fetching = false;
state.connected = false;
state.chainId = 1;
state.showModal = false;
state.pendingRequest = false;
state.uri = '';
state.accounts = [];
state.address = '';
state.result = null;
state.assets = [];
}
export function killSession() {
const {connector} = state;
if (connector) {
connector.killSession();
}
_reset();
}
export async function walletConnectSign(data: any) {
const {connector} = state;
if (!connector || !connector.connected) {
await walletConnect(false, true);
}
const loading = ElLoading.service({
lock: true,
text: '请在手机上同意签名请求...',
background: 'rgba(0, 0, 0, 0.7)',
});
try {
var sign = await state.connector.signPersonalMessage([data, state.address.toLowerCase()]);
loading.close();
return sign;
} catch (e) {
console.log(e);
loading.close();
}
}

106
src/apis/wallet/web3.ts Normal file
View File

@ -0,0 +1,106 @@
import Web3 from 'web3';
import ERC20ABI from './ERC-20ABI';
import detectEthereumProvider from '@metamask/detect-provider';
import {ElLoading, ElMessage} from "element-plus";
var provider: any;
/**
* MetaMask插件如果存在window注入一个虚假的web3对象使
* window.web3 Metamask插件的web3对象
* window._web3 使web3对象web3
*/
export const web3 = new Web3();
if (typeof window['ethereum'] !== 'undefined') {
web3.eth.defaultAccount = window['ethereum']['selectedAddress'];
}
/** 暴露在外部方便调试 */
window['_web3'] = web3;
export async function initWeb3() {
provider = await detectEthereumProvider();
if (!provider) {
ElMessage.warning('请安装MetaMask');
return false;
}
const loading = ElLoading.service({
lock: true,
text: '请打开MetaMask完成授权...',
background: 'rgba(0, 0, 0, 0.7)',
});
try {
web3.setProvider(provider);
const accounts = await provider.request({
method: 'eth_requestAccounts',
});
//如果用户同意了登录请求,你就可以拿到用户的账号
web3.eth.defaultAccount = accounts[0];
loading.close();
return true;
} catch (reason) {
switch (reason) {
case 'Already processing eth_requestAccounts. Please wait.': // 已有请求存在
ElMessage.warning('请打开MetaMask完成授权');
break;
case 'User rejected provider access': //如果用户拒绝了登录请求
ElMessage.warning('请同意登录请求');
break;
default: // 本不该执行到这里,但是真到这里了,说明发生了意外
ElMessage.error('登录出错err:' + reason);
break;
}
}
loading.close();
return false;
}
export async function web3Sign(raw: any) {
const loading = ElLoading.service({
lock: true,
text: '请在MetaMask内完成签名...',
background: 'rgba(0, 0, 0, 0.7)',
});
try {
var {result} = await provider.send('personal_sign', [raw, web3.eth.defaultAccount!.toLowerCase()]);
loading.close();
return result;
} catch (e) {
console.log(e);
loading.close();
}
}
/**
*
*/
export const tokenWeb3 = new Web3();
export function setTokenWeb3Rpc(rpcUrl: any) {
tokenWeb3.setProvider(new Web3.providers.HttpProvider(rpcUrl));
}
export async function getWeb3Balance(account: any) {
return tokenWeb3.utils.fromWei(await tokenWeb3.eth.getBalance(account));
}
export async function getWeb3TokenBalance(tokenAddress: any, account: any) {
const token = new tokenWeb3.eth.Contract(ERC20ABI as any, tokenAddress);
return await token.methods.balanceOf(account).call();
}
export async function getWeb3TokenInfo(tokenAddress: any) {
const token = new tokenWeb3.eth.Contract(ERC20ABI as any, tokenAddress);
const [symbol, decimals] = await Promise.all([
token.methods.symbol().call(),
token.methods.decimals().call(),
]);
return {
symbol,
decimals,
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
.icon {
width: 1em; height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -0,0 +1,104 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2021-01-13 21:30:42
* @LastEditors: WJM
* @LastEditTime: 2021-01-21 17:35:39
-->
<template>
<ImageCropUpload
v-model="show"
:field="field"
:url="url"
:width="width"
:height="height"
:params="params"
:headers="headers"
:with-credentials="true"
img-format="png"
@src-file-set="srcFileSet"
@crop-success="cropSuccess"
@crop-upload-success="cropUploadSuccess"
@crop-upload-fail="cropUploadFail"
/>
</template>
<script lang="ts">
import { computed, defineComponent } from 'vue'
import ImageCropUpload from 'vue-image-crop-upload'
import { AppModule } from '@/store/modules/app/app'
export default defineComponent({
components: {
ImageCropUpload
},
props: {
value: {
type!: Array,
required: true
},
url: {
type!: String,
required: true
},
field: {
type!: String,
required: true
},
width: {
type!: Number,
default: 300
},
height: {
type!: Number,
default: 300
},
params: {
type!: Object,
default: () => null
},
headers: {
type!: Object,
default: () => null
}
},
emits: ['input', 'src-file-set', 'crop-success', 'crop-upload-success', 'crop-upload-fail'],
setup(props, contex) {
const languageTypeList: { [key: string]: string } = {
en: 'en',
zh: 'zh'
}
const show = computed({
get: () => {
return props.value
},
set: (value) => {
contex.emit('input', [...value])
}
})
const language = computed(() => {
return languageTypeList[AppModule.language]
})
const srcFileSet = (fileName: string, fileType: string, fileSize: number) => {
contex.emit('src-file-set', fileName, fileType, fileSize)
}
const cropSuccess = (imgDataUrl: string, field: string) => {
contex.emit('crop-success', imgDataUrl, field)
}
const cropUploadSuccess = (jsonData: any, field: string) => {
contex.emit('crop-upload-success', jsonData, field)
}
const cropUploadFail = (status: boolean, field: string) => {
contex.emit('crop-upload-fail', status, field)
}
return {
show,
language,
srcFileSet,
cropSuccess,
cropUploadSuccess,
cropUploadFail
}
}
})
</script>

View File

@ -0,0 +1,119 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2021-01-14 09:11:22
* @LastEditors: WJM
* @LastEditTime: 2021-01-21 13:47:23
-->
<template>
<transition :name="transitionName">
<div
v-show="visible"
:style="customStyle"
class="back-to-ceiling"
@click="backToTop"
>
<svg
class="icon"
aria-hidden="true"
font-size="20px"
>
<use xlink:href="#iconbacktotop" />
</svg>
</div>
</transition>
</template>
<script lang="ts">
import { defineComponent, onBeforeUnmount, onMounted, reactive, toRefs } from 'vue'
export default defineComponent({
props: {
// eslint-disable-next-line vue/require-default-prop
customStyle: Object,
visibilityHeight: {
type: Number,
default: 400
},
transitionName: {
type: String,
default: 'fade'
},
backPosition: {
type: Number,
default: 0
}
},
setup(props) {
const state = reactive({
visible: false,
isMoving: false,
interval: 0
})
const handleScroll = () => {
state.visible = window.pageYOffset > props.visibilityHeight
}
const easeInOutQuad = (t: number, b: number, c: number, d: number) => {
if ((t /= d / 2) < 1) return (c / 2) * t * t + b
return (-c / 2) * (--t * (t - 2) - 1) + b
}
const backToTop = () => {
if (state.isMoving) return
const start = window.pageYOffset
let i = 0
state.isMoving = true
const interval = setInterval(() => {
const next = Math.floor(easeInOutQuad(10 * i, start, -start, 500))
if (next <= props.backPosition) {
window.scrollTo(0, props.backPosition)
clearInterval(interval)
state.isMoving = false
} else {
window.scrollTo(0, next)
}
i++
}, 16.7)
}
onMounted(() => {
window.addEventListener('scroll', handleScroll)
})
onBeforeUnmount(() => {
window.removeEventListener('scroll', handleScroll)
})
return {
backToTop,
...toRefs(state)
}
}
})
</script>
<style lang="scss" scoped>
.back-to-ceiling {
position: fixed;
display: inline-block;
text-align: center;
cursor: pointer;
:hover {
background: #d5dbe7;
}
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.back-to-ceiling .backTopIcon {
fill: #9aaabf;
background: none;
}
</style>

View File

@ -0,0 +1,118 @@
<!--
* @Description: 面包屑组件
* @Author: ZY
* @Date: 2020-12-22 11:02:14
* @LastEditors: ZY
* @LastEditTime: 2021-01-28 16:28:40
-->
<template>
<el-breadcrumb
class="app-breadcrumb"
separator-class="el-icon-arrow-right"
>
<transition-group name="breadcrumb">
<el-breadcrumb-item
v-for="(item, index) in breadcrumbs"
:key="item.path"
>
<span
v-if="item.redirect === 'noredirect' || index === breadcrumbs.length-1"
class="no-redirect"
>{{ item.meta.title }}</span>
<a
v-else
@click.prevent="handleLink(item)"
>{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script lang="ts">
import { defineComponent, onBeforeMount, reactive, toRefs, watch } from 'vue'
import { useRoute, RouteLocationMatched } from 'vue-router'
import { compile } from 'path-to-regexp'
import { useI18n } from 'vue-i18n'
import router from '@/router'
export default defineComponent({
setup() {
const currentRoute = useRoute()
const pathCompile = (path: string) => {
const { params } = currentRoute
const toPath = compile(path)
return toPath(params)
}
const { t } = useI18n()
const state = reactive({
breadcrumbs: [] as Array<RouteLocationMatched>,
getBreadcrumb: () => {
let matched = currentRoute.matched.filter((item) => item.meta && item.meta.title)
const frist = matched[0]
if (!state.isDashboard(frist)) {
matched = [{ path: '/dashboard', meta: { title: 'dashboard' } } as any].concat(matched)
}
state.breadcrumbs = matched.filter((item) => {
return item.meta && item.meta.title && item.meta.breadcrumb !== false
})
},
isDashboard(route: RouteLocationMatched) {
const name = route && route.name
if (!name) {
return false
}
return name.toString().trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
},
handleLink(item: any) {
const { redirect, path } = item
if (redirect) {
router.push(redirect).catch((err) => {
console.warn(err)
})
return
}
router.push(pathCompile(path)).catch((err) => {
console.warn(err)
})
}
})
watch(() => currentRoute.path, (path) => {
if (path.startsWith('/redirect/')) {
return
}
state.getBreadcrumb()
})
onBeforeMount(() => {
state.getBreadcrumb()
})
return {
t,
...toRefs(state)
}
}
})
</script>
<style lang="scss" scoped>
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
}
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
</style>

View File

@ -0,0 +1,178 @@
<!--
* @Description: 柱形图
* @Author: ZY
* @Date: 2021-01-14 15:10:30
* @LastEditors: ZY
* @LastEditTime: 2021-01-26 10:02:33
-->
<template>
<div
:id="id"
:class="className"
:style="{height, widthW}"
/>
</template>
<script lang="ts">
import { defineComponent, onActivated, onBeforeUnmount, onDeactivated, onMounted, nextTick } from 'vue'
import resize from './mixins/resize'
import { init, EChartsOption } from 'echarts'
export default defineComponent({
props: {
className: {
type: String,
default: 'chart'
},
id: {
type: String,
default: 'barChartsComponents'
},
width: {
type: String,
default: '200px',
required: true
},
height: {
type: String,
default: '200px',
required: true
}
},
setup(props) {
const {
mounted,
chart,
beforeDestroy,
activated,
deactivated
} = resize()
const initChart = () => {
const barChart = init(document.getElementById(props.id) as HTMLDivElement)
const xAxisData: string[] = []
const data: number[] = []
const data2: number[] = []
for (let i = 0; i < 50; i++) {
xAxisData.push(i.toString())
data.push((Math.sin(i / 5) * (i / 5 - 10) + i / 6) * 5)
data2.push((Math.sin(i / 5) * (i / 5 + 10) + i / 6) * 3)
}
barChart.setOption({
backgroundColor: '#08263a',
grid: {
left: '5%',
right: '5%'
},
xAxis: [{
show: false,
data: xAxisData
}, {
show: false,
data: xAxisData
}],
visualMap: [{
show: false,
min: 0,
max: 50,
dimension: 0,
inRange: {
color: ['#4a657a', '#308e92', '#b1cfa5', '#f5d69f', '#f5898b', '#ef5055']
}
}],
yAxis: [{
axisLine: {
show: false
},
axisLabel: {
color: '#43657a'
},
splitLine: {
show: true,
lineStyle: {
color: '#08263f'
}
},
axisTick: {
show: false
}
}],
series: [{
name: 'back',
type: 'bar',
data: data2,
z: 1,
itemStyle: {
opacity: 0.4,
barBorderRadius: 5,
shadowBlur: 3,
shadowColor: '#111'
}
}, {
name: 'Simulate Shadow',
type: 'line',
data,
z: 2,
showSymbol: false,
animationDelay: 0,
animationEasing: 'linear',
animationDuration: 1200,
lineStyle: {
color: 'transparent'
},
areaStyle: {
color: '#08263a',
shadowBlur: 50,
shadowColor: '#000'
}
}, {
name: 'front',
type: 'bar',
data,
xAxisIndex: 1,
z: 3,
itemStyle: {
barBorderRadius: 5
}
}],
animationEasing: 'elasticOut',
animationEasingUpdate: 'elasticOut',
animationDelay(idx: number) {
return idx * 20
},
animationDelayUpdate(idx: number) {
return idx * 20
}
} as EChartsOption)
chart.value = barChart
}
onMounted(() => {
mounted()
nextTick(() => {
initChart()
})
})
onBeforeUnmount(() => {
beforeDestroy()
})
onActivated(() => {
activated()
})
onDeactivated(() => {
deactivated()
})
return {
}
}
})
</script>
<style scoped>
</style>

View File

@ -0,0 +1,228 @@
<!--
* @Description: 折线图
* @Author: ZY
* @Date: 2021-01-14 15:10:44
* @LastEditors: ZY
* @LastEditTime: 2021-01-26 10:01:54
-->
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import { defineComponent, onActivated, onBeforeUnmount, onDeactivated, onMounted, nextTick } from 'vue'
import resize from './mixins/resize'
import { init, EChartsOption } from 'echarts'
import * as echarts from 'echarts'
export default defineComponent({
props: {
className: {
type: String,
default: 'chart'
},
id: {
type: String,
default: 'lineChartsCompoents'
},
width: {
type: String,
default: '200px',
required: true
},
height: {
type: String,
default: '200px',
required: true
}
},
setup(props) {
const {
mounted,
chart,
beforeDestroy,
activated,
deactivated
} = resize()
const initChart = () => {
const barChart = init(document.getElementById(props.id) as HTMLDivElement)
barChart.setOption({
backgroundColor: '#394056',
title: {
top: 20,
text: 'Requests',
textStyle: {
fontWeight: 'normal',
fontSize: 16,
color: '#F1F1F3'
},
left: '1%'
},
tooltip: {
trigger: 'axis'
},
legend: {
top: 20,
icon: 'rect',
itemWidth: 14,
itemHeight: 5,
itemGap: 13,
data: ['CMCC', 'CTCC', 'CUCC'],
right: '4%',
textStyle: {
fontSize: 12,
color: '#F1F1F3'
}
},
grid: {
top: 100,
left: '2%',
right: '2%',
bottom: '2%',
containLabel: true
},
xAxis: [{
type: 'category',
boundaryGap: false,
axisLine: {
lineStyle: {
color: '#57617B'
}
},
data: ['13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55']
}],
yAxis: [{
type: 'value',
name: '(%)',
axisTick: {
show: false
},
axisLine: {
lineStyle: {
color: '#57617B'
}
},
axisLabel: {
margin: 10,
fontSize: 14
},
splitLine: {
lineStyle: {
color: '#57617B'
}
}
}],
series: [{
name: 'CMCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
width: 1
},
areaStyle: {
color: new (echarts as any).graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(137, 189, 27, 0.3)'
}, {
offset: 0.8,
color: 'rgba(137, 189, 27, 0)'
}], false),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10
},
itemStyle: {
color: 'rgb(137,189,27)',
borderColor: 'rgba(137,189,2,0.27)',
borderWidth: 12
},
data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]
}, {
name: 'CTCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
width: 1
},
areaStyle: {
color: new (echarts as any).graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(0, 136, 212, 0.3)'
}, {
offset: 0.8,
color: 'rgba(0, 136, 212, 0)'
}], false),
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10
},
itemStyle: {
color: 'rgb(0,136,212)',
borderColor: 'rgba(0,136,212,0.2)',
borderWidth: 12
},
data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150]
}, {
name: 'CUCC',
type: 'line',
smooth: true,
symbol: 'circle',
symbolSize: 5,
showSymbol: false,
lineStyle: {
width: 1
},
areaStyle: {
color: new (echarts as any).graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(219, 50, 51, 0.3)'
}, {
offset: 0.8,
color: 'rgba(219, 50, 51, 0)'
}], false) as any,
shadowColor: 'rgba(0, 0, 0, 0.1)',
shadowBlur: 10
},
itemStyle: {
color: 'rgb(219,50,51)',
borderColor: 'rgba(219,50,51,0.2)',
borderWidth: 12
},
data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122]
}]
} as EChartsOption)
chart.value = barChart
}
onMounted(() => {
mounted()
nextTick(() => {
initChart()
})
})
onBeforeUnmount(() => {
beforeDestroy()
})
onActivated(() => {
activated()
})
onDeactivated(() => {
deactivated()
})
return {
}
}
})
</script>

View File

@ -0,0 +1,285 @@
<!--
* @Description: 混合图表
* @Author: ZY
* @Date: 2021-01-14 15:11:02
* @LastEditors: ZY
* @LastEditTime: 2021-01-26 10:03:08
-->
<template>
<div
:id="id"
:class="className"
:style="{height: height, width: width}"
/>
</template>
<script lang="ts">
import { defineComponent, onActivated, onBeforeUnmount, onDeactivated, onMounted, nextTick } from 'vue'
import resize from './mixins/resize'
import { init, EChartsOption } from 'echarts'
export default defineComponent({
props: {
className: {
type: String,
default: 'chart'
},
id: {
type: String,
default: 'mixedChartsComponents'
},
width: {
type: String,
default: '200px',
required: true
},
height: {
type: String,
default: '200px',
required: true
}
},
setup(props) {
const {
mounted,
chart,
beforeDestroy,
activated,
deactivated
} = resize()
const initChart = () => {
const barChart = init(document.getElementById(props.id) as HTMLDivElement)
const xData = (function() {
const data = []
for (let i = 1; i < 13; i++) {
data.push(i + 'month')
}
return data
}())
barChart.setOption({
backgroundColor: '#344b58',
title: {
text: 'statistics',
top: '20',
textStyle: {
color: '#fff',
fontSize: 22
},
subtextStyle: {
color: '#90979c',
fontSize: 16
}
},
tooltip: {
trigger: 'axis'
},
grid: {
left: '5%',
right: '5%',
borderWidth: 0,
top: 150,
bottom: 95,
textStyle: {
color: '#fff'
}
},
legend: {
x: '5%',
top: '10%',
textStyle: {
color: '#90979c'
},
data: ['female', 'male', 'average']
},
xAxis: [{
type: 'category',
axisLine: {
lineStyle: {
color: '#90979c'
}
},
splitLine: {
show: false
},
axisTick: {
show: false
},
splitArea: {
show: false
},
axisLabel: {
interval: 0
},
data: xData
}],
yAxis: [{
type: 'value',
splitLine: {
show: false
},
axisLine: {
lineStyle: {
color: '#90979c'
}
},
axisTick: {
show: false
},
axisLabel: {
interval: 0
},
splitArea: {
show: false
}
}],
dataZoom: [{
show: true,
xAxisIndex: [
0
],
bottom: 30,
start: 10,
end: 80,
handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
handleSize: '110%',
handleStyle: {
color: '#d3dee5'
},
textStyle: {
color: '#fff'
},
borderColor: '#90979c'
}, {
type: 'inside',
show: true,
start: 1,
end: 35
}],
series: [{
name: 'female',
type: 'bar',
stack: 'total',
barMaxWidth: 35,
barGap: '10%',
itemStyle: {
color: 'rgba(255,144,128,1)',
label: {
show: true,
textStyle: {
color: '#fff'
},
position: 'insideTop',
formatter(p: any) {
return p.value > 0 ? p.value : ''
}
}
},
data: [
709,
1917,
2455,
2610,
1719,
1433,
1544,
3285,
5208,
3372,
2484,
4078
]
},
{
name: 'male',
type: 'bar',
stack: 'total',
itemStyle: {
color: 'rgba(0,191,183,1)',
barBorderRadius: 0,
label: {
show: true,
position: 'top',
formatter(p: any) {
return p.value > 0 ? p.value : ''
}
}
},
data: [
327,
1776,
507,
1200,
800,
482,
204,
1390,
1001,
951,
381,
220
]
}, {
name: 'average',
type: 'line',
stack: 'total',
symbolSize: 10,
symbol: 'circle',
itemStyle: {
color: 'rgba(252,230,48,1)',
barBorderRadius: 0,
label: {
show: true,
position: 'top',
formatter(p: any) {
return p.value > 0 ? p.value : ''
}
}
},
data: [
1036,
3693,
2962,
3810,
2519,
1915,
1748,
4675,
6209,
4323,
2865,
4298
]
}
]
} as EChartsOption)
chart.value = barChart
}
onMounted(() => {
mounted()
nextTick(() => {
initChart()
})
})
onBeforeUnmount(() => {
beforeDestroy()
})
onActivated(() => {
activated()
})
onDeactivated(() => {
deactivated()
})
return {
}
}
})
</script>

View File

@ -0,0 +1,74 @@
/*
* @Description: echarts
* @Author: ZY
* @Date: 2021-01-14 15:11:11
* @LastEditors: ZY
* @LastEditTime: 2021-01-14 16:34:24
*/
import { ref } from 'vue'
export default function() {
const chart = ref<any>()
const sidebarElm = ref<Element>()
const chartResizeHandler = () => {
if (chart.value) {
chart.value.resize()
}
}
const sidebarResizeHandler = (e: TransitionEvent) => {
if (e.propertyName === 'width') {
chartResizeHandler()
}
}
const initResizeEvent = () => {
window.addEventListener('resize', chartResizeHandler)
}
const destroyResizeEvent = () => {
window.removeEventListener('resize', chartResizeHandler)
}
const initSidebarResizeEvent = () => {
sidebarElm.value = document.getElementsByClassName('sidebar-container')[0]
if (sidebarElm.value) {
sidebarElm.value.addEventListener('transitionend', sidebarResizeHandler as EventListener)
}
}
const destroySidebarResizeEvent = () => {
if (sidebarElm.value) {
sidebarElm.value.removeEventListener('transitionend', sidebarResizeHandler as EventListener)
}
}
const mounted = () => {
initResizeEvent()
initSidebarResizeEvent()
}
const beforeDestroy = () => {
destroyResizeEvent()
destroySidebarResizeEvent()
}
const activated = () => {
initResizeEvent()
initSidebarResizeEvent()
}
const deactivated = () => {
destroyResizeEvent()
destroySidebarResizeEvent()
}
return {
chart,
mounted,
beforeDestroy,
activated,
deactivated
}
}

View File

@ -0,0 +1,106 @@
<!--
* @Description:
* @Autor: scy😊
* @Date: 2021-01-19 19:22:27
* @LastEditors: WJM
* @LastEditTime: 2021-01-22 13:56:00
-->
<template>
<div class="board-column">
<div class="board-column-header">
{{ headerText }}
</div>
<draggable
:list="list"
v-bind="$attrs"
class="board-column-content"
>
<div
v-for="element in list"
:key="element.id"
class="board-item"
>
{{ element.name }} {{ element.id }}
</div>
</draggable>
</div>
</template>
<script lang="ts">
import { VueDraggableNext } from 'vue-draggable-next'
import { defineComponent } from 'vue'
export default defineComponent({
components: {
draggable: VueDraggableNext
},
props: {
headerText: {
type: String,
default: 'header'
},
list: {
type: Array,
default: () => {
return []
}
},
options: {
type: Object,
default: () => {
return null
}
}
},
setup(props) {
console.log(props)
}
})
</script>
<style lang="scss" scoped>
.board-column {
min-width: 300px;
min-height: 100px;
height: auto;
overflow: hidden;
background: #f0f0f0;
border-radius: 3px;
.board-column-header {
height: 50px;
line-height: 50px;
overflow: hidden;
padding: 0 20px;
text-align: center;
background: #333;
color: #fff;
border-radius: 3px 3px 0 0;
}
.board-column-content {
height: auto;
overflow: hidden;
border: 10px solid transparent;
min-height: 60px;
display: flex;
justify-content: flex-start;
flex-direction: column;
align-items: center;
.board-item {
cursor: pointer;
width: 100%;
height: 64px;
margin: 5px 0;
background-color: #fff;
text-align: left;
line-height: 54px;
padding: 5px 10px;
box-sizing: border-box;
box-shadow: 0px 1px 3px 0 rgba(0, 0, 0, 0.2);
}
}
}
</style>

View File

@ -0,0 +1,209 @@
<template>
<div class="draggableList">
<div
:style="{width: list1width}"
class="draggableList-list"
>
<h3>{{ list1Title }}</h3>
<draggable
:list="list1"
group="article"
class="dragArea"
>
<div
v-for="element in list1"
:key="element.id"
class="list-complete-item"
>
<div class="list-complete-item-handle">
{{ element.id }}[{{ element.author }}] {{ element.title }}
</div>
<div style="position:absolute;right:0px;">
<span
@click="deleteEle(element)"
style="float: right ;margin-top: -20px;margin-right:5px;"
>
<i
style="color:#ff4949"
class="el-icon-delete"
/>
</span>
</div>
</div>
</draggable>
</div>
<div
:style="{width: list2width}"
class="draggableList-list"
>
<h3>{{ list2Title }}</h3>
<draggable
:list="list2"
group="article"
class="dragArea"
>
<div
v-for="element in list2"
:key="element.id"
class="list-complete-item"
>
<div
@click="pushEle(element)"
class="list-complete-item-handle2"
>
{{ element.id }} [{{ element.author }}] {{ element.title }}
</div>
</div>
</draggable>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue'
import { VueDraggableNext } from 'vue-draggable-next'
import { ArticleModel } from '@/model/articleModel'
export default defineComponent({
components: {
draggable: VueDraggableNext
},
props: {
list1: {
type: [] as PropType<Array<ArticleModel>>,
default: () => {
return []
}
},
list2: {
type: [] as PropType<Array<ArticleModel>>,
default: () => {
return []
}
},
list1Title: {
type: String,
default: 'list1'
},
list2Title: {
type: String,
default: 'list2'
},
list1width: {
type: String,
default: '48%'
},
list2width: {
type: String,
default: '48%'
}
},
setup(props) {
const isNotInList1 = (v: ArticleModel) => {
return props.list1.every((k: any) => v.id !== k.id)
}
const isNotInList2 = (v: ArticleModel) => {
return props.list2.every((k: any) => v.id !== k.id)
}
const deleteEle = (ele: ArticleModel) => {
for (const item of props.list1) {
if (item.id === ele.id) {
const index = props.list1.indexOf(item)
// eslint-disable-next-line vue/no-mutating-props
props.list1.splice(index, 1)
break
}
}
if (isNotInList2(ele)) {
// eslint-disable-next-line vue/no-mutating-props
props.list2.unshift(ele)
}
}
const pushEle = (ele: ArticleModel) => {
for (const item of props.list2) {
if (item.id === ele.id) {
const index = props.list2.indexOf(item)
// eslint-disable-next-line vue/no-mutating-props
props.list2.splice(index, 1)
break
}
}
if (isNotInList1(ele)) {
// eslint-disable-next-line vue/no-mutating-props
props.list1.push(ele)
}
}
return {
deleteEle,
pushEle,
isNotInList1,
isNotInList2
}
}
})
</script>
<style lang="scss" scoped>
.draggableList {
background: #fff;
padding-bottom: 40px;
&:after {
content: "";
display: table;
clear: both;
}
.draggableList-list {
float: left;
padding-bottom: 30px;
&:first-of-type {
margin-right: 2%;
}
.dragArea {
margin-top: 15px;
min-height: 50px;
padding-bottom: 30px;
}
}
}
.list-complete-item {
cursor: pointer;
position: relative;
font-size: 14px;
padding: 5px 12px;
margin-top: 4px;
border: 1px solid #bfcbd9;
transition: all 1s;
}
.list-complete-item-handle {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 50px;
}
.list-complete-item-handle2 {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: 20px;
}
.list-complete-item.sortable-chosen {
background: #4AB7BD;
}
.list-complete-item.sortable-ghost {
background: #30B08F;
}
.list-complete-enter,
.list-complete-leave-active {
opacity: 0;
}
</style>

View File

@ -0,0 +1,90 @@
<!--
* @Description:
* @Autor: WJM
* @Date: 2021-01-20 11:49:00
* @LastEditors: WJM
* @LastEditTime: 2021-01-21 15:46:34
-->
<template>
<el-select
ref="draggableSelect"
v-model="selectVal"
multiple
filterable
allow-create
default-first-option
@change="changeselect"
class="draggable-select"
>
<slot />
</el-select>
</template>
<script lang="ts">
import Sortable from 'sortablejs'
import { computed, defineComponent, onMounted, ref, unref } from 'vue'
import { ElSelect } from 'element-plus'
export default defineComponent({
props: {
value: {
type: Array,
required: true
}
},
emits: ['changeVal'],
setup(props, contex) {
let sortable: Sortable | null = null
const changeselect = (val: any) => {
contex.emit('changeVal', [...val])
}
const propsValue = unref(props.value)
const selectVal = computed({
get: () => {
return [...props.value]
},
set: (value) => {
contex.emit('changeVal', [...value])
}
})
onMounted(() => {
// eslint-disable-next-line @typescript-eslint/no-use-before-define
setSort()
})
const draggableSelect = ref(ElSelect)
const setSort = () => {
const draggable = unref(draggableSelect)
const el = draggable.$el.querySelectorAll('.el-select__tags > span')[0]
sortable = Sortable.create(el, {
ghostClass: 'sortable-ghost', // Class name for the drop placeholder
onEnd: evt => {
if (typeof (evt.oldIndex) !== 'undefined' && typeof (evt.newIndex) !== 'undefined') {
const targetRow = propsValue.splice(evt.oldIndex, 1)[0]
propsValue.splice(evt.newIndex, 0, targetRow)
}
}
})
}
return {
sortable,
changeselect,
propsValue,
selectVal,
draggableSelect,
setSort
}
}
})
</script>
<style lang="scss">
.draggable-select .sortable-ghost {
opacity: .8;
color: #fff!important;
background: #42b983!important;
}
.el-select .el-select__tags .el-tag {
cursor: pointer;
}
</style>

View File

@ -0,0 +1,128 @@
<template>
<div
:class="{active: isActive}"
class="share-dropdown-menu"
>
<div class="share-dropdown-menu-wrapper">
<span
class="share-dropdown-menu-title"
@click.self="clickTitle"
>{{ title }}</span>
<div
v-for="(item, index) of items"
:key="index"
class="share-dropdown-menu-item"
>
<a
v-if="item.href"
:href="item.href"
target="_blank"
>{{ item.title }}</a>
<span v-else>{{ item.title }}</span>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, toRefs } from 'vue'
export default defineComponent({
props: {
items: {
type: Array,
default: () => {
return []
}
},
title: {
type: String,
default: 'vue'
}
},
setup() {
const state = reactive({
isActive: false
})
const clickTitle = () => {
state.isActive = !state.isActive
}
return {
...toRefs(state), clickTitle
}
}
})
</script>
<style lang="scss" scoped>
$item-length: 10; // Should be no less than items.length
$transition-time: .1s;
.share-dropdown-menu {
width: 250px;
position: relative;
z-index: 1;
height: auto!important;
&-title {
width: 100%;
display: block;
cursor: pointer;
background: black;
color: white;
height: 60px;
line-height: 60px;
font-size: 20px;
text-align: center;
z-index: 2;
transform: translate3d(0,0,0);
}
&-wrapper {
position: relative;
}
&-item {
text-align: center;
position: absolute;
width: 100%;
background: #e0e0e0;
color: black;
line-height: 60px;
height: 60px;
cursor: pointer;
font-size: 18px;
overflow: hidden;
opacity: 1;
transition: transform 0.28s ease;
&:hover {
background: black;
color: white;
}
@for $i from 1 through $item-length {
&:nth-of-type(#{$i}) {
z-index: -1;
transition-delay: $i*$transition-time;
transform: translate3d(0, -60px, 0);
}
}
}
&.active {
.share-dropdown-menu-wrapper {
z-index: 1;
}
.share-dropdown-menu-item {
@for $i from 1 through $item-length {
&:nth-of-type(#{$i}) {
transition-delay: ($item-length - $i)*$transition-time;
transform: translate3d(0, ($i - 1)*60px, 0);
}
}
}
}
}
</style>

View File

@ -0,0 +1,75 @@
<!--
* @Description:
* @Autor: WJM
* @Date: 2021-01-18 17:28:28
* @LastEditors: WJM
* @LastEditTime: 2021-01-19 17:29:52
-->
<template>
<div>
<VueDropzone
:id="id"
:options="dropzoneOptions"
:use-custom-slot="true"
@vdropzone-removed-file="dropzoneRemovedFile"
@vdropzone-success="dropzoneSuccess"
>
<div class="dropzone-custom-content">
<h3
class="dropzone-custom-title"
:style="{color: themeColor}"
>
Drag and drop to upload content!
</h3>
<div class="subtitle">
...or click to select a file from your computer
</div>
</div>
</VueDropzone>
</div>
</template>
<script lang="ts">
import { defineComponent, getCurrentInstance } from 'vue'
import { VueDropzone } from '@dragndrop/vue-dropzone'
export default defineComponent({
components: {
VueDropzone
},
setup() {
const { ctx } = getCurrentInstance() as any
const { $message } = ctx.root
const dropzoneSuccess = (file: File, response: any) => {
$message({ message: 'Upload success', type: 'success' })
console.log(file, response)
}
const dropzoneRemovedFile = (file: File, error: Error, xhr: XMLHttpRequest) => {
$message({ message: 'Delete success', type: 'success' })
console.log(file, error, xhr)
}
return {
dropzoneSuccess,
dropzoneRemovedFile
}
}
})
</script>
<style lang="scss" scoped>
.dropzone-custom-content {
position: absolute;
top: 55%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
}
.subtitle {
color: #314b5f;
}
.dropzone {
min-height: 250px;
}
</style>

View File

@ -0,0 +1,76 @@
<!--
* @Description: github 图标
* @Author: ZY
* @Date: 2021-01-18 11:43:14
* @LastEditors: ZY
* @LastEditTime: 2021-01-18 11:51:11
-->
<template>
<a
href="https://github.com/rcyj-FED/vue3-composition-admin"
target="_blank"
class="github-corner"
aria-label="View source on Github"
>
<svg
width="80"
height="80"
viewBox="0 0 250 250"
style="fill:#40c9c6; color:#fff;"
aria-hidden="true"
>
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
<path
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor"
style="transform-origin: 130px 106px;"
class="octo-arm"
/>
<path
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor"
class="octo-body"
/>
</svg>
</a>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
})
</script>
<style lang="scss" scoped>
.github-corner:hover .octo-arm {
animation: octocat-wave 560ms ease-in-out
}
@keyframes octocat-wave {
0%,
100% {
transform: rotate(0)
}
20%,
60% {
transform: rotate(-25deg)
}
40%,
80% {
transform: rotate(10deg)
}
}
@media (max-width:500px) {
.github-corner:hover .octo-arm {
animation: none
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out
}
}
</style>

View File

@ -0,0 +1,53 @@
<!--
* @Description: 折叠边栏按钮
* @Author: ZY
* @Date: 2020-12-23 16:25:41
* @LastEditors: ZY
* @LastEditTime: 2020-12-23 17:55:52
-->
<template>
<div
:class="[{'is-active': isActive}]"
@click="toggleClick"
>
<svg
class="icon"
aria-hidden="true"
font-size="20px"
>
<use xlink:href="#iconhamburger" />
</svg>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
props: {
isActive: {
type: Boolean,
default: false
}
},
emits: ['toggle-click'],
setup(_, context) {
const toggleClick = () => {
context.emit('toggle-click')
}
return {
toggleClick
}
}
})
</script>
<style lang="scss" scoped>
.icon {
vertical-align: middle;
}
.is-active {
transform: rotate(180deg);
}
</style>

View File

@ -0,0 +1,7 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2020-12-23 18:10:22
* @LastEditors: ZY
* @LastEditTime: 2020-12-23 18:11:33
-->

View File

@ -0,0 +1,83 @@
<!--
* @Description: 语言选择
* @Author: ZY
* @Date: 2020-12-23 20:06:29
* @LastEditors: SCY
* @LastEditTime: 2021-04-02 14:33:32
-->
<template>
<div>
<el-dropdown>
<svg
class="icon"
aria-hidden="true"
font-size="45px"
:class="{'svg-color': isWhite}"
>
<use xlink:href="#iconzhongyingwen" />
</svg>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-for="item in languages"
:key="item.value"
:disabled="language===item.value"
>
<span @click="handleSetLanguage(item.value)">{{ item.name }}</span>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<script lang="ts">
import { useStore } from '@/store'
import { computed, defineComponent, reactive, toRefs } from 'vue'
import { AppActionTypes } from '@/store/modules/app/action-types'
import { useI18n } from 'vue-i18n'
import { ElMessage } from 'element-plus'
type Language = {
name: string
value: string
}
export default defineComponent({
props: {
isWhite: {
type: Boolean,
default: false
}
},
setup() {
const store = useStore()
const { locale } = useI18n()
const state = reactive({
languages: [{ name: '中文', value: 'zh-cn' }] as Array<Language>,
handleSetLanguage: (lang: string) => {
locale.value = lang
store.dispatch(AppActionTypes.ACTION_SET_LANGUAGE, lang)
ElMessage({
message: 'Switch Language Success',
type: 'success'
})
}
})
const language = computed(() => {
return store.state.app.language
})
return {
...toRefs(state),
language
}
}
})
</script>
<style lang="scss" scoped>
.svg-color{
fill: white;
}
</style>

View File

@ -0,0 +1,443 @@
/* eslint-disable vue/no-mutating-props */
<template>
<div
:class="computedClasses()"
class="material-input__component"
>
<div :class="{iconClass: icon}">
<i
v-if="icon"
:class="['el-icon-' + icon]"
class="el-input__icon material-input__icon"
/>
<input
v-if="type === 'email'"
:id="id"
v-model="valueCopy"
type="email"
class="material-input"
:name="name"
:placeholder="filledPlaceholder"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<input
v-if="type === 'url'"
:id="id"
v-model="valueCopy"
type="url"
class="material-input"
:name="name"
:placeholder="filledPlaceholder"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<input
v-if="type === 'number'"
:id="id"
v-model="valueCopy"
type="number"
class="material-input"
:name="name"
:placeholder="filledPlaceholder"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:max="max"
:min="min"
:step="step"
:minlength="minlength"
:maxlength="maxlength"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<input
v-if="type === 'password'"
:id="id"
v-model="valueCopy"
type="password"
class="material-input"
:name="name"
:placeholder="filledPlaceholder"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:max="max"
:min="min"
:step="step"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<input
v-if="type === 'tel'"
:id="id"
v-model="valueCopy"
type="tel"
class="material-input"
:name="name"
:placeholder="filledPlaceholder"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<input
v-if="type === 'text'"
:id="id"
:value="title"
type="text"
class="material-input"
:name="name"
:placeholder="filledPlaceholder()"
:readonly="readonly"
:disabled="disabled"
:autocomplete="autoComplete"
:minlength="minlength"
:maxlength="maxlength"
:required="required"
@focus="handleFocus"
@blur="handleBlur"
@input="handleInput"
>
<span class="material-input-bar" />
<label class="material-label">
<slot />
</label>
</div>
</div>
</template>
<script lang="ts">
// Source: https://github.com/wemake-services/vue-material-input/blob/master/src/components/MaterialInput.vue
import { defineComponent, getCurrentInstance, reactive, toRefs } from 'vue'
export default defineComponent({
props: {
title: {
type: String,
required: true
},
type: {
type: String,
default: 'text'
},
id: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
},
name: {
type: String,
default: ''
},
placeholder: {
type: String,
default: ''
},
readonly: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
},
required: {
type: Boolean,
default: true
},
autoComplete: {
type: String,
default: 'off'
},
min: {
type: Number,
default: 0
},
max: {
type: Number,
default: 10000
},
step: {
type: Number,
default: 1
},
minlength: {
type: Number,
default: 0
},
maxlength: {
type: Number,
default: 20
},
validateEvent: {
type: Boolean,
default: true
}
},
emits: ['inputVal', 'el.form.change', 'focus', 'blur'],
setup(props, contex) {
console.log(props.title, 'propspropspropspropsprops')
const state = reactive({
focus: false
})
const { ctx } = getCurrentInstance() as any
// watch(() => state.valueCopy, (value) => {
// state.valueCopy = value
// })
const computedClasses = () => {
return {
'material--active': state.focus,
'material--disabled': props.disabled
// 'material--raised': Boolean(state.focus || state.valueCopy)
}
}
const filledPlaceholder = () => {
if (state.focus) {
return props.placeholder
}
return ''
}
const handleInput = (event: KeyboardEvent) => {
const value = (event.target as HTMLInputElement).value
contex.emit('inputVal', value)
if (ctx.$parent.$options.name === 'ElFormItem') {
if (props.validateEvent) {
// See https://github.com/ElemeFE/element/blob/dev/packages/form/src/form-item.vue#L293
// eslint-disable-next-line vue/custom-event-name-casing
contex.emit('el.form.change', [value])
}
}
}
const handleFocus = (event: FocusEvent) => {
state.focus = true
contex.emit('focus', event)
}
const handleBlur = (event: FocusEvent) => {
state.focus = false
contex.emit('blur', event)
if (ctx.$parent.$options.name === 'ElFormItem') {
if (props.validateEvent) {
// See https://github.com/ElemeFE/element/blob/dev/packages/form/src/form-item.vue#L292
// eslint-disable-next-line vue/custom-event-name-casing
// ctx.$parent.$emit('el.form.blur', [state.valueCopy])
}
}
}
return {
...toRefs(state),
computedClasses,
filledPlaceholder,
handleInput,
handleFocus,
handleBlur
}
}
})
</script>
<style lang="scss" scoped>
// Fonts:
$font-size-base: 16px;
$font-size-small: 14px;
$font-size-smallest: 12px;
$font-weight-normal: normal;
$font-weight-bold: bold;
// Utils
$spacer: 10px;
$transition: 0.2s ease all;
$index-has-icon: 30px;
// Theme:
$color-white: white;
$color-grey: #9E9E9E;
$color-grey-light: #E0E0E0;
$color-blue: #2196F3;
$color-red: #F44336;
$color-black: black;
// Base clases:
%base-bar-pseudo {
content: '';
height: 1px;
width: 0;
bottom: 0;
position: absolute;
transition: $transition;
}
// Mixins:
@mixin slided-top() {
top: - ($font-size-base + $spacer);
left: 0;
font-size: $font-size-base;
font-weight: $font-weight-bold;
}
// Component:
.material-input__component {
margin-top: 45px;
position: relative;
* {
box-sizing: border-box;
}
.iconClass {
.material-input__icon {
position: absolute;
left: 0;
line-height: $font-size-base;
color: $color-blue;
top: $spacer;
width: $index-has-icon;
height: $font-size-base;
font-size: $font-size-base;
font-weight: $font-weight-normal;
pointer-events: none;
}
.material-label {
left: $index-has-icon;
}
.material-input {
text-indent: $index-has-icon;
}
}
.material-input {
font-size: $font-size-base;
padding: $spacer $spacer $spacer $spacer / 2;
display: block;
width: 100%;
border: none;
border-radius: 0;
&:focus {
outline: none;
border: none;
border-bottom: 1px solid transparent; // fixes the height issue
}
}
.material-label {
font-size: $font-size-small;
font-weight: $font-weight-normal;
position: absolute;
pointer-events: none;
left: 0;
top: 0;
transition: $transition;
}
.material-input-bar {
position: relative;
display: block;
width: 100%;
&:before {
@extend %base-bar-pseudo;
left: 50%;
}
&:after {
@extend %base-bar-pseudo;
right: 50%;
}
}
// Disabled state:
&.material--disabled {
.material-input {
border-bottom-style: dashed;
}
}
// Raised state:
&.material--raised {
.material-label {
@include slided-top();
}
}
// Active state:
&.material--active {
.material-input-bar {
&:before,
&:after {
width: 50%;
}
}
}
// Errors:
.material-errors {
position: relative;
overflow: hidden;
.material-error {
font-size: $font-size-smallest;
line-height: $font-size-smallest + 2px;
overflow: hidden;
margin-top: 0;
padding-top: $spacer / 2;
padding-right: $spacer / 2;
padding-left: 0;
}
}
}
.material-input__component {
background: $color-white;
.material-input {
background: none;
color: $color-black;
border-bottom: 1px solid $color-grey-light;
}
.material-label {
color: $color-grey;
}
.material-input-bar {
&:before,
&:after {
background: $color-blue;
}
}
// Active state:
&.material--active {
.material-label {
color: $color-blue;
}
}
}
</style>

View File

@ -0,0 +1,146 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2021-01-18 09:10:23
* @LastEditors: ZY
* @LastEditTime: 2021-01-18 09:34:39
-->
<template>
<div
:style="{zIndex: zIndex, height: height, width: width}"
class="pan-item"
>
<div class="pan-info">
<div class="pan-info-roles-container">
<slot />
</div>
</div>
<div
:style="{backgroundImage: `url(${image})`}"
class="pan-thumb"
/>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'PanThumb',
props: {
image: {
type: String,
required: true
},
width: {
type: String,
required: true,
default: '150px'
},
height: {
type: String,
required: true,
default: '150px'
},
zIndex: {
type: Number,
default: 1
}
}
})
</script>
<style lang="scss" scoped>
.pan-item {
width: 200px;
height: 200px;
border-radius: 50%;
display: inline-block;
position: relative;
cursor: default;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
&:hover .pan-thumb {
transform: rotate(-110deg);
}
&:hover .pan-info p a {
opacity: 1;
transform: translateX(0px) rotate(0deg);
}
}
.pan-info {
position: absolute;
width: inherit;
height: inherit;
border-radius: 50%;
overflow: hidden;
box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);
.pan-info-roles-container {
padding: 20px;
text-align: center;
}
h3 {
color: #fff;
text-transform: uppercase;
position: relative;
letter-spacing: 2px;
font-size: 18px;
margin: 0 60px;
padding: 22px 0 0 0;
height: 85px;
font-family: 'Open Sans', Arial, sans-serif;
text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);
}
p {
color: #fff;
padding: 10px 5px;
font-style: italic;
margin: 0 30px;
font-size: 12px;
border-top: 1px solid rgba(255, 255, 255, 0.5);
a {
display: block;
color: #333;
width: 80px;
height: 80px;
background: rgba(255, 255, 255, 0.3);
border-radius: 50%;
color: #fff;
font-style: normal;
font-weight: 700;
text-transform: uppercase;
font-size: 9px;
letter-spacing: 1px;
padding-top: 24px;
margin: 7px auto 0;
font-family: 'Open Sans', Arial, sans-serif;
opacity: 0;
transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;
transform: translateX(60px) rotate(90deg);
&:hover {
background: rgba(255, 255, 255, 0.5);
}
}
}
}
.pan-thumb {
width: 100%;
height: 100%;
background-position: center center;
background-size: cover;
border-radius: 50%;
overflow: hidden;
position: absolute;
transform-origin: 95% 40%;
transition: all 0.3s ease-in-out;
}
</style>

View File

@ -0,0 +1,73 @@
<!--
* @Description:
* @Author: ZY
* @Date: 2020-12-24 10:44:01
* @LastEditors: ZY
* @LastEditTime: 2021-03-25 08:27:00
-->
<template>
<div
class="handle-button"
:style="{'top': buttonTop+'px','backgroundColor': theme}"
@click="show= true"
>
<i class="el-icon-setting" />
</div>
<el-drawer
title="设置"
v-model="show"
size="300px"
:direction="direction"
destroy-on-close
>
<slot />
</el-drawer>
</template>
<script lang="ts">
import { useStore } from '@/store'
import { computed, defineComponent, ref } from 'vue'
export default defineComponent({
props: {
buttonTop: {
type: Number,
default: 250
}
},
setup() {
const show = ref(false)
const store = useStore()
const theme = computed(() => {
return store.state.settings.theme
})
return {
show,
theme
}
}
})
</script>
<style lang="scss" scoped>
.handle-button {
width: 48px;
height: 48px;
position: absolute;
right: 0px;
text-align: center;
font-size: 24px;
border-radius: 6px 0 0 6px !important;
z-index: 99;
cursor: pointer;
pointer-events: auto;
color: #fff;
line-height: 48px;
i {
font-size: 24px;
line-height: 48px;
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More