project init
3
.eslintignore
Normal file
@ -0,0 +1,3 @@
|
||||
dist/*.js
|
||||
src/assets
|
||||
tests/unit/coverage
|
61
.eslintrc.js
Normal 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
@ -0,0 +1,5 @@
|
||||
node_modules
|
||||
dist
|
||||
app/node_modules
|
||||
.DS_Store
|
||||
app/dist
|
57
README.md
Normal 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
After Width: | Height: | Size: 41 KiB |
130
app/main.js
Normal 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
@ -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
@ -0,0 +1,5 @@
|
||||
const { contextBridge } = require('electron')
|
||||
|
||||
contextBridge.exposeInMainWorld('api', {
|
||||
deleteFile: f => require('fs').unlink(f)
|
||||
})
|
137
app/src/cdnTools.js
Normal 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
@ -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
@ -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
5
babel.config.js
Normal file
@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/app'
|
||||
]
|
||||
}
|
3
cypress.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"pluginsFile": "tests/e2e/plugins/index.js"
|
||||
}
|
6
jest.config.js
Normal 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
@ -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
@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
autoprefixer: {}
|
||||
}
|
||||
}
|
229
public/elib/index.js
Normal 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
After Width: | Height: | Size: 66 KiB |
BIN
public/img/icons/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/img/icons/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
public/img/icons/apple-touch-icon-120x120.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/img/icons/apple-touch-icon-152x152.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/img/icons/apple-touch-icon-180x180.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/img/icons/apple-touch-icon-60x60.png
Normal file
After Width: | Height: | Size: 803 B |
BIN
public/img/icons/apple-touch-icon-76x76.png
Normal file
After Width: | Height: | Size: 964 B |
BIN
public/img/icons/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/img/icons/favicon-16x16.png
Normal file
After Width: | Height: | Size: 480 B |
BIN
public/img/icons/favicon-32x32.png
Normal file
After Width: | Height: | Size: 645 B |
BIN
public/img/icons/msapplication-icon-144x144.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/img/icons/mstile-150x150.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
112
public/img/icons/safari-pinned-tab.svg
Normal 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
@ -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
@ -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
@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
17
public/tinymce/README.md
Normal 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
419
public/tinymce/langs/es.js
Normal 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
@ -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
@ -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 \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"
|
||||
});
|
419
public/tinymce/langs/ko_KR.js
Normal 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"
|
||||
});
|
419
public/tinymce/langs/zh_CN.js
Normal 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"
|
||||
});
|
7
public/tinymce/skins/content.inline.min.css
vendored
Normal file
7
public/tinymce/skins/content.min.css
vendored
Normal file
7
public/tinymce/skins/content.mobile.min.css
vendored
Normal 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}
|
BIN
public/tinymce/skins/fonts/tinymce-mobile.woff
Normal file
7
public/tinymce/skins/skin.min.css
vendored
Normal file
7
public/tinymce/skins/skin.mobile.min.css
vendored
Normal file
13
src/App.vue
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
|
||||
})
|
BIN
src/assets/401-images/401.gif
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
src/assets/404-images/404-cloud.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
src/assets/404-images/404.png
Normal file
After Width: | Height: | Size: 96 KiB |
BIN
src/assets/custom-theme/fonts/element-icons.ttf
Normal file
BIN
src/assets/custom-theme/fonts/element-icons.woff
Normal file
1
src/assets/custom-theme/index.css
Normal file
106
src/components/Breadcrumb/index.vue
Normal 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>
|
105
src/components/ErrorLog/index.vue
Normal 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>
|
37
src/components/Hamburger/index.vue
Normal 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>
|
219
src/components/HeaderSearch/index.vue
Normal 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>
|
78
src/components/LangSelect/index.vue
Normal 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>
|
385
src/components/MaterialInput/index.vue
Normal 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>
|
78
src/components/Pagination/index.vue
Normal 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>
|
124
src/components/PanThumb/index.vue
Normal 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>
|
151
src/components/RightPanel/index.vue
Normal 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>
|
51
src/components/Screenfull/index.vue
Normal 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>
|
70
src/components/SizeSelect/index.vue
Normal 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>
|
83
src/components/Sticky/index.vue
Normal 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>
|
89
src/components/TagInput/index.vue
Normal 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>
|
158
src/components/ThemePicker/index.vue
Normal 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>
|
137
src/components/Tinymce/components/EditorImage.vue
Normal 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>
|
8
src/components/Tinymce/config.ts
Normal 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']
|
228
src/components/Tinymce/index.vue
Normal 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 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>
|
155
src/components/UploadImage/index.vue
Normal 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>
|
60
src/directives/clipboard/index.ts
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
75
src/directives/el-draggable-dialog/index.ts
Normal 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
@ -0,0 +1,5 @@
|
||||
export * from './permission'
|
||||
export * from './el-draggable-dialog'
|
||||
export * from './waves'
|
||||
export * from './clipboard'
|
||||
export * from './role'
|
12
src/directives/permission/index.ts
Normal 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'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
21
src/directives/role/index.ts
Normal 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\']"')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
46
src/directives/waves/index.ts
Normal 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)
|
||||
}
|
||||
}
|
26
src/directives/waves/waves.css
Normal 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
@ -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
@ -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)
|
12
src/icons/components/404.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/admin.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/back-top.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/bug.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/chart.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/clipboard.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/component.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/dashboard.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/documentation.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/drag.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/edit.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/education.ts
Normal 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"/>'
|
||||
}
|
||||
})
|
12
src/icons/components/email.ts
Normal 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"/>'
|
||||
}
|
||||
})
|