project init

This commit is contained in:
zhl 2021-10-18 14:20:48 +08:00
commit 00753149e4
304 changed files with 31903 additions and 0 deletions

3
.eslintignore Normal file
View File

@ -0,0 +1,3 @@
dist/*.js
src/assets
tests/unit/coverage

61
.eslintrc.js Normal file
View File

@ -0,0 +1,61 @@
module.exports = {
root: true,
env: {
node: true
},
extends: [
'plugin:vue/essential',
'@vue/standard',
'@vue/typescript/recommended'
],
parserOptions: {
ecmaVersion: 2020
},
rules: {
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/member-delimiter-style': ['error',
{
multiline: {
delimiter: 'none'
},
singleline: {
delimiter: 'comma'
}
}],
'@typescript-eslint/no-this-alias': [
'error',
{
allowDestructuring: true, // Allow `const { props, state } = this`; false by default
allowedNames: ['self'] // Allow `const vm= this`; `[]` by default
}
],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'space-before-function-paren': ['error', 'never'],
'vue/array-bracket-spacing': 'error',
'vue/arrow-spacing': 'error',
'vue/block-spacing': 'error',
'vue/brace-style': 'error',
'vue/camelcase': 'error',
'vue/comma-dangle': 'error',
'vue/component-name-in-template-casing': ['error', 'kebab-case'],
'vue/eqeqeq': 'error',
'vue/key-spacing': 'error',
'vue/match-component-file-name': 'error',
'vue/object-curly-spacing': 'error'
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
}
]
}

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
node_modules
dist
app/node_modules
.DS_Store
app/dist

57
README.md Normal file
View File

@ -0,0 +1,57 @@
## 权限控制
前端页面的权限控制有2种方式(role和permission), 在三个地方进行控制:
1. 左边菜单的显示隐藏
在路由表各项的meta中添加 roles: ['admin', 'editor'] 或 permissions: ['app:read']
2. 页面内各种按钮和弹窗
使用v-role和v-permission控制,
```vue
<!-- 支持匹配, 比如: app:*, *:read--->
<span
v-permission="['app:read']"
class="permission-alert"
>
Only
<el-tag
class="permission-tag"
size="small"
>app:read</el-tag> can see this
</span>
<el-tag
v-role="['admin']"
class="permission-sourceCode"
type="info"
>
v-role="['admin']"
</el-tag>
```
也可使用@utils/permission.ts中的checkRole和checkPermission方法
```vue
<el-tab-pane
v-if="checkRole(['admin'])"
label="Admin"
>
Admin can see this
<el-tag
class="permission-sourceCode"
type="info"
>
v-if="checkRole(['admin'])"
</el-tag>
</el-tab-pane>
```
3. 逻辑代码中判断
使用@utils/permission.ts中的checkRole和checkPermission方法

BIN
app/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

130
app/main.js Normal file
View File

@ -0,0 +1,130 @@
const electron = require('electron')
// Module to control application life.
const { app, Menu, dialog } = electron
// Module to create native browser window.
const { BrowserWindow } = electron
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win
const template = [
{
label: '地图',
submenu: [
{
label: '加载',
accelerator: 'CmdOrCtrl+L',
click() {
console.log('load map')
dialog.showOpenDialog({
properties: ['openDirectory']
}).then(result => {
console.log(result) // 输出结果
if (result.filePaths.length > 0) {
// ipcRenderer.send(result.filePaths);
win.webContents.send('load', result.filePaths)
}
})
}
},
{
label: '保存',
accelerator: 'CmdOrCtrl+S',
click() {
console.log('save map')
win.webContents.send('save', '')
}
}
]
},
{
label: '选项',
submenu: [
{
label: '重新加载',
role: 'reload'
},
{
label: '强制刷新',
role: 'forceReload'
},
{
label: '全屏切换',
role: 'togglefullscreen'
},
{
label: '开发者工具',
role: 'toggleDevTools'
}
]
}
]
function createWindow() {
// Create the browser window.
win = new BrowserWindow({
width: 1290,
height: 940,
webPreferences: {
nodeIntegration: true,
webSecurity: false,
enableRemoteModule: true
}
})
// and load the index.html of the app.
// http://h5tools.client.jy/index.html
// win.loadURL('http://localhost:8080/#/index')
win.loadURL('https://test.kingsome.cn/html/cfgtool/index.html')
// win.loadFile('./index.html')
// Open the DevTools.
// win.webContents.openDevTools();
win.webContents.on('did-finish-load', () => {
win.webContents.send('ping', 'whoooooooh!')
})
// Emitted when the window is closed.
win.on('closed', () => {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
win = null
})
if (process.platform === 'darwin') {
template.unshift({
label: app.getName(),
submenu: [
{
label: 'Quit',
accelerator: 'CmdOrCtrl+Q',
click() {
app.quit()
}
}
]
})
}
const appMenu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(appMenu)
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (win === null) {
createWindow()
}
})

77
app/package.json Normal file
View File

@ -0,0 +1,77 @@
{
"name": "cfgtools",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"dev": "electron --inspect=5858 --enable-logging .",
"start": "electron .",
"postinstall": "electron-builder install-app-deps",
"build:linux": "electron-builder -l",
"build:win": "electron-builder -w",
"build:mac": "electron-builder -m"
},
"author": "zhl",
"license": "ISC",
"devDependencies": {
"electron": "^8.2.4",
"electron-builder": "^22.6.0"
},
"build": {
"appId": "map editor",
"win": {
"icon": "logo.png",
"target": [
"nsis"
],
"asarUnpack": [
"**/node_modules/ftp/**/*",
"**/node_modules/xlsx/**/*",
"**/node_modules/cos-nodejs-sdk-v5/**/*"
],
"extraResources": [
{
"from": "src",
"to": "app.asar.unpacked/src"
}
]
},
"nsis": {
"allowToChangeInstallationDirectory": true,
"oneClick": false,
"menuCategory": true,
"allowElevation": false
},
"linux": {
"icon": "logo.png",
"category": "Utility",
"target": [
"AppImage"
]
},
"mac": {
"icon": "logo.png",
"type": "development",
"category": "public.app-category.developer-tools",
"target": [
"dmg"
],
"asarUnpack": [
"**/node_modules/ftp/**/*",
"**/node_modules/xlsx/**/*",
"**/node_modules/cos-nodejs-sdk-v5/**/*"
],
"extraResources": [
{
"from": "src",
"to": "app.asar.unpacked/src"
}
]
}
},
"dependencies": {
"cos-nodejs-sdk-v5": "^2.10.5",
"ftp": "^0.3.10",
"xlsx": "^0.17.3"
}
}

5
app/preload.js Normal file
View File

@ -0,0 +1,5 @@
const { contextBridge } = require('electron')
contextBridge.exposeInMainWorld('api', {
deleteFile: f => require('fs').unlink(f)
})

137
app/src/cdnTools.js Normal file
View File

@ -0,0 +1,137 @@
const stringUtil = require('./stringUtil')
const COS = require('cos-nodejs-sdk-v5')
const request = require('request')
const generateNonce = function() {
return stringUtil.randomNum(10000, 99999)
}
const SecretId = 'AKIDvmW8mNvCQVt9GEnd3JNH5lHKI8oJnv46'
const SecretKey = 'd6QZhgT7alnhR3VghWAg3FF4c2JMG1c2'
const cosCDN = new COS({
SecretId,
SecretKey
})
const generateSign = function(method, data) {
let str = `${method}cdn.api.qcloud.com/v2/index.php?`
let i = 0
for (const key in data) {
if ({}.hasOwnProperty.call(data, key)) {
if (i++ > 0) str += '&'
str += `${key}=${data[key]}`
}
}
return stringUtil.sha1keyBase64(str, SecretKey)
}
const cdnTools = {
refreshDir(url) {
const now = Math.round(new Date() / 1000)
const data = {
Action: 'RefreshCdnDir',
Nonce: generateNonce(),
SecretId: SecretId,
Timestamp: now,
'dirs.0': url
}
data.Signature = generateSign('POST', data)
return new Promise((resolve, reject) => {
const link = 'https://cdn.api.qcloud.com/v2/index.php'
const options = {
method: 'POST',
url: link,
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/x-www-form-urlencoded'
},
form: data
}
request(options, (err, response, body) => {
if (err) {
return reject(err)
}
resolve(JSON.parse(body))
})
})
},
refreshOneUrl(url) {
const now = Math.round(new Date() / 1000)
const data = {
Action: 'RefreshCdnUrl',
Nonce: generateNonce(),
SecretId: SecretId,
Timestamp: now,
'urls.0': url
}
data.Signature = generateSign('POST', data)
return new Promise((resolve, reject) => {
const link = 'https://cdn.api.qcloud.com/v2/index.php'
const options = {
method: 'POST',
url: link,
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/x-www-form-urlencoded'
},
form: data
}
request(options, (err, response, body) => {
if (err) {
return reject(err)
}
resolve(JSON.parse(body))
})
})
},
uploadToCDN(fileName, path) {
return new Promise(function(resolve, reject) {
cosCDN.sliceUploadFile({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Key: fileName,
FilePath: path
}, function(err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
},
deleteFromCDN(files) {
return new Promise(function(resolve, reject) {
cosCDN.deleteMultipleObject({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Objects: files
}, function(err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
},
listCDN(subPath) {
return new Promise(function(resolve, reject) {
cosCDN.getBucket({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Prefix: subPath
}, function(err, data) {
// console.log(err || data.Contents)
if (err) {
reject(err)
} else {
resolve(data.Contents)
}
})
})
}
}
module.exports = cdnTools

28
app/src/ftpTools.js Normal file
View File

@ -0,0 +1,28 @@
var Client = require('ftp')
module.exports = {
init() {
if (!this._client) {
this._client = new Client()
this._client.on('ready', function() {
console.log('[FTP client] ready')
})
this._client.connect({
host: '140.143.198.31',
user: 'dalmatian',
password: 'kjlsahjds772SHJ'
})
}
},
upload(filePath, destPath) {
return new Promise((resolve, reject) => {
this._client.put(filePath, destPath, function(err) {
if (err) {
return reject && reject(err)
}
resolve()
})
})
}
}

10
app/src/stringUtil.js Normal file
View File

@ -0,0 +1,10 @@
const crypto = require('crypto')
module.exports = {
sha1keyBase64(str, key) {
return crypto.createHmac('sha1', key).update(str).digest('base64')
},
randomNum(minNum, maxNum) {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10)
}
}

2378
app/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

5
babel.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/app'
]
}

3
cypress.json Normal file
View File

@ -0,0 +1,3 @@
{
"pluginsFile": "tests/e2e/plugins/index.js"
}

6
jest.config.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',
transform: {
'^.+\\.vue$': 'vue-jest'
}
}

82
package.json Normal file
View File

@ -0,0 +1,82 @@
{
"name": "vue-typescript-admin-template",
"version": "1.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"svg": "vsvg -s ./src/icons/svg -t ./src/icons/components --ext ts --es6",
"test:unit": "jest --clearCache && vue-cli-service test:unit"
},
"dependencies": {
"@tinymce/tinymce-vue": "^3.2.6",
"axios": "^0.21.0",
"clipboard": "^2.0.6",
"element-ui": "^2.14.0",
"file-saver": "^2.0.5",
"fuse.js": "^6.4.3",
"js-cookie": "^2.2.1",
"jszip": "^3.5.0",
"lodash": "^4.17.20",
"normalize.css": "^8.0.1",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.0",
"register-service-worker": "^1.7.1",
"screenfull": "^5.0.2",
"tinymce": "^5.5.1",
"vue": "^2.6.12",
"vue-class-component": "^7.2.6",
"vue-i18n": "^8.22.4",
"vue-property-decorator": "^9.0.2",
"vue-router": "^3.4.8",
"vue-svgicon": "^3.2.9",
"vuex": "^3.5.1",
"vuex-module-decorators": "^1.0.1",
"xlsx": "^0.16.8"
},
"devDependencies": {
"@types/clipboard": "^2.0.1",
"@types/file-saver": "^2.0.1",
"@types/jest": "^26.0.15",
"@types/js-cookie": "^2.2.6",
"@types/lodash": "^4.14.168",
"@types/node": "^14.14.6",
"@types/nprogress": "^0.2.0",
"@types/tinymce": "^4.6.0",
"@types/webpack-env": "^1.15.3",
"@typescript-eslint/eslint-plugin": "^4.6.0",
"@typescript-eslint/parser": "^4.6.0",
"@vue/cli-plugin-babel": "^4.5.8",
"@vue/cli-plugin-eslint": "^4.5.8",
"@vue/cli-plugin-pwa": "^4.5.8",
"@vue/cli-plugin-router": "^4.5.8",
"@vue/cli-plugin-typescript": "^4.5.8",
"@vue/cli-plugin-unit-jest": "^4.5.8",
"@vue/cli-plugin-vuex": "^4.5.8",
"@vue/cli-service": "^4.5.8",
"@vue/eslint-config-standard": "^5.1.2",
"@vue/eslint-config-typescript": "^7.0.0",
"@vue/test-utils": "^1.1.1",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0",
"eslint": "^7.12.1",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.2",
"eslint-plugin-vue": "^7.1.0",
"fibers": "^5.0.0",
"jest": "^26.6.1",
"sass": "^1.28.0",
"sass-loader": "^10.0.4",
"style-resources-loader": "^1.3.3",
"ts-jest": "^26.4.3",
"typescript": "^4.0.5",
"vue-cli-plugin-element": "^1.0.1",
"vue-cli-plugin-style-resources-loader": "^0.1.4",
"vue-template-compiler": "^2.6.12",
"webpack": "^5.3.2"
}
}

5
postcss.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
plugins: {
autoprefixer: {}
}
}

229
public/elib/index.js Normal file
View File

@ -0,0 +1,229 @@
const electron = require('electron')
const COS = require('cos-nodejs-sdk-v5')
const request = require('request')
const crypto = require('crypto')
const sha1keyBase64 = function(str, key) {
return crypto.createHmac('sha1', key).update(str).digest('base64')
}
const randomNum = function(minNum, maxNum) {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10)
}
const generateNonce = function() {
return randomNum(10000, 99999)
}
const SecretId = 'AKIDvmW8mNvCQVt9GEnd3JNH5lHKI8oJnv46'
const SecretKey = 'd6QZhgT7alnhR3VghWAg3FF4c2JMG1c2'
const cosCDN = new COS({
SecretId,
SecretKey
})
const generateSign = function(method, data) {
let str = `${method}cdn.api.qcloud.com/v2/index.php?`
let i = 0
for (const key in data) {
if ({}.hasOwnProperty.call(data, key)) {
if (i++ > 0) str += '&'
str += `${key}=${data[key]}`
}
}
return sha1keyBase64(str, SecretKey)
}
const cdnTools = {
refreshDir(url) {
const now = Math.round(new Date() / 1000)
const data = {
Action: 'RefreshCdnDir',
Nonce: generateNonce(),
SecretId: SecretId,
Timestamp: now,
'dirs.0': url
}
data.Signature = generateSign('POST', data)
return new Promise((resolve, reject) => {
const link = 'https://cdn.api.qcloud.com/v2/index.php'
const options = {
method: 'POST',
url: link,
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/x-www-form-urlencoded'
},
form: data
}
request(options, (err, response, body) => {
if (err) {
return reject(err)
}
resolve(JSON.parse(body))
})
})
},
refreshOneUrl(url) {
const now = Math.round(new Date() / 1000)
const data = {
Action: 'RefreshCdnUrl',
Nonce: generateNonce(),
SecretId: SecretId,
Timestamp: now,
'urls.0': url
}
data.Signature = generateSign('POST', data)
return new Promise((resolve, reject) => {
const link = 'https://cdn.api.qcloud.com/v2/index.php'
const options = {
method: 'POST',
url: link,
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/x-www-form-urlencoded'
},
form: data
}
request(options, (err, response, body) => {
if (err) {
return reject(err)
}
resolve(JSON.parse(body))
})
})
},
uploadToCDN(fileName, path) {
return new Promise(function(resolve, reject) {
cosCDN.sliceUploadFile({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Key: fileName,
FilePath: path
}, function(err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
},
deleteFromCDN(files) {
return new Promise(function(resolve, reject) {
cosCDN.deleteMultipleObject({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Objects: files
}, function(err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
},
listCDN(subPath) {
return new Promise(function(resolve, reject) {
cosCDN.getBucket({
Bucket: 'client-1256832210',
Region: 'ap-beijing',
Prefix: subPath
}, function(err, data) {
// console.log(err || data.Contents)
if (err) {
reject(err)
} else {
resolve(data.Contents)
}
})
})
}
}
const main = function() {
electron.ipcRenderer.on('ping', (event, message) => {
console.log(message) // Prints 'whoooooooh!'
})
electron.ipcRenderer.on('save', (event, message) => {
console.log('save')
const eventMap = new CustomEvent('saveMap', {
bubbles: true,
detail: {}
})
window.dispatchEvent(eventMap)
})
electron.ipcRenderer.on('load', (event, message) => {
console.log('load')
console.log(message)
const eventMap = new CustomEvent('loadMap', {
bubbles: true,
detail: { path: message[0] }
})
window.dispatchEvent(eventMap)
})
window.refreshCDN = function(gameId) {
return cdnTools.refreshDir(`${gameId}/`)
}
window.listCDN = function(subPath) {
return cdnTools.listCDN(subPath)
}
window.deleteFromCDN = function(files) {
return cdnTools.deleteFromCDN(files)
}
window.uploadFile = function(filePath, showPath) {
return cdnTools.uploadToCDN(showPath, filePath)
.then((data) => {
console.log(data)
const urlCdn = `https://resource.kingsome.cn/${data.Key}`
return cdnTools.refreshOneUrl(urlCdn)
})
// electron.remote.dialog.showOpenDialog({
// title: '选择配表所在文件夹',
// properties: ['openDirectory']
// }).then(result => {
// console.log(result)
// const eventMap = new CustomEvent('loadMap', {
// bubbles: true,
// detail: { path: result.filePaths[0] }
// })
// window.dispatchEvent(eventMap)
// }).catch(err => {
// console.log(err)
// })
}
window.upload2FTP = function(filePath, showPath) {
// return ftpTools.upload(filePath, showPath)
}
window.saveMap = function() {
const eventMap = new CustomEvent('saveMap', {
bubbles: true,
detail: {}
})
window.dispatchEvent(eventMap)
}
window.selectGame = function() {
electron.remote.dialog.showOpenDialog({
title: '选择配表所在文件夹',
properties: ['openDirectory']
}).then(result => {
console.log(result)
if (result.canceled) {
return
}
const eventMap = new CustomEvent('setGamePath', {
bubbles: true,
detail: { path: result.filePaths[0] }
})
window.dispatchEvent(eventMap)
}).catch(err => {
console.log(err)
})
}
// ftpTools.init()
}
window.onload = function() {
main()
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,112 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="520.000000pt" height="520.000000pt" viewBox="0 0 520.000000 520.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,520.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1897 4883 c-3 -3 -39 -7 -79 -9 -66 -4 -125 -10 -138 -14 -3 -1 -13
-2 -22 -1 -10 1 -18 -3 -18 -10 0 -9 -3 -9 -14 0 -11 9 -18 8 -30 -5 -10 -9
-20 -14 -23 -11 -3 4 -15 1 -27 -5 -11 -7 -24 -13 -28 -14 -5 -1 -9 -2 -10 -4
-2 -1 -10 -3 -19 -5 -10 -1 -40 -14 -67 -28 -28 -14 -53 -23 -56 -20 -3 3 -8
-2 -12 -11 -3 -9 -10 -14 -14 -11 -4 3 -13 -2 -20 -10 -7 -8 -16 -12 -21 -9
-5 3 -9 0 -9 -6 0 -6 -4 -8 -10 -5 -5 3 -10 2 -10 -3 0 -5 -16 -17 -35 -28
-19 -10 -35 -23 -35 -28 0 -5 -3 -7 -6 -3 -6 6 -36 -16 -62 -45 -9 -9 -19 -15
-24 -12 -4 3 -8 1 -8 -5 0 -5 -9 -13 -20 -16 -11 -4 -18 -10 -15 -15 3 -4 -10
-17 -28 -29 -17 -11 -27 -21 -22 -21 6 0 -3 -9 -20 -20 -16 -11 -25 -20 -20
-20 6 -1 -1 -7 -15 -15 -14 -8 -21 -14 -16 -15 5 0 -3 -11 -18 -25 -14 -13
-26 -29 -26 -35 0 -6 -4 -8 -10 -5 -5 3 -10 3 -10 -2 0 -4 -13 -22 -28 -39
-60 -70 -72 -84 -72 -90 0 -4 -11 -17 -26 -30 -14 -13 -21 -24 -17 -24 4 0 3
-4 -2 -8 -18 -12 -66 -82 -58 -82 4 0 0 -5 -9 -11 -10 -5 -18 -14 -18 -20 0
-9 -8 -21 -38 -54 -7 -8 -10 -15 -6 -15 3 0 1 -6 -5 -13 -6 -8 -7 -18 -3 -23
4 -5 3 -6 -2 -2 -10 9 -46 -44 -46 -67 0 -8 -6 -18 -13 -22 -7 -4 -19 -23 -26
-40 -8 -18 -18 -33 -23 -33 -5 0 -7 -4 -3 -9 3 -5 -2 -17 -11 -25 -8 -9 -12
-16 -9 -16 4 0 0 -11 -9 -25 -9 -14 -13 -25 -9 -25 5 0 3 -4 -2 -8 -6 -4 -25
-41 -44 -82 -18 -41 -37 -84 -41 -95 -33 -73 -59 -136 -60 -143 -3 -28 -14
-52 -23 -52 -6 0 -8 -3 -4 -6 3 -3 -4 -31 -15 -62 -11 -32 -21 -61 -22 -67 -1
-5 -4 -14 -8 -20 -3 -5 -9 -26 -14 -45 -11 -49 -11 -49 -14 -55 -1 -3 -4 -9
-5 -15 -1 -5 -4 -12 -5 -15 -1 -3 -4 -9 -5 -15 -1 -5 -3 -11 -5 -12 -1 -2 -3
-12 -5 -23 -4 -23 -10 -46 -24 -93 -5 -18 -10 -35 -10 -37 -1 -3 -1 -6 -2 -7
0 -2 -2 -19 -5 -37 -2 -19 -10 -39 -17 -43 -7 -4 -8 -8 -1 -8 7 0 5 -23 -7
-67 -9 -38 -19 -90 -23 -118 -3 -27 -8 -68 -11 -90 -3 -22 -7 -53 -10 -70 -27
-163 -27 -652 0 -813 3 -17 7 -46 10 -62 11 -66 17 -93 29 -134 7 -23 12 -50
10 -59 -1 -9 3 -17 9 -17 5 0 7 -3 4 -7 -4 -3 -2 -12 3 -19 6 -6 10 -16 9 -20
-1 -5 1 -18 5 -29 31 -81 36 -98 32 -103 -3 -2 3 -17 14 -32 11 -15 17 -30 13
-34 -3 -3 0 -6 7 -6 7 0 10 -3 7 -6 -3 -4 -1 -16 5 -28 7 -11 13 -23 13 -26 0
-3 7 -16 15 -30 8 -14 15 -27 15 -30 4 -18 30 -60 37 -60 4 0 7 -3 6 -7 -3 -9
62 -106 74 -111 4 -2 8 -9 8 -16 0 -6 9 -18 20 -26 11 -8 20 -20 20 -27 0 -7
7 -13 15 -13 8 0 15 -4 15 -9 0 -13 58 -70 64 -63 3 3 6 -2 6 -11 0 -10 7 -17
15 -17 8 0 15 -4 15 -10 0 -5 4 -10 10 -10 5 0 23 -14 40 -31 16 -18 30 -28
30 -23 0 5 5 1 11 -8 5 -10 17 -18 24 -18 8 0 15 -4 15 -8 0 -5 16 -14 35 -22
19 -8 35 -17 35 -22 0 -4 6 -8 13 -9 6 0 34 -11 62 -24 27 -13 53 -21 57 -19
5 3 8 1 8 -3 0 -8 77 -35 105 -38 6 0 15 -4 22 -8 6 -4 23 -8 37 -9 14 -1 26
-5 26 -8 0 -6 33 -11 78 -13 12 -1 22 -3 22 -6 0 -4 19 -7 43 -9 55 -3 69 -6
85 -15 6 -5 12 -5 12 0 0 4 14 8 30 8 17 0 30 -2 30 -5 0 -7 96 -3 109 4 5 3
12 0 14 -6 4 -10 6 -9 6 1 1 11 4 11 16 1 8 -7 15 -8 15 -4 0 5 19 10 43 12
57 3 91 7 102 13 6 3 20 4 33 3 12 0 22 2 22 7 0 4 12 6 28 5 15 -2 31 -1 37
2 5 4 28 8 50 9 21 2 42 7 45 11 3 4 19 8 35 10 55 4 82 9 92 15 5 3 23 9 39
12 38 8 58 13 62 15 2 3 6 4 52 14 19 4 44 11 55 16 21 9 73 22 77 18 2 -1 14
5 28 12 14 8 30 15 35 16 6 2 20 5 32 8 11 2 35 12 52 20 17 9 33 16 36 16 19
1 199 74 207 85 4 5 8 6 8 2 0 -5 15 1 33 12 19 11 37 18 40 14 4 -3 7 -1 7 5
0 7 3 11 8 10 4 -2 73 30 153 70 80 39 149 72 153 72 4 0 14 7 23 15 8 8 19
13 24 10 5 -4 9 -1 9 5 0 7 6 10 12 8 7 -3 18 0 25 6 25 22 38 31 48 32 25 2
74 27 69 35 -3 5 -2 8 3 7 11 -3 56 12 72 25 7 6 20 12 29 13 8 2 18 6 21 11
11 15 45 38 37 26 -4 -7 -3 -13 2 -13 6 0 12 7 16 15 3 8 12 15 20 15 8 0 17
6 19 13 8 18 8 2 10 -373 l2 -345 88 -1 87 -1 0 126 c1 69 1 255 1 413 l-1
287 40 17 c21 10 37 21 34 26 -5 8 10 12 35 9 7 -2 10 2 6 8 -5 10 7 15 28 12
4 0 7 3 7 9 0 5 16 17 35 26 19 9 35 21 35 26 0 5 4 7 9 4 5 -4 11 -3 13 1 1
5 35 28 73 53 39 25 72 48 73 53 2 4 8 5 13 1 5 -3 12 2 15 10 3 9 10 14 14
11 4 -3 11 2 14 11 3 8 10 12 16 9 5 -3 10 1 10 10 0 9 4 14 9 11 5 -3 20 5
34 18 14 13 28 21 31 19 3 -3 8 2 12 11 3 9 15 16 26 16 10 0 16 5 13 10 -3 6
2 13 11 17 18 7 50 31 86 65 10 10 21 18 24 18 6 0 47 36 106 92 15 14 28 24
28 22 0 -3 48 43 108 103 108 109 252 281 252 302 0 6 4 11 9 11 9 0 32 37 78
130 16 30 31 57 35 58 5 2 8 12 8 21 0 10 3 21 7 24 13 13 45 113 67 208 40
176 22 407 -48 593 -32 85 -91 204 -113 228 -9 10 -13 18 -9 18 4 0 -4 15 -18
33 -15 19 -26 37 -26 40 0 11 -119 168 -179 236 -81 93 -142 151 -216 205 -22
17 -42 33 -45 36 -3 4 -21 15 -40 26 -19 10 -37 22 -40 25 -3 3 -20 14 -37 23
-18 9 -33 21 -33 26 0 6 -6 10 -14 10 -8 0 -21 6 -28 13 -7 7 -28 20 -45 28
-18 7 -33 17 -33 20 0 4 -11 10 -24 13 -14 3 -31 12 -38 19 -16 15 -70 41 -80
39 -5 -1 -8 2 -8 6 0 5 -16 14 -35 22 -19 8 -35 18 -35 24 0 5 -3 6 -7 3 -3
-4 -12 -2 -20 4 -7 6 -13 8 -13 3 0 -5 -4 -4 -8 3 -4 6 -14 13 -22 15 -8 2
-21 9 -28 16 -8 7 -17 10 -22 7 -5 -3 -10 -2 -12 2 -4 10 -80 47 -90 45 -5 -1
-8 3 -8 9 0 6 -7 9 -15 5 -8 -3 -15 -1 -15 4 0 6 -7 10 -15 10 -8 0 -15 5 -15
11 0 5 -5 7 -10 4 -6 -3 -10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6
-13 8 -13 3 0 -5 -4 -3 -9 4 -4 7 -18 14 -29 15 -12 1 -22 5 -22 10 0 4 -4 5
-10 2 -5 -3 -10 -1 -10 4 0 6 -7 11 -15 11 -15 0 -23 3 -81 33 -17 9 -34 14
-38 10 -3 -3 -6 -1 -6 6 0 7 -4 9 -10 6 -5 -3 -10 -2 -10 4 0 6 -7 7 -17 4
-10 -4 -14 -2 -9 5 4 7 -1 10 -14 7 -11 -2 -20 1 -20 6 0 6 -4 7 -10 4 -5 -3
-10 -1 -10 6 0 7 -3 9 -7 6 -3 -4 -12 -2 -20 4 -7 6 -13 8 -13 4 0 -4 -6 -2
-14 4 -8 7 -27 14 -42 17 -16 3 -33 9 -40 15 -6 5 -14 6 -17 2 -4 -3 -7 -2 -7
4 0 5 -7 10 -15 11 -8 1 -22 3 -30 4 -8 1 -15 5 -15 10 0 4 -8 8 -18 8 -10 0
-24 6 -31 13 -11 10 -12 9 -6 -3 7 -12 6 -13 -6 -4 -8 5 -48 21 -89 33 -41 13
-86 28 -100 34 -14 6 -29 9 -34 8 -5 -1 -21 2 -35 8 -14 5 -35 12 -46 17 -11
4 -31 9 -45 11 -14 2 -32 7 -40 10 -8 4 -19 8 -25 9 -5 1 -12 3 -15 4 -3 1
-12 3 -20 5 -8 1 -71 15 -139 30 -68 15 -137 28 -155 30 -17 2 -31 4 -31 5 0
1 -11 3 -25 5 -14 1 -43 5 -65 9 -22 4 -71 9 -110 12 -130 10 -154 12 -163 18
-5 3 -12 3 -15 -1z"/>
<path d="M4526 1543 c-2 -2 -12 -5 -23 -7 -37 -8 -111 -47 -151 -81 -43 -37
-92 -113 -95 -145 -1 -11 -4 -20 -8 -20 -13 0 -1 -156 16 -195 18 -42 108
-135 131 -135 8 0 14 -3 14 -8 0 -8 103 -58 160 -77 3 -1 18 -7 33 -13 16 -7
32 -12 36 -12 5 0 14 -7 21 -15 7 -8 16 -12 21 -9 5 3 9 2 9 -3 0 -4 12 -14
28 -21 32 -14 90 -67 113 -102 18 -28 24 -150 8 -150 -6 0 -8 -4 -5 -8 7 -11
-31 -72 -44 -72 -6 0 -9 -4 -6 -9 3 -5 -17 -18 -46 -30 -54 -23 -191 -30 -203
-11 -3 6 -15 10 -26 10 -10 0 -19 5 -19 10 0 6 -4 10 -10 10 -20 0 -63 56 -80
102 -9 26 -16 66 -15 88 1 22 -1 40 -4 41 -3 0 -43 1 -89 2 -66 2 -82 -1 -83
-13 -1 -8 -2 -22 -3 -30 -1 -8 2 -23 7 -32 5 -12 4 -18 -5 -18 -9 0 -9 -3 0
-12 7 -7 12 -21 12 -33 0 -36 48 -124 88 -162 52 -49 72 -65 72 -57 0 4 8 0
18 -9 10 -10 22 -14 25 -10 4 3 7 2 7 -4 0 -5 6 -10 13 -11 6 -1 28 -5 47 -9
31 -6 200 -9 248 -3 19 2 34 8 103 39 64 30 143 110 155 158 4 13 9 23 13 23
12 0 21 188 10 210 -4 8 -13 30 -19 48 -7 17 -17 32 -23 32 -6 0 -8 2 -5 6 7
7 -72 89 -94 97 -10 3 -18 11 -18 17 0 6 -4 8 -10 5 -5 -3 -10 -3 -10 2 0 4
-15 14 -32 22 -18 8 -36 18 -39 23 -3 5 -16 10 -27 11 -12 1 -22 4 -22 8 0 4
-10 10 -22 14 -31 10 -37 12 -43 15 -3 1 -8 3 -12 5 -47 12 -136 59 -168 87
-32 27 -58 75 -50 88 3 6 3 10 -2 10 -4 0 -8 14 -8 30 -1 17 3 30 8 30 4 0 5
4 2 10 -18 28 60 110 120 125 39 11 125 12 125 3 0 -5 9 -8 20 -8 26 0 86 -54
105 -94 9 -18 16 -48 17 -67 l1 -36 89 0 88 1 0 38 c0 21 -4 38 -8 38 -4 0 -9
11 -10 25 -7 93 -141 235 -221 235 -12 0 -21 4 -21 8 0 7 -197 12 -204 5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

28
public/index.html Normal file
View File

@ -0,0 +1,28 @@
<!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>
if (typeof window.require === 'function') {
// 重命名 Electron 提供的 require
window.nodeRequire = require
//delete window.require;
delete window.exports
delete window.module
}
</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>
<!-- built files will be auto injected -->
<script type="text/javascript" src="elib/index.js">
</script>
</body>
</html>

20
public/manifest.json Normal file
View File

@ -0,0 +1,20 @@
{
"name": "Vue Typescript Admin",
"short_name": "Vue Ts Admin",
"icons": [
{
"src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"display": "standalone",
"background_color": "#fff",
"theme_color": "#4DBA87"
}

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

13
src/App.vue Normal file
View File

@ -0,0 +1,13 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
@Component({
name: 'App'
})
export default class extends Vue {}
</script>

42
src/api/admins.ts Normal file
View File

@ -0,0 +1,42 @@
import request from '@/utils/request'
export const getAdminInfo = (data: any) =>
request({
url: '/admin/info',
method: 'post',
data
})
export const login = (data: any) =>
request({
url: '/admin/login',
method: 'post',
data
})
export const logout = () =>
request({
url: '/admin/logout',
method: 'post'
})
export const saveAdmin = (data: any) =>
request({
url: '/admin/save',
method: 'post',
data
})
export const deleteAdmin = (uid: string) => {
return request({
url: `/admin/${uid}/delete`,
method: 'post'
})
}
export const getUsers = (params: any) =>
request({
url: '/admins',
method: 'get',
params
})

59
src/api/articles.ts Normal file
View File

@ -0,0 +1,59 @@
import request from '@/utils/request'
import { IArticleData } from './types'
export const defaultArticleData: IArticleData = {
id: '',
title: '',
content: '',
summary: '',
source: '',
sourceUrl: '',
displayTime: '',
tags: [],
keywords: [],
sortno: 0,
author: '',
type: '',
attachments: []
}
export const getArticles = (params: any) =>
request({
url: '/articles',
method: 'post',
params
})
export const getArticle = (id: number, params: any) =>
request({
url: `/articles/${id}`,
method: 'get',
params
})
export const createArticle = (data: any) =>
request({
url: '/articles',
method: 'post',
data
})
export const updateArticle = (id: number, data: any) =>
request({
url: `/articles/${id}`,
method: 'put',
data
})
export const deleteArticle = (id: number) =>
request({
url: `/articles/${id}`,
method: 'delete'
})
export const getPageviews = (params: any) =>
request({
url: '/pageviews',
method: 'get',
params
})

28
src/api/roles.ts Normal file
View File

@ -0,0 +1,28 @@
import request from '@/utils/request'
export const getRoles = (params: any) =>
request({
url: '/roles',
method: 'get',
params
})
export const saveRole = (data: any) =>
request({
url: '/roles',
method: 'post',
data
})
export const deleteRole = (id: number) =>
request({
url: `/roles/${id}`,
method: 'delete'
})
export const getRoutes = (params: any) =>
request({
url: '/routes',
method: 'get',
params
})

29
src/api/types.d.ts vendored Normal file
View File

@ -0,0 +1,29 @@
export interface IArticleData {
id: string
title: string
summary: string
content: string
source: string
sourceUrl: string
displayTime: string | number
tags: string[]
keywords: string[]
sortno: number
author: string
type: string
attachments: []
}
export interface IFileData{
name: string
path: string
cdnKey: string
subPath: string
type: string
ext: string
stat: string
hasJson: boolean
cdn: boolean
cdnTime?: string
ftp: boolean
}

28
src/api/users.ts Normal file
View File

@ -0,0 +1,28 @@
import request from '@/utils/request'
export const getUserInfo = (data: any) =>
request({
url: '/user/info',
method: 'post',
data
})
export const login = (data: any) =>
request({
url: '/user/login',
method: 'post',
data
})
export const logout = () =>
request({
url: '/user/logout',
method: 'post'
})
export const getUsers = (params: any) =>
request({
url: '/users',
method: 'get',
params
})

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,106 @@
<template>
<el-breadcrumb
class="app-breadcrumb"
separator="/"
>
<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"
>{{ $t('route.' + item.meta.title) }}</span>
<a
v-else
@click.prevent="handleLink(item)"
>{{ $t('route.' + item.meta.title) }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script lang="ts">
import { compile } from 'path-to-regexp'
import { Component, Vue, Watch } from 'vue-property-decorator'
import { RouteRecord, Route } from 'vue-router'
@Component({
name: 'Breadcrumb'
})
export default class extends Vue {
private breadcrumbs: RouteRecord[] = []
@Watch('$route')
private onRouteChange(route: Route) {
// if you go to the redirect page, do not update the breadcrumbs
if (route.path.startsWith('/redirect/')) {
return
}
this.getBreadcrumb()
}
created() {
this.getBreadcrumb()
}
private getBreadcrumb() {
let matched = this.$route.matched.filter((item) => item.meta && item.meta.title)
const first = matched[0]
if (!this.isDashboard(first)) {
matched = [{ path: '/dashboard', meta: { title: 'dashboard' } } as RouteRecord].concat(matched)
}
this.breadcrumbs = matched.filter((item) => {
return item.meta && item.meta.title && item.meta.breadcrumb !== false
})
}
private isDashboard(route: RouteRecord) {
const name = route && route.name
if (!name) {
return false
}
return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
}
private pathCompile(path: string) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
const toPath = compile(path)
return toPath(params)
}
private handleLink(item: any) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect).catch(err => {
console.warn(err)
})
return
}
this.$router.push(this.pathCompile(path)).catch(err => {
console.warn(err)
})
}
}
</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,105 @@
<template>
<div v-if="errorLogs.length>0">
<el-badge
:is-dot="true"
style="line-height: 25px; margin-top: -5px;"
@click.native="dialogTableVisible=true"
>
<el-button
style="padding: 8px 10px;"
size="small"
type="danger"
>
<svg-icon name="bug" />
</el-button>
</el-badge>
<el-dialog
:visible.sync="dialogTableVisible"
width="80%"
append-to-body
>
<div slot="title">
<span style="padding-right: 10px;">Error Log</span>
<el-button
size="mini"
type="primary"
icon="el-icon-delete"
@click="clearAll"
>
Clear All
</el-button>
</div>
<el-table
:data="errorLogs"
border
>
<el-table-column label="Message">
<template slot-scope="{row}">
<div>
<span class="message-title">Msg:</span>
<el-tag type="danger">
{{ row.err.message }}
</el-tag>
</div>
<br>
<div>
<span
class="message-title"
style="padding-right: 10px;"
>Info: </span>
<el-tag type="warning">
{{ row.vm.$vnode.tag }} error in {{ row.info }}
</el-tag>
</div>
<br>
<div>
<span
class="message-title"
style="padding-right: 16px;"
>Url: </span>
<el-tag type="success">
{{ row.url }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column label="Stack">
<template slot-scope="{row}">
{{ row.err.stack }}
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { ErrorLogModule } from '@/store/modules/error-log'
@Component({
name: 'ErrorLog'
})
export default class extends Vue {
private dialogTableVisible = false
get errorLogs() {
return ErrorLogModule.logs
}
private clearAll() {
this.dialogTableVisible = false
ErrorLogModule.ClearErrorLog()
}
}
</script>
<style lang="scss" scoped>
.message-title {
font-size: 16px;
color: #333;
font-weight: bold;
padding-right: 8px;
}
</style>

View File

@ -0,0 +1,37 @@
<template>
<div
:class="[{'is-active': isActive}]"
@click="toggleClick"
>
<svg-icon
name="hamburger"
width="20"
height="20"
/>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
name: 'Hamburger'
})
export default class extends Vue {
@Prop({ default: false }) private isActive!: boolean
private toggleClick() {
this.$emit('toggle-click')
}
}
</script>
<style lang="scss" scoped>
.svg-icon {
vertical-align: middle;
}
.is-active {
transform: rotate(180deg);
}
</style>

View File

@ -0,0 +1,219 @@
<template>
<div
id="header-search"
:class="{'show': show}"
class="header-search"
>
<svg-icon
class="search-icon"
name="search"
@click.stop="click"
/>
<el-select
ref="headerSearchSelect"
v-model="search"
:remote-method="querySearch"
filterable
default-first-option
remote
placeholder="Search"
class="header-search-select"
@change="change"
>
<el-option
v-for="item in options"
:key="item.path"
:value="item"
:label="item.meta.title.join(' > ')"
/>
</el-select>
</div>
</template>
<script lang="ts">
import path from 'path'
import Fuse from 'fuse.js' // A lightweight fuzzy-search module
import { Component, Vue, Watch } from 'vue-property-decorator'
import { RouteConfig } from 'vue-router'
import { AppModule } from '@/store/modules/app'
import { PermissionModule } from '@/store/modules/permission'
import i18n from '@/lang' // Internationalization
@Component({
name: 'HeaderSearch'
})
export default class extends Vue {
private search = ''
private show = false
private options: RouteConfig[] = []
private searchPool: RouteConfig[] = []
private fuse?: Fuse<RouteConfig>
get routes() {
return PermissionModule.routes
}
get lang() {
return AppModule.language
}
@Watch('lang')
private onLangChange() {
this.searchPool = this.generateRoutes(this.routes)
}
@Watch('routes')
private onRoutesChange() {
this.searchPool = this.generateRoutes(this.routes)
}
@Watch('searchPool')
private onSearchPoolChange(value: RouteConfig[]) {
this.initFuse(value)
}
@Watch('show')
private onShowChange(value: boolean) {
if (value) {
document.body.addEventListener('click', this.close)
} else {
document.body.removeEventListener('click', this.close)
}
}
mounted() {
this.searchPool = this.generateRoutes(this.routes)
}
private click() {
this.show = !this.show
if (this.show) {
this.$refs.headerSearchSelect && (this.$refs.headerSearchSelect as HTMLElement).focus()
}
}
private close() {
this.$refs.headerSearchSelect && (this.$refs.headerSearchSelect as HTMLElement).blur()
this.options = []
this.show = false
}
private change(route: RouteConfig) {
this.$router.push(route.path).catch(err => {
console.warn(err)
})
this.search = ''
this.options = []
this.$nextTick(() => {
this.show = false
})
}
private initFuse(list: RouteConfig[]) {
this.fuse = new Fuse(list, {
shouldSort: true,
threshold: 0.4,
location: 0,
distance: 100,
minMatchCharLength: 1,
keys: [{
name: 'title',
weight: 0.7
}, {
name: 'path',
weight: 0.3
}]
})
}
// Filter out the routes that can be displayed in the sidebar
// And generate the internationalized title
private generateRoutes(routes: RouteConfig[], basePath = '/', prefixTitle: string[] = []) {
let res: RouteConfig[] = []
for (const router of routes) {
// skip hidden router
if (router.meta && router.meta.hidden) {
continue
}
const data: RouteConfig = {
path: path.resolve(basePath, router.path),
meta: {
title: [...prefixTitle]
}
}
if (router.meta && router.meta.title) {
// generate internationalized title
const i18ntitle = i18n.t(`route.${router.meta.title}`).toString()
data.meta.title = [...data.meta.title, i18ntitle]
if (router.redirect !== 'noRedirect') {
// only push the routes with title
// special case: need to exclude parent router without redirect
res.push(data)
}
}
// recursive child routes
if (router.children) {
const tempRoutes = this.generateRoutes(router.children, data.path, data.meta.title)
if (tempRoutes.length >= 1) {
res = [...res, ...tempRoutes]
}
}
}
return res
}
private querySearch(query: string) {
if (query !== '') {
if (this.fuse) {
this.options = this.fuse.search(query).map((result) => result.item)
}
} else {
this.options = []
}
}
}
</script>
<style lang="scss" scoped>
.header-search {
font-size: 0 !important;
.search-icon {
cursor: pointer;
font-size: 18px;
vertical-align: middle;
}
.header-search-select {
font-size: 18px;
transition: width 0.2s;
width: 0;
overflow: hidden;
background: transparent;
border-radius: 0;
display: inline-block;
vertical-align: middle;
.el-input__inner {
border-radius: 0;
border: 0;
padding-left: 0;
padding-right: 0;
box-shadow: none !important;
border-bottom: 1px solid #d9d9d9;
vertical-align: middle;
}
}
&.show {
.header-search-select {
width: 210px;
margin-left: 10px;
}
}
}
</style>

View File

@ -0,0 +1,78 @@
<template>
<el-dropdown
trigger="click"
class="international"
@command="handleSetLanguage"
>
<div>
<svg-icon
name="language"
class="international-icon"
/>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
:disabled="language==='zh'"
command="zh"
>
中文
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='en'"
command="en"
>
English
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='es'"
command="es"
>
Español
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='ja'"
command="ja"
>
日本語
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='ko'"
command="ko"
>
한국어
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='it'"
command="it"
>
Italiano
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import settings from '../../settings'
@Component({
name: 'Login'
})
export default class extends Vue {
get language() {
return AppModule.language
}
private handleSetLanguage(lang: string) {
this.$i18n.locale = lang
AppModule.SetLanguage(lang)
document.documentElement.lang = lang
const title = this.$route.meta.title ? `${this.$t(`route.${this.$route.meta.title}`)} - ${settings.title}` : `${settings.title}`
document.title = title
this.$message({
message: this.$t('components.changeLanguageTips').toString(),
type: 'success'
})
}
}
</script>

View File

@ -0,0 +1,385 @@
<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"
v-model="valueCopy"
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 { Component, Prop, Vue, Watch } from 'vue-property-decorator'
@Component({
name: 'MaterialInput'
})
export default class extends Vue {
@Prop({ required: true }) private value!: any
@Prop({ default: 'text' }) private type!: string
@Prop({ default: '' }) private id!: string
@Prop({ default: '' }) private icon!: string
@Prop({ default: '' }) private name!: string
@Prop({ default: '' }) private placeholder!: string
@Prop({ default: false }) private readonly!: boolean
@Prop({ default: false }) private disabled!: boolean
@Prop({ default: true }) private required!: boolean
@Prop({ default: 'off' }) private autoComplete!: string
@Prop({ default: 0 }) private min!: number | Date
@Prop({ default: 10000 }) private max!: number | Date
@Prop({ default: 1 }) private step!: number
@Prop({ default: 0 }) private minlength!: number
@Prop({ default: 20 }) private maxlength!: number
@Prop({ default: true }) private validateEvent!: boolean
private valueCopy = this.value
private focus = false
@Watch('value')
private onValueChange(value: any) {
this.valueCopy = value
}
get computedClasses() {
return {
'material--active': this.focus,
'material--disabled': this.disabled,
'material--raised': Boolean(this.focus || this.valueCopy)
}
}
get filledPlaceholder() {
if (this.focus) {
return this.placeholder
}
return ''
}
private handleInput(event: KeyboardEvent) {
const value = (event.target as HTMLInputElement).value
this.$emit('input', value)
if (this.$parent.$options.name === 'ElFormItem') {
if (this.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
this.$parent.$emit('el.form.change', [value])
}
}
}
private handleFocus(event: FocusEvent) {
this.focus = true
this.$emit('focus', event)
}
private handleBlur(event: FocusEvent) {
this.focus = false
this.$emit('blur', event)
if (this.$parent.$options.name === 'ElFormItem') {
if (this.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
this.$parent.$emit('el.form.blur', [this.valueCopy])
}
}
}
}
</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,78 @@
<template>
<div
:class="{'hidden': hidden}"
class="pagination-container"
>
<el-pagination
:background="background"
:current-page.sync="currentPage"
:page-size.sync="pageSize"
:layout="layout"
:page-sizes="pageSizes"
:total="total"
v-bind="$attrs"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import { scrollTo } from '@/utils/scroll-to'
@Component({
name: 'Pagination'
})
export default class extends Vue {
@Prop({ required: true }) private total!: number
@Prop({ default: 1 }) private page!: number
@Prop({ default: 20 }) private limit!: number
@Prop({ default: () => [10, 20, 30, 50] }) private pageSizes!: number[]
@Prop({ default: 'total, sizes, prev, pager, next, jumper' }) private layout!: string
@Prop({ default: true }) private background!: boolean
@Prop({ default: true }) private autoScroll!: boolean
@Prop({ default: false }) private hidden!: boolean
get currentPage() {
return this.page
}
set currentPage(value) {
this.$emit('update:page', value)
}
get pageSize() {
return this.limit
}
set pageSize(value) {
this.$emit('update:limit', value)
}
handleSizeChange(value: number) {
this.$emit('pagination', { page: this.currentPage, limit: value })
if (this.autoScroll) {
scrollTo(0, 800)
}
}
handleCurrentChange(value: number) {
this.$emit('pagination', { page: value, limit: this.pageSize })
if (this.autoScroll) {
scrollTo(0, 800)
}
}
}
</script>
<style lang="scss" scoped>
.pagination-container {
background: #fff;
padding: 32px 16px;
}
.pagination-container.hidden {
display: none;
}
</style>

View File

@ -0,0 +1,124 @@
<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 { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
name: 'PanThumb'
})
export default class extends Vue {
@Prop({ required: true }) private image!: string
@Prop({ default: '150px' }) private width!: string
@Prop({ default: '150px' }) private height!: string
@Prop({ default: 1 }) private zIndex!: number
}
</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,151 @@
<template>
<div
ref="rightPanel"
:class="{show: show}"
class="rightPanel-container"
>
<div class="rightPanel-background" />
<div class="rightPanel">
<div
class="handle-button"
:style="{'top': buttonTop+'px','background-color': theme}"
@click="show=!show"
>
<i :class="show?'el-icon-close':'el-icon-setting'" />
</div>
<div class="rightPanel-items">
<slot />
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
import { addClass, removeClass } from '@/utils'
import { SettingsModule } from '@/store/modules/settings'
@Component({
name: 'RightPanel'
})
export default class extends Vue {
@Prop({ default: false }) private clickNotClose!: boolean
@Prop({ default: 250 }) private buttonTop!: number
private show = false
get theme() {
return SettingsModule.theme
}
@Watch('show')
private onShowChange(value: boolean) {
if (value && !this.clickNotClose) {
this.addEventClick()
}
if (value) {
addClass(document.body, 'showRightPanel')
} else {
removeClass(document.body, 'showRightPanel')
}
}
mounted() {
this.insertToBody()
}
beforeDestroy() {
const elx = this.$refs.rightPanel as Element
elx.remove()
}
private addEventClick() {
window.addEventListener('click', this.closeSidebar)
}
private closeSidebar(ev: MouseEvent) {
const parent = (ev.target as HTMLElement).closest('.rightPanel')
if (!parent) {
this.show = false
window.removeEventListener('click', this.closeSidebar)
}
}
private insertToBody() {
const elx = this.$refs.rightPanel as Element
const body = document.querySelector('body')
if (body) {
body.insertBefore(elx, body.firstChild)
}
}
}
</script>
<style lang="scss">
.showRightPanel {
overflow: hidden;
position: relative;
width: calc(100% - 15px);
}
</style>
<style lang="scss" scoped>
.rightPanel-background {
position: fixed;
top: 0;
left: 0;
opacity: 0;
transition: opacity .3s cubic-bezier(.7, .3, .1, 1);
background: rgba(0, 0, 0, .2);
z-index: -1;
}
.rightPanel {
width: 100%;
max-width: 260px;
height: 100vh;
position: fixed;
top: 0;
right: 0;
box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);
transition: all .25s cubic-bezier(.7, .3, .1, 1);
transform: translate(100%);
background: #fff;
z-index: 40000;
}
.show {
transition: all .3s cubic-bezier(.7, .3, .1, 1);
.rightPanel-background {
z-index: 20000;
opacity: 1;
width: 100%;
height: 100%;
}
.rightPanel {
transform: translate(0);
}
}
.handle-button {
width: 48px;
height: 48px;
position: absolute;
left: -48px;
text-align: center;
font-size: 24px;
border-radius: 6px 0 0 6px !important;
z-index: 0;
cursor: pointer;
pointer-events: auto;
color: #fff;
line-height: 48px;
i {
font-size: 24px;
line-height: 48px;
}
}
</style>

View File

@ -0,0 +1,51 @@
<template>
<div id="screenfull">
<svg-icon
:name="isFullscreen? 'exit-fullscreen': 'fullscreen'"
@click="click"
/>
</div>
</template>
<script lang="ts">
import screenfull from 'screenfull'
import { Component, Vue } from 'vue-property-decorator'
const sf = screenfull
@Component({
name: 'Screenfull'
})
export default class extends Vue {
private isFullscreen = false
mounted() {
if (sf.isEnabled) {
sf.on('change', this.change)
}
}
beforeDestory() {
if (sf.isEnabled) {
sf.off('change', this.change)
}
}
private change() {
if (sf.isEnabled) {
this.isFullscreen = sf.isFullscreen
}
}
private click() {
if (!sf.isEnabled) {
this.$message({
message: 'you browser can not work',
type: 'warning'
})
return false
}
sf.toggle()
}
}
</script>

View File

@ -0,0 +1,70 @@
<template>
<el-dropdown
id="size-select"
trigger="click"
@command="handleSetSize"
>
<div>
<svg-icon
class="size-icon"
name="size"
/>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="item of sizeOptions"
:key="item.value"
:disabled="size===item.value"
:command="item.value"
>
{{
item.label }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { TagsViewModule } from '@/store/modules/tags-view'
@Component({
name: 'SizeSelect'
})
export default class extends Vue {
private sizeOptions = [
{ label: 'Default', value: 'default' },
{ label: 'Medium', value: 'medium' },
{ label: 'Small', value: 'small' },
{ label: 'Mini', value: 'mini' }
]
get size() {
return AppModule.size
}
private handleSetSize(size: string) {
(this as any).$ELEMENT.size = size
AppModule.SetSize(size)
this.refreshView()
this.$message({
message: 'Switch Size Success',
type: 'success'
})
}
private refreshView() {
// In order to make the cached page re-rendered
TagsViewModule.delAllCachedViews()
const { fullPath } = this.$route
this.$nextTick(() => {
this.$router.replace({
path: '/redirect' + fullPath
}).catch(err => {
console.warn(err)
})
})
}
}
</script>

View File

@ -0,0 +1,83 @@
<template>
<div :style="{height: height, zIndex: zIndex}">
<div
:class="className"
:style="{top: (isSticky ? stickyTop +'px' : ''), zIndex: zIndex, position: position, width: width, height: height}"
>
<slot>
<div>sticky</div>
</slot>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
name: 'Sticky'
})
export default class extends Vue {
@Prop({ default: 0 }) private stickyTop!: number
@Prop({ default: 1 }) private zIndex!: number
@Prop({ default: '' }) private className!: string
private active = false
private position = ''
private isSticky = false
private width = 'auto'
private height = 'auto'
mounted() {
this.height = this.$el.getBoundingClientRect().height.toString() + 'px'
window.addEventListener('scroll', this.handleScroll)
window.addEventListener('resize', this.handleResize)
}
activated() {
this.handleScroll()
}
destroyed() {
window.removeEventListener('scroll', this.handleScroll)
window.removeEventListener('resize', this.handleResize)
}
private sticky() {
if (this.active) {
return
}
this.position = 'fixed'
this.active = true
this.width = this.width + 'px'
this.isSticky = true
}
private handleReset() {
if (!this.active) {
return
}
this.position = ''
this.width = 'auto'
this.active = false
this.isSticky = false
}
private handleScroll() {
const width = this.$el.getBoundingClientRect().width
this.width = (width.toString() + 'px') || 'auto'
const offsetTop = this.$el.getBoundingClientRect().top
if (offsetTop < this.stickyTop) {
this.sticky()
return
}
this.handleReset()
}
private handleResize() {
if (this.isSticky) {
this.width = this.$el.getBoundingClientRect().width.toString() + 'px'
}
}
}
</script>

View File

@ -0,0 +1,89 @@
<template>
<div class="tag-input">
<div v-for="(tag, index) in tags" :key="tag" class="tag-input__tag">
<span @click="removeTag(index)">x</span>
{{ tag }}
</div>
<input type="text"
:placeholder="placeholder"
class="tag-input__text"
@keydown.enter="addTag"
@keydown.188="addTag"
/>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
declare module 'vue/types/vue' {
interface Vue {
tagStr?: string
}
}
@Component({
name: 'TagInput',
props: ['initTags', 'placeholder']
})
export default class extends Vue {
private tags: string[] = []
mounted() {
console.log(this.tagStr)
if (this.tagStr) {
this.tags = this.tagStr.split(',')
}
}
private addTag(event: any) {
event.preventDefault()
const val: string = event.target.value.trim()
if (val.length > 0) {
this.tags.push(val)
event.target.value = ''
this.$emit('tag-change', this.tags.join(','))
}
}
private removeTag(index: number) {
this.tags.splice(index, 1)
this.$emit('tag-change', this.tags.join(','))
}
}
</script>
<style lang="scss" scoped>
.tag-input {
width: 100%;
border: 1px solid #eee;
font-size: 0.9em;
height: 50px;
box-sizing: border-box;
padding: 0 10px;
}
.tag-input__tag {
height: 30px;
float: left;
margin-right: 10px;
background-color: #2d75ee;
margin-top: 10px;
line-height: 30px;
color: #fff;
padding: 0 5px;
border-radius: 5px;
}
.tag-input__tag > span {
cursor: pointer;
opacity: 0.75;
}
.tag-input__text {
border: none;
outline: none;
font-size: 0.9em;
line-height: 50px;
background: none;
}
</style>

View File

@ -0,0 +1,158 @@
<template>
<el-color-picker
v-model="theme"
:predefine="['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d']"
class="theme-picker"
popper-class="theme-picker-dropdown"
/>
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator'
import { SettingsModule } from '@/store/modules/settings'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const version = require('element-ui/package.json').version // element-ui version from node_modules
const ORIGINAL_THEME = '#409EFF' // default color
@Component({
name: 'ThemePicker'
})
export default class extends Vue {
private chalk = '' // The content of theme-chalk css
private theme = ''
get defaultTheme() {
return SettingsModule.theme
}
@Watch('defaultTheme', { immediate: true })
private onDefaultThemeChange(value: string) {
this.theme = value
}
@Watch('theme')
private async onThemeChange(value: string) {
if (!value) return
const oldValue = this.chalk ? this.theme : ORIGINAL_THEME
const themeCluster = this.getThemeCluster(value.replace('#', ''))
const originalCluster = this.getThemeCluster(oldValue.replace('#', ''))
const message = this.$message({
message: ' Compiling the theme',
customClass: 'theme-message',
type: 'success',
duration: 0,
iconClass: 'el-icon-loading'
})
if (!this.chalk) {
const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
await this.getCSSString(url, 'chalk')
}
const getHandler = (variable: string, id: string) => {
return () => {
const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))
const newStyle = this.updateStyle((this as any)[variable], originalCluster, themeCluster)
let styleTag = document.getElementById(id)
if (!styleTag) {
styleTag = document.createElement('style')
styleTag.setAttribute('id', id)
document.head.appendChild(styleTag)
}
styleTag.innerText = newStyle
}
}
const chalkHandler = getHandler('chalk', 'chalk-style')
chalkHandler()
let styles: HTMLElement[] = [].slice.call(document.querySelectorAll('style'))
styles = styles
.filter(style => {
const text = style.innerText
return new RegExp(oldValue, 'i').test(text) && !/Chalk Variables/.test(text)
})
styles.forEach(style => {
const { innerText } = style
if (typeof innerText !== 'string') return
style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)
})
this.$emit('change', value)
message.close()
}
private updateStyle(style: string, oldCluster: string[], newCluster: string[]) {
let newStyle = style
oldCluster.forEach((color, index) => {
newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])
})
return newStyle
}
private getCSSString(url: string, variable: string) {
return new Promise(resolve => {
const xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
(this as any)[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
resolve()
}
}
xhr.open('GET', url)
xhr.send()
})
}
private getThemeCluster(theme: string) {
const tintColor = (color: string, tint: number) => {
let red = parseInt(color.slice(0, 2), 16)
let green = parseInt(color.slice(2, 4), 16)
let blue = parseInt(color.slice(4, 6), 16)
if (tint === 0) { // when primary color is in its rgb space
return [red, green, blue].join(',')
} else {
red += Math.round(tint * (255 - red))
green += Math.round(tint * (255 - green))
blue += Math.round(tint * (255 - blue))
return `#${red.toString(16)}${green.toString(16)}${blue.toString(16)}`
}
}
const shadeColor = (color: string, shade: number) => {
let red = parseInt(color.slice(0, 2), 16)
let green = parseInt(color.slice(2, 4), 16)
let blue = parseInt(color.slice(4, 6), 16)
red = Math.round((1 - shade) * red)
green = Math.round((1 - shade) * green)
blue = Math.round((1 - shade) * blue)
return `#${red.toString(16)}${green.toString(16)}${blue.toString(16)}`
}
const clusters = [theme]
for (let i = 0; i <= 9; i++) {
clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))
}
clusters.push(shadeColor(theme, 0.1))
return clusters
}
}
</script>
<style lang="scss">
.theme-message,
.theme-picker-dropdown {
z-index: 99999 !important;
}
.theme-picker .el-color-picker__trigger {
height: 26px !important;
width: 26px !important;
padding: 2px;
}
.theme-picker-dropdown .el-color-dropdown__link-btn {
display: none;
}
</style>

View File

@ -0,0 +1,137 @@
<template>
<div class="upload-container">
<el-button
:style="{background: color, borderColor: color}"
icon="el-icon-upload"
size="mini"
type="primary"
@click=" dialogVisible=true"
>
upload
</el-button>
<el-dialog
:visible.sync="dialogVisible"
:modal-append-to-body="false"
>
<el-upload
:multiple="true"
:file-list="defaultFileList"
:show-file-list="true"
:on-remove="handleRemove"
:on-success="handleSuccess"
:before-upload="beforeUpload"
class="editor-slide-upload"
action="https://httpbin.org/post"
list-type="picture-card"
>
<el-button
size="small"
type="primary"
>
Click upload
</el-button>
</el-upload>
<el-button @click="dialogVisible = false">
Cancel
</el-button>
<el-button
type="primary"
@click="handleSubmit"
>
Confirm
</el-button>
</el-dialog>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import { ElUploadInternalRawFile } from 'element-ui/types/upload'
export interface IUploadObject {
hasSuccess: boolean
uid: number
url: string
width: number
height: number
}
@Component({
name: 'EditorImageUpload'
})
export default class extends Vue {
@Prop({ required: true }) private color!: string
private dialogVisible = false
private listObj: { [key: string]: IUploadObject } = {}
private defaultFileList = []
private checkAllSuccess() {
return Object.keys(this.listObj).every(item => this.listObj[item].hasSuccess)
}
private handleSubmit() {
const arr = Object.keys(this.listObj).map(v => this.listObj[v])
if (!this.checkAllSuccess()) {
this.$message('Please wait for all images to be uploaded successfully. If there is a network problem, please refresh the page and upload again!')
return
}
this.$emit('success-callback', arr)
this.listObj = {}
this.defaultFileList = []
this.dialogVisible = false
}
private handleSuccess(response: any, file: ElUploadInternalRawFile) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
this.listObj[objKeyArr[i]].url = response.files.file
this.listObj[objKeyArr[i]].hasSuccess = true
return
}
}
}
private handleRemove(file: ElUploadInternalRawFile) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
delete this.listObj[objKeyArr[i]]
return
}
}
}
private beforeUpload(file: ElUploadInternalRawFile) {
const fileName = file.uid
const img = new Image()
img.src = window.URL.createObjectURL(file)
img.onload = () => {
this.listObj[fileName] = {
hasSuccess: false,
uid: file.uid,
url: '',
width: img.width,
height: img.height
}
}
}
}
</script>
<style lang="scss">
.editor-slide-upload {
.el-upload--picture-card {
width: 100%;
}
}
</style>
<style lang="scss" scoped>
.editor-slide-upload {
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,8 @@
// Import plugins that you want to use
// Detail plugins list see: https://www.tiny.cloud/apps/#core-plugins
// Custom builds see: https://www.tiny.cloud/get-tiny/custom-builds/
export const plugins = ['advlist anchor autolink autoresize autosave charmap code codesample directionality emoticons fullpage fullscreen help hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount']
// Here is the list of toolbar control components
// Details see: https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
export const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample help', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons charmap forecolor backcolor fullpage fullscreen']

View File

@ -0,0 +1,228 @@
<template>
<div
:class="{fullscreen: fullscreen}"
class="tinymce-container"
:style="{width: containerWidth}"
>
<tinymce-editor
:id="id"
v-model="tinymceContent"
:init="initOptions"
/>
<div class="editor-custom-btn-container">
<editor-image-upload
:color="uploadButtonColor"
class="editor-upload-btn"
@success-callback="imageSuccessCBK"
/>
</div>
</div>
</template>
<script lang="ts">
// Docs: https://www.tiny.cloud/docs/advanced/usage-with-module-loaders/
// Import TinyMCE
import 'tinymce/tinymce'
// Default icons are required for TinyMCE 5.3 or above
import 'tinymce/icons/default'
// Import themes
import 'tinymce/themes/silver'
import 'tinymce/themes/mobile'
// Any plugins you want to use has to be imported
import 'tinymce/plugins/advlist'
import 'tinymce/plugins/anchor'
import 'tinymce/plugins/autoresize'
import 'tinymce/plugins/autolink'
import 'tinymce/plugins/autosave'
import 'tinymce/plugins/charmap'
import 'tinymce/plugins/code'
import 'tinymce/plugins/codesample'
import 'tinymce/plugins/directionality'
import 'tinymce/plugins/emoticons'
import 'tinymce/plugins/fullpage'
import 'tinymce/plugins/fullscreen'
import 'tinymce/plugins/help'
import 'tinymce/plugins/hr'
import 'tinymce/plugins/image'
import 'tinymce/plugins/imagetools'
import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/link'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/media'
import 'tinymce/plugins/nonbreaking'
import 'tinymce/plugins/noneditable'
import 'tinymce/plugins/pagebreak'
import 'tinymce/plugins/paste'
import 'tinymce/plugins/preview'
import 'tinymce/plugins/print'
import 'tinymce/plugins/save'
import 'tinymce/plugins/searchreplace'
import 'tinymce/plugins/spellchecker'
import 'tinymce/plugins/tabfocus'
import 'tinymce/plugins/table'
import 'tinymce/plugins/template'
import 'tinymce/plugins/textpattern'
import 'tinymce/plugins/visualblocks'
import 'tinymce/plugins/visualchars'
import 'tinymce/plugins/wordcount'
import TinymceEditor from '@tinymce/tinymce-vue' // TinyMCE vue wrapper
import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { SettingsModule } from '@/store/modules/settings'
import EditorImageUpload, { IUploadObject } from './components/EditorImage.vue'
import { plugins, toolbar } from './config'
const defaultId = () => 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
@Component({
name: 'Tinymce',
components: {
EditorImageUpload,
TinymceEditor
}
})
export default class extends Vue {
@Prop({ required: true }) private value!: string
@Prop({ default: defaultId }) private id!: string
@Prop({ default: () => [] }) private toolbar!: string[]
@Prop({ default: 'file edit insert view format table' }) private menubar!: string
@Prop({ default: '360px' }) private height!: string | number
@Prop({ default: 'auto' }) private width!: string | number
private hasChange = false
private hasInit = false
private fullscreen = false
// https://www.tiny.cloud/docs/configure/localization/#language
// and also see langs files under public/tinymce/langs folder
private languageTypeList: { [key: string]: string } = {
en: 'en',
zh: 'zh_CN',
es: 'es',
ja: 'ja',
ko: 'ko_KR',
it: 'it'
}
get language() {
return this.languageTypeList[AppModule.language]
}
get uploadButtonColor() {
return SettingsModule.theme
}
get tinymceContent() {
return this.value
}
set tinymceContent(value) {
this.$emit('input', value)
}
get containerWidth() {
const width = this.width
// Test matches `100`, `'100'`
if (/^[\d]+(\.[\d]+)?$/.test(width.toString())) {
return `${width}px`
}
return width
}
get initOptions() {
return {
selector: `#${this.id}`,
height: this.height,
body_class: 'panel-body',
object_resizing: false,
toolbar: this.toolbar.length > 0 ? this.toolbar : toolbar,
menubar: this.menubar,
plugins: plugins,
language: this.language,
language_url: this.language === 'en' ? '' : `${process.env.BASE_URL}tinymce/langs/${this.language}.js`,
skin_url: `${process.env.BASE_URL}tinymce/skins/`,
emoticons_database_url: `${process.env.BASE_URL}tinymce/emojis.min.js`,
end_container_on_empty_block: true,
powerpaste_word_import: 'clean',
code_dialog_height: 450,
code_dialog_width: 1000,
advlist_bullet_styles: 'square',
advlist_number_styles: 'default',
imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
default_link_target: '_blank',
link_title: false,
// inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
nonbreaking_force_tab: true,
// https://www.tiny.cloud/docs-3x/reference/configuration/Configuration3x@convert_urls/
// https://stackoverflow.com/questions/5196205/disable-tinymce-absolute-to-relative-url-conversions
convert_urls: false,
init_instance_callback: (editor: any) => {
if (this.value) {
editor.setContent(this.value)
}
this.hasInit = true
editor.on('NodeChange Change KeyUp SetContent', () => {
this.hasChange = true
this.$emit('input', editor.getContent())
})
},
setup: (editor: any) => {
editor.on('FullscreenStateChanged', (e: any) => {
this.fullscreen = e.state
})
}
}
}
@Watch('language')
private onLanguageChange() {
const tinymceManager = (window as any).tinymce
const tinymceInstance = tinymceManager.get(this.id)
if (this.fullscreen) {
tinymceInstance.execCommand('mceFullScreen')
}
if (tinymceInstance) {
tinymceInstance.destroy()
}
this.$nextTick(() => tinymceManager.init(this.initOptions))
}
private imageSuccessCBK(arr: IUploadObject[]) {
const tinymce = (window as any).tinymce.get(this.id)
arr.forEach(v => {
tinymce.insertContent(`<img class="wscnph" src="${v.url}" >`)
})
}
}
</script>
<style lang="scss" scoped>
.tinymce-container {
position: relative;
line-height: normal;
.mce-fullscreen {
z-index: 10000;
}
}
.editor-custom-btn-container {
position: absolute;
right: 6px;
top: 6px;
z-index: 1002;
}
.fullscreen .editor-custom-btn-container {
z-index: 10000;
position: fixed;
}
.editor-upload-btn {
display: inline-block;
}
textarea {
visibility: hidden;
z-index: -1;
}
</style>

View File

@ -0,0 +1,155 @@
<template>
<div class="upload-container">
<el-upload
:data="dataObj"
:multiple="false"
:show-file-list="false"
:on-success="handleImageSuccess"
class="image-uploader"
drag
action="https://httpbin.org/post"
>
<i class="el-icon-upload" />
<div class="el-upload__text">
将文件拖到此处<em>点击上传</em>
</div>
</el-upload>
<div class="image-preview image-app-preview">
<div
v-show="imageUrl.length>1"
class="image-preview-wrapper"
>
<img :src="imageUrl">
<div class="image-preview-action">
<i
class="el-icon-delete"
@click="rmImage"
/>
</div>
</div>
</div>
<div class="image-preview">
<div
v-show="imageUrl.length>1"
class="image-preview-wrapper"
>
<img :src="imageUrl">
<div class="image-preview-action">
<i
class="el-icon-delete"
@click="rmImage"
/>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component({
name: 'UploadImage'
})
export default class extends Vue {
@Prop({ default: '' }) private value!: string
private tempUrl = ''
private dataObj = { token: '', key: '' }
get imageUrl() {
return this.value
}
private emitInput(value: string) {
this.$emit('input', value)
}
private rmImage() {
this.emitInput('')
}
private handleImageSuccess(res: any) {
this.emitInput(res.files.file)
}
}
</script>
<style lang="scss" scoped>
.upload-container {
width: 100%;
position: relative;
@include clearfix;
.image-uploader {
width: 35%;
float: left;
}
.image-preview {
width: 200px;
height: 200px;
position: relative;
border: 1px dashed #d9d9d9;
float: left;
margin-left: 50px;
.image-preview-wrapper {
position: relative;
width: 100%;
height: 100%;
img {
width: 100%;
height: 100%;
}
}
.image-preview-action {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
cursor: default;
text-align: center;
color: #fff;
opacity: 0;
font-size: 20px;
background-color: rgba(0, 0, 0, .5);
transition: opacity .3s;
cursor: pointer;
text-align: center;
line-height: 200px;
.el-icon-delete {
font-size: 36px;
}
}
&:hover {
.image-preview-action {
opacity: 1;
}
}
}
.image-app-preview {
width: 320px;
height: 180px;
position: relative;
border: 1px dashed #d9d9d9;
float: left;
margin-left: 50px;
.app-fake-conver {
height: 44px;
position: absolute;
width: 100%; // background: rgba(0, 0, 0, .1);
text-align: center;
line-height: 64px;
color: #fff;
}
}
}
</style>

View File

@ -0,0 +1,60 @@
// Inspired by https://github.com/Inndy/vue-clipboard2
import Clipboard from 'clipboard'
import { DirectiveOptions } from 'vue'
if (!Clipboard) {
throw new Error('you should npm install `clipboard` --save at first ')
}
let successCallback: Function | null
let errorCallback: Function | null
let clipboardInstance: Clipboard | null
export const clipboard: DirectiveOptions = {
bind(el, binding) {
if (binding.arg === 'success') {
successCallback = binding.value
} else if (binding.arg === 'error') {
errorCallback = binding.value
} else {
clipboardInstance = new Clipboard(el, {
text() { return binding.value },
action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
})
clipboardInstance.on('success', e => {
const callback = successCallback
callback && callback(e)
})
clipboardInstance.on('error', e => {
const callback = errorCallback
callback && callback(e)
})
}
},
update(el, binding) {
if (binding.arg === 'success') {
successCallback = binding.value
} else if (binding.arg === 'error') {
errorCallback = binding.value
} else {
clipboardInstance = new Clipboard(el, {
text() { return binding.value },
action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
})
}
},
unbind(_, binding) {
if (binding.arg === 'success') {
successCallback = null
} else if (binding.arg === 'error') {
errorCallback = null
} else {
if (clipboardInstance) {
clipboardInstance.destroy()
}
clipboardInstance = null
}
}
}

View File

@ -0,0 +1,75 @@
import { DirectiveOptions } from 'vue'
export const elDraggableDialog: DirectiveOptions = {
bind(el, _, vnode) {
const dragDom = el.querySelector('.el-dialog') as HTMLElement
const dialogHeaderEl = el.querySelector('.el-dialog__header') as HTMLElement
dragDom.style.cssText += ';top:0px;'
dialogHeaderEl.style.cssText += ';cursor:move;'
dialogHeaderEl.onmousedown = (e) => {
const disX = e.clientX - dialogHeaderEl.offsetLeft
const disY = e.clientY - dialogHeaderEl.offsetTop
const dragDomWidth = dragDom.offsetWidth
const dragDomHeight = dragDom.offsetHeight
const screenWidth = document.body.clientWidth
const screenHeight = document.body.clientHeight
const minDragDomLeft = dragDom.offsetLeft
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
const minDragDomTop = dragDom.offsetTop
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
const styleLeftStr = getComputedStyle(dragDom).left
const styleTopStr = getComputedStyle(dragDom).top
if (!styleLeftStr || !styleTopStr) return
let styleLeft: number
let styleTop: number
// Format may be "##%" or "##px"
if (styleLeftStr.includes('%')) {
styleLeft = +document.body.clientWidth * (+styleLeftStr.replace(/%/g, '') / 100)
styleTop = +document.body.clientHeight * (+styleTopStr.replace(/%/g, '') / 100)
} else {
styleLeft = +styleLeftStr.replace(/px/g, '')
styleTop = +styleTopStr.replace(/px/g, '')
}
document.onmousemove = (e) => {
let left = e.clientX - disX
let top = e.clientY - disY
// Handle edge cases
if (-(left) > minDragDomLeft) {
left = -minDragDomLeft
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft
}
if (-(top) > minDragDomTop) {
top = -minDragDomTop
} else if (top > maxDragDomTop) {
top = maxDragDomTop
}
// Move current element
dragDom.style.cssText += `;left:${left + styleLeft}px;top:${top + styleTop}px;`
// Emit on-dialog-drag event
// See https://stackoverflow.com/questions/49264426/vuejs-custom-directive-emit-event
if (vnode.componentInstance) {
vnode.componentInstance.$emit('on-dialog-drag')
} else if (vnode.elm) {
vnode.elm.dispatchEvent(new CustomEvent('on-dialog-drag'))
}
}
document.onmouseup = () => {
document.onmousemove = null
document.onmouseup = null
}
}
}
}

5
src/directives/index.ts Normal file
View File

@ -0,0 +1,5 @@
export * from './permission'
export * from './el-draggable-dialog'
export * from './waves'
export * from './clipboard'
export * from './role'

View File

@ -0,0 +1,12 @@
import { DirectiveOptions } from 'vue'
import { checkPermission } from '@/utils/permission'
export const permission: DirectiveOptions = {
inserted(el, binding) {
const { value } = binding
if (!checkPermission(value)) {
el.style.display = 'none'
}
}
}

View File

@ -0,0 +1,21 @@
import { DirectiveOptions } from 'vue'
import { UserModule } from '@/store/modules/user'
export const role: DirectiveOptions = {
inserted(el, binding) {
const { value } = binding
const roles = UserModule.roles
if (value && value instanceof Array && value.length > 0) {
const permissionRoles = value
const hasRole = roles.some(role => {
return permissionRoles.includes(role)
})
if (!hasRole) {
el.style.display = 'none'
}
} else {
throw new Error('need roles! Like v-role="[\'admin\',\'editor\']"')
}
}
}

View File

@ -0,0 +1,46 @@
import './waves.css'
import { DirectiveOptions } from 'vue'
export const waves: DirectiveOptions = {
bind(el, binding) {
el.addEventListener('click', e => {
const customOpts = Object.assign({}, binding.value)
const opts = Object.assign({
ele: el, // 波纹作用元素
type: 'hit', // hit 点击位置扩散 center中心点扩展
color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
}, customOpts)
const target: HTMLElement = opts.ele
if (target) {
target.style.position = 'relative'
target.style.overflow = 'hidden'
const rect = target.getBoundingClientRect()
let ripple = target.querySelector('.waves-ripple') as HTMLElement
if (!ripple) {
ripple = document.createElement('span')
ripple.className = 'waves-ripple'
ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
target.appendChild(ripple)
} else {
ripple.className = 'waves-ripple'
}
switch (opts.type) {
case 'center':
ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
break
default:
ripple.style.top =
(e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||
document.body.scrollTop) + 'px'
ripple.style.left =
(e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||
document.body.scrollLeft) + 'px'
}
ripple.style.backgroundColor = opts.color
ripple.className = 'waves-ripple z-active'
return false
}
}, false)
}
}

View File

@ -0,0 +1,26 @@
.waves-ripple {
position: absolute;
border-radius: 100%;
background-color: rgba(0, 0, 0, 0.15);
background-clip: padding-box;
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
opacity: 1;
}
.waves-ripple.z-active {
opacity: 0;
-webkit-transform: scale(2);
-ms-transform: scale(2);
transform: scale(2);
-webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
transition: opacity 1.2s ease-out, transform 0.6s ease-out;
transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
}

17
src/filters/index.ts Normal file
View File

@ -0,0 +1,17 @@
// Set utils function parseTime to filter
export { parseTime } from '@/utils'
// Filter for article status
export const articleStatusFilter = (status: string) => {
const statusMap: { [key: string]: string } = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
// Filter to uppercase the first character
export const uppercaseFirstChar = (str: string) => {
return str.charAt(0).toUpperCase() + str.slice(1)
}

13
src/icons/README.md Normal file
View File

@ -0,0 +1,13 @@
# vue-svgicon
## English
* All svg components were generated by `vue-svgicon` using svg files
* After you adding new svg files into `icons/svg` folder, run `yarn svg` to regerenrate all svg components (before this, you should have `vue-svgicon` installed globally or use `npx`)
* See details at: [https://github.com/MMF-FE/vue-svgicon](https://github.com/MMF-FE/vue-svgicon)
## 中文
* 所有的 svg 组件都是由 `vue-svgicon` 生成的
* 每当在 `icons/svg` 文件夹内添加 icon 之后,可以通过执行 `yarn svg` 来重新生成所有组件 (在此之前需要全局安装 `vue-svgicon` 或使用 `npx`)
* 详细文档请见:[https://github.com/MMF-FE/vue-svgicon](https://github.com/MMF-FE/vue-svgicon)

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'404': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M121.7 73.3v10c4-7.7 6.2-16.1 6.2-25C128 26 99.3 0 64 0S0 26 0 58.2v1.2l23-26h13.3L16.6 60.8H23v-7l13.7-19.4v49.4H23V73.3H2.2a61.6 61.6 0 0046 41.4c-1.5 3.3-5.7 11.2-12.6 12.6-8.6 1.8 23.3.5 46.2-13.1a63 63 0 0039.7-30.5H108V73.3H85V59.5l23-26h13l-19.4 27.2h6.4v-7.5l13.7-19.4v39.5zM43.5 76a10.5 10.5 0 01-1-4.5v-27c0-1.7.3-3.2 1-4.6a11.7 11.7 0 012.7-3.7 13 13 0 019-3.3h11.3a13.6 13.6 0 019 3.3L63.2 52.6v-3a2 2 0 00-.7-1.4c-.4-.4-1-.6-1.6-.6-.7 0-1.2.2-1.7.6a2 2 0 00-.6 1.5v9l-14.2 19a10.6 10.6 0 01-1-1.6zm35.7-4.5c0 1.6-.3 3-1 4.5a11.7 11.7 0 01-2.7 3.7 13 13 0 01-9 3.4H55.2a13.6 13.6 0 01-9-3.4 12.5 12.5 0 01-1.4-1.5L58.5 60v6.4c0 .6.2 1.1.7 1.5.4.4 1 .6 1.6.6.7 0 1.2-.2 1.7-.6a2 2 0 00.7-1.5V54L76 37a10.5 10.5 0 013.2 7.7v27z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'admin': {
width: 64,
height: 64,
viewBox: '0 0 1024 1024',
data: '<defs/><path pid="0" d="M878.592 781.312q4.096 14.336 7.168 36.352t3.072 44.544-3.584 42.496-10.752 30.208q-5.12 7.168-26.112 13.824t-52.736 12.288-70.656 10.752-77.824 8.704-75.776 5.12-64.512 1.536-64-2.048-74.752-5.12-76.288-7.168-69.12-9.216-53.248-9.728-27.136-9.728Q133.12 936.96 128 898.56t4.096-99.84q5.12-34.816 28.16-53.248t53.248-29.184 63.488-18.944 57.856-24.576q19.456-12.288 30.208-23.552t15.36-22.528 4.608-23.552T384 575.488q-2.048-22.528-14.848-34.816t-28.16-25.6q-8.192-6.144-13.824-17.92t-10.752-24.064q-5.12-13.312-9.216-29.696-2.048-2.048-6.144-7.168-3.072-5.12-7.168-13.824t-9.216-25.088-6.656-29.184.512-22.016q1.024-11.264 5.12-19.456 0-35.84 4.096-71.68 4.096-29.696 13.312-64.512T330.752 128q18.432-25.6 39.936-42.496t44.544-26.112 46.592-12.8 45.056-3.584q23.552 2.048 38.4 5.632t24.064 8.704 15.872 12.288 13.824 14.336h19.456q9.216 0 17.92 2.56t17.408 9.728 18.944 20.48q23.552 30.72 34.816 67.072t16.384 69.12q5.12 37.888 6.144 74.752 2.048 5.12 3.072 12.288t1.536 17.408-1.536 25.6q-2.048 20.48-6.144 32.256t-9.216 17.92q-5.12 7.168-11.264 10.24-4.096 16.384-9.216 29.696-5.12 12.288-10.752 24.064t-13.824 17.92q-17.408 14.336-28.672 24.064t-15.36 33.28q-3.072 14.336-2.048 28.672t7.68 29.184 21.504 28.16 41.472 23.552q23.552 9.216 51.712 16.896t54.272 17.408 46.592 25.088 28.672 39.936zM549.888 747.52q3.072-6.144.512-12.8t-7.68-12.8-12.288-13.312h-47.104q-7.168 7.168-11.264 13.312-4.096 5.12-6.656 11.264t.512 11.264q7.168 14.336 12.288 25.088t11.264 16.896q-2.048 9.216-6.144 26.112t-7.68 34.816-6.144 33.792-2.56 24.064q0 5.12 4.608 12.288t10.752 14.848 12.8 12.8 11.776 5.12 12.288-5.12 13.824-11.776 11.264-14.336 4.608-12.8q0-6.144-3.072-20.992t-6.656-33.28-7.68-35.84-7.168-27.648q6.144-5.12 11.776-14.848t13.824-26.112z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'back-top': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M85.516 108.161a6.773 6.93 0 01-6.753 6.896H38.078a6.746 6.903 0 01-6.752-6.903V59.606H10.973c-7.45 0-9.211-4.387-3.915-9.814L53.643 2.124a6.793 6.951 0 019.563 0l46.584 47.682c5.297 5.406 3.543 9.807-3.928 9.807H85.516V108.161z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'bug': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M127.9 73.1a5 5 0 01-1.5 3.7c-1 1-2.2 1.6-3.6 1.6h-18c0 9.3-1.7 17.1-5.3 23.6l16.6 17a5 5 0 011.6 3.7 5 5 0 01-1.6 3.7c-1 1-2.1 1.5-3.6 1.5-1.4 0-2.6-.5-3.5-1.5l-15.9-16a15.5 15.5 0 01-1.2 1l-3.3 2.3a50.1 50.1 0 01-5.2 3 36.4 36.4 0 01-14.3 3.4v-73H59v73a32.2 32.2 0 01-15-3.8 66.8 66.8 0 01-5.3-3.2c-1.6-1-2.8-2-3.5-2.6l-1.2-1.2-14.6 17a5.1 5.1 0 01-7.3.4c-1-1-1.5-2.3-1.6-3.7 0-1.4.3-2.7 1.2-3.8l16.2-18.5C24.7 94.5 23 87 23 78.4H5.2c-1.3 0-2.5-.6-3.6-1.6S.1 74.5.1 73.1a5 5 0 011.5-3.6c1-1 2.3-1.6 3.6-1.6h18V44l-14-14a5 5 0 01-1.5-3.7 5 5 0 011.5-3.7c1-1 2.2-1.6 3.6-1.6s2.6.6 3.6 1.6l13.8 14.1h67.4l13.8-14.1a4.9 4.9 0 017.2 0 5 5 0 011.5 3.7 5 5 0 01-1.5 3.6L104.9 44v24h17.9c1.4 0 2.6.5 3.6 1.6a5 5 0 011.5 3.6zm-38.3-47H38.4C38.4 19 41 12.9 46 7.8 51 2.7 57 .1 64 .1s13.1 2.5 18 7.6c5 5 7.6 11.2 7.6 18.5z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'chart': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M0 54.9h36.6V128H0V54.9zm91.4-27.5H128V128H91.4V27.4zM45.7 0h36.6v128H45.7V0z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'clipboard': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M54.9 118.9h64V73H89c-1.9 0-3.5-.6-4.8-2-1.3-1.3-2-3-2-4.8V36.6H54.9v82.3zM73 16v-4.6a2.2 2.2 0 00-.6-1.6 2.2 2.2 0 00-1.6-.7H20.6c-.7 0-1.2.3-1.6.7a2.2 2.2 0 00-.7 1.6V16a2.2 2.2 0 00.7 1.6c.4.5 1 .7 1.6.7h50.3c.6 0 1.1-.2 1.6-.7.4-.4.6-1 .6-1.6zm18.3 48h21.4L91.4 42.6V64zm36.6 9.1v48c0 2-.7 3.6-2 4.9-1.3 1.3-3 2-4.9 2H52.6c-2 0-3.6-.7-4.9-2-1.3-1.3-2-3-2-4.9v-11.4H7c-2 0-3.6-.7-4.9-2-1.3-1.3-2-3-2-4.8v-96C0 4.9.7 3.3 2 2 3.3.7 5 0 6.9 0h77.7c1.9 0 3.5.7 4.8 2 1.4 1.3 2 3 2 4.9v23.4c1 .6 1.9 1.3 2.6 2l29.1 29.1c1.4 1.4 2.5 3.2 3.5 5.5s1.4 4.4 1.4 6.3z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'component': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M0 0h54.9v54.9H0V0zm0 73.1h54.9V128H0V73.1zm73.1 0H128V128H73.1V73.1zM100.6 55a27.4 27.4 0 100-54.9 27.4 27.4 0 000 54.9z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'dashboard': {
width: 128,
height: 100,
viewBox: '0 0 128 100',
data: '<path pid="0" d="M27.4 63.6c0-2.5-.9-4.6-2.6-6.4a8.8 8.8 0 00-6.5-2.6c-2.5 0-4.7.8-6.5 2.6a8.7 8.7 0 00-2.7 6.4c0 2.5 1 4.7 2.7 6.5 1.8 1.7 4 2.6 6.5 2.6s4.7-.9 6.5-2.6c1.7-1.8 2.6-4 2.6-6.5zm13.7-31.8c0-2.5-.9-4.6-2.6-6.4a8.8 8.8 0 00-6.5-2.6c-2.5 0-4.7.8-6.5 2.6a8.7 8.7 0 00-2.6 6.4c0 2.5.9 4.7 2.6 6.5 1.8 1.7 4 2.6 6.5 2.6s4.7-.9 6.5-2.6c1.7-1.8 2.6-4 2.6-6.5zM71.7 66L79 38.9c.3-1.3.1-2.4-.5-3.5a4.5 4.5 0 00-8.3 1.2L63 63.7a13.6 13.6 0 108 25.4 13 13 0 006.4-8.4A13.5 13.5 0 0071.7 66zm47.2-2.4c0-2.5-1-4.6-2.7-6.4a8.8 8.8 0 00-6.5-2.6c-2.5 0-4.7.8-6.5 2.6a8.7 8.7 0 00-2.6 6.4c0 2.5.9 4.7 2.7 6.5 1.7 1.7 3.9 2.6 6.4 2.6 2.5 0 4.7-.9 6.5-2.6 1.8-1.8 2.7-4 2.7-6.5zM73 18.2c0-2.5-.8-4.6-2.6-6.4A8.8 8.8 0 0064 9c-2.5 0-4.7 1-6.5 2.7a8.7 8.7 0 00-2.6 6.4c0 2.5.9 4.7 2.6 6.4 1.8 1.8 4 2.7 6.5 2.7s4.7-.9 6.5-2.7c1.7-1.7 2.6-3.9 2.6-6.4zm32 13.6c0-2.5-.8-4.6-2.6-6.4a8.8 8.8 0 00-6.5-2.6c-2.5 0-4.7.8-6.5 2.6a8.7 8.7 0 00-2.6 6.4c0 2.5.8 4.7 2.6 6.5 1.8 1.7 4 2.6 6.5 2.6s4.7-.9 6.5-2.6c1.7-1.8 2.6-4 2.6-6.5zm23 31.8c0 12.4-3.4 23.8-10 34.3-1 1.4-2.3 2-4 2H14c-1.7 0-3-.6-4-2a62.2 62.2 0 01-5-59 63.9 63.9 0 01123 24.7z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'documentation': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M72 44.8h43.9l-44-35.2v35.2zM16 0h64l47.9 38.4v76.8c0 3.4-1.7 6.6-4.7 9-3 2.4-7 3.7-11.3 3.7H16.1c-4.2 0-8.3-1.3-11.3-3.7-3-2.4-4.7-5.6-4.7-9V12.8C.1 5.8 7.2 0 16.1 0zm72 102.4V89.6H16v12.8h72zm24-25.6V64H16v12.8h96z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'drag': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M73.1 29H64h29.7L64 0 34.4 29h20.5v27.1H27.2v18H55v27.1h18V74.1h27.4V56H73.1V29zM64 128l27.5-26.8H36.6l27.3 26.7zM0 65l27.2 27V38.2L0 65zm100.5-26.8V92L128 65l-27.5-26.8z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'edit': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M106.1 67.2a4.8 4.8 0 00-4.8 4.8v46.4H9.6V26.7h50.1a4.8 4.8 0 100-9.6H9.6A9.6 9.6 0 000 26.7v91.7c0 5.3 4.3 9.6 9.6 9.6h91.7c5.3 0 9.6-4.3 9.6-9.6V72c0-2.7-2.1-4.8-4.8-4.8z"/><path pid="1" d="M125.2 13.4L114.6 2.8a9.6 9.6 0 00-13.6 0l-53 53a4.3 4.3 0 00-.9 1.3L33.8 88.5a4.2 4.2 0 001 4.7c1 1.2 2.8 1.7 4.6 1l31.4-13.4c.5-.2 1-.5 1.4-.9l53-53a9.6 9.6 0 000-13.5zm-59 59l-18.4 7.8 7.7-18.4 37.2-37.1 10.6 10.5L66 72.4zm52.1-52.2l-8.2 8.2L99.5 18l8.3-8.3L118.4 20z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'education': {
width: 128,
height: 128,
viewBox: '0 0 128 128',
data: '<path pid="0" d="M88.9 119.6c-7.3 0-19.5 2.5-21.4 8.2v.1c-4.2.2-5.2 0-7 0-2-5.7-14.1-8.2-21.4-8.2H0V0h42.5C51.7 0 59.6 5.5 64 13.6 68.4 5.5 76.3 0 85.5 0H128v119.6H88.9zM60.4 24.8c0-9.7-9-16.5-17.7-16.5H7v103.1h32c7-.1 18.2.1 21.3 6.2V24.8zM121 8.2H85.3c-8.8 0-17.7 6.9-17.7 16.5v92.7c3.1-6 14.2-6.2 21.3-6h32V8.1z"/>'
}
})

View File

@ -0,0 +1,12 @@
/* eslint-disable */
/* tslint:disable */
// @ts-ignore
import icon from 'vue-svgicon'
icon.register({
'email': {
width: 128,
height: 96,
viewBox: '0 0 128 96',
data: '<path pid="0" d="M64.1 57l56-56a12.5 12.5 0 00-4.6-1h-103C10.9 0 9.4.3 8 .8L64 57z"/><path pid="1" d="M64.1 68.3L1.8 6A12.4 12.4 0 000 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.5 12.5 0 00-1.7-6.3L64 68.2z"/>'
}
})

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