diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index 6fe96f01..00000000
--- a/.babelrc
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "comments": false,
- "env": {
- "test": {
- "presets": [
- ["@babel/preset-env", {
- "targets": { "node": 10 }
- }]
- ],
- "plugins": [
- "istanbul",
- "@babel/plugin-proposal-class-properties",
- "@babel/plugin-proposal-object-rest-spread",
- "@babel/plugin-transform-runtime"
- ]
- },
- "main": {
- "presets": [
- ["@babel/preset-env", {
- "targets": { "node": 10 }
- }]
- ],
- "plugins": [
- "@babel/plugin-proposal-class-properties",
- "@babel/plugin-proposal-object-rest-spread",
- "@babel/plugin-transform-runtime"
- ]
- },
- "renderer": {
- "presets": [
- ["@babel/preset-env", {
- "modules": false,
- "targets": { "electron": "6" }
- }]
- ],
- "plugins": [
- "@babel/plugin-proposal-class-properties",
- "@babel/plugin-proposal-object-rest-spread",
- "@babel/plugin-transform-runtime"
- ]
- },
- "web": {
- "presets": [
- ["@babel/preset-env", {
- "modules": false
- }]
- ],
- "plugins": [
- "@babel/plugin-proposal-class-properties",
- "@babel/plugin-proposal-object-rest-spread",
- "@babel/plugin-transform-runtime"
- ]
- }
- }
-}
diff --git a/.electron-vue/build.js b/.electron-vue/build.js
deleted file mode 100644
index 23df1ac3..00000000
--- a/.electron-vue/build.js
+++ /dev/null
@@ -1,95 +0,0 @@
-'use strict'
-
-process.env.NODE_ENV = 'production'
-
-const { say } = require('cfonts')
-const chalk = require('chalk')
-const del = require('del')
-const { spawn } = require('child_process')
-const webpack = require('webpack')
-const Listr = require('listr')
-
-const mainConfig = require('./webpack.main.config')
-const rendererConfig = require('./webpack.renderer.config')
-
-const doneLog = chalk.bgGreen.white(' DONE ') + ' '
-const errorLog = chalk.bgRed.white(' ERROR ') + ' '
-const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
-const isCI = process.env.CI || false
-
-if (process.env.BUILD_TARGET === 'clean') clean()
-else build()
-
-function clean() {
- del.sync(['build/*', '!build/icons', '!build/icons/icon.*', '!build/sounds', '!build/sounds/*', '!build/notarize.js'])
- del.sync(['packages/*', '!packages/universal.js', '!packages/packager.js', "!packages/socialwhalebirdapp_MAS.provisionprofile"])
- console.log(`\n${doneLog}\n`)
- process.exit()
-}
-
-async function build() {
- del.sync(['dist/electron/*', '!.gitkeep'])
-
- let results = ''
-
- const tasks = new Listr(
- [
- {
- title: 'building master process',
- task: async () => {
- await pack(mainConfig).catch(err => {
- console.log(`\n ${errorLog}failed to build main process`)
- console.error(`\n${err}\n`)
- })
- }
- },
- {
- title: 'building renderer process',
- task: async () => {
- await pack(rendererConfig).catch(err => {
- console.log(`\n ${errorLog}failed to build renderer process`)
- console.error(`\n${err}\n`)
- })
- }
- }
- ],
- { concurrent: 2 }
- )
-
- await tasks
- .run()
- .then(() => {
- process.stdout.write('\x1B[2J\x1B[0f')
- console.log(`\n\n${results}`)
- process.exit()
- })
- .catch(err => {
- process.exit(1)
- })
-}
-
-function pack(config) {
- return new Promise((resolve, reject) => {
- config.mode = 'production'
- webpack(config, (err, stats) => {
- if (err) reject(err.stack || err)
- else if (stats.hasErrors()) {
- let err = ''
-
- stats
- .toString({
- chunks: false,
- colors: true
- })
- .split(/\r?\n/)
- .forEach(line => {
- err += ` ${line}\n`
- })
-
- reject(err)
- } else {
- resolve(null)
- }
- })
- })
-}
diff --git a/.electron-vue/dev-client.js b/.electron-vue/dev-client.js
deleted file mode 100644
index 2913ea4b..00000000
--- a/.electron-vue/dev-client.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
-
-hotClient.subscribe(event => {
- /**
- * Reload browser when HTMLWebpackPlugin emits a new index.html
- *
- * Currently disabled until jantimon/html-webpack-plugin#680 is resolved.
- * https://github.com/SimulatedGREG/electron-vue/issues/437
- * https://github.com/jantimon/html-webpack-plugin/issues/680
- */
- // if (event.action === 'reload') {
- // window.location.reload()
- // }
-
- /**
- * Notify `mainWindow` when `main` process is compiling,
- * giving notice for an expected reload of the `electron` process
- */
- if (event.action === 'compiling') {
- document.body.innerHTML += `
-
-
-
- Compiling Main Process...
-
- `
- }
-})
diff --git a/.electron-vue/dev-runner.js b/.electron-vue/dev-runner.js
deleted file mode 100644
index a4030975..00000000
--- a/.electron-vue/dev-runner.js
+++ /dev/null
@@ -1,177 +0,0 @@
-'use strict'
-
-const clc = require('cli-color')
-const electron = require('electron')
-const path = require('path')
-const { say } = require('cfonts')
-const { spawn } = require('child_process')
-const webpack = require('webpack')
-const WebpackDevServer = require('webpack-dev-server')
-const webpackHotMiddleware = require('webpack-hot-middleware')
-
-const mainConfig = require('./webpack.main.config')
-const rendererConfig = require('./webpack.renderer.config')
-
-let electronProcess = null
-let manualRestart = false
-let hotMiddleware
-
-function logStats(proc, data) {
- let log = ''
-
- log += clc.yellow.bold(`┏ ${proc} Process ${new Array(19 - proc.length + 1).join('-')}`)
- log += '\n\n'
-
- if (typeof data === 'object') {
- data
- .toString({
- colors: true,
- chunks: false
- })
- .split(/\r?\n/)
- .forEach(line => {
- log += ' ' + line + '\n'
- })
- } else {
- log += ` ${data}\n`
- }
-
- log += '\n' + clc.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n'
-
- console.log(log)
-}
-
-function startRenderer() {
- return new Promise((resolve, reject) => {
- rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
- rendererConfig.mode = 'development'
- const compiler = webpack(rendererConfig)
- hotMiddleware = webpackHotMiddleware(compiler, {
- log: false,
- heartbeat: 2500
- })
-
- compiler.hooks.compilation.tap('compilation', compilation => {
- const HtmlWebpackPlugin = require('html-webpack-plugin')
- HtmlWebpackPlugin.getHooks(compilation).afterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
- hotMiddleware.publish({ action: 'reload' })
- cb()
- })
- })
-
- compiler.hooks.done.tap('done', stats => {
- logStats('Renderer', stats)
- })
-
- const server = new WebpackDevServer(
- {
- static: {
- directory: path.resolve(__dirname, '../')
- },
- setupMiddlewares: function (middlewares, devServer) {
- middlewares.unshift(hotMiddleware)
- devServer.middleware.waitUntilValid(() => {
- resolve()
- })
- return middlewares
- },
- port: 9080
- },
- compiler
- )
-
- server.start()
- })
-}
-
-function startMain() {
- return new Promise((resolve, reject) => {
- mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.ts')].concat(mainConfig.entry.main)
- mainConfig.mode = 'development'
- const compiler = webpack(mainConfig)
-
- compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
- logStats('Main', clc.white.bold('compiling...'))
- hotMiddleware.publish({ action: 'compiling' })
- done()
- })
-
- compiler.watch({}, (err, stats) => {
- if (err) {
- console.log(err)
- return
- }
-
- logStats('Main', stats)
-
- resolve()
- })
- })
-}
-
-function startElectron() {
- var args = ['--inspect=5858', path.join(__dirname, '../dist/electron/main.js')]
-
- // detect yarn or npm and process commandline args accordingly
- if (process.env.npm_execpath.endsWith('yarn.js')) {
- args = args.concat(process.argv.slice(3))
- } else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
- args = args.concat(process.argv.slice(2))
- }
-
- electronProcess = spawn(electron, args)
-
- electronProcess.stdout.on('data', data => {
- electronLog(data, 'blue')
- })
- electronProcess.stderr.on('data', data => {
- electronLog(data, 'red')
- })
-
- electronProcess.on('close', () => {
- if (!manualRestart) process.exit()
- })
-}
-
-function electronLog(data, color) {
- let log = ''
- data = data.toString().split(/\r?\n/)
- data.forEach(line => {
- log += ` ${line}\n`
- })
- if (/[0-9A-z]+/.test(log)) {
- console.log(clc[color].bold('┏ Electron -------------------') + '\n\n' + log + clc[color].bold('┗ ----------------------------') + '\n')
- }
-}
-
-function greeting() {
- const cols = process.stdout.columns
- let text = ''
-
- if (cols > 104) text = 'electron-vue'
- else if (cols > 76) text = 'electron-|vue'
- else text = false
-
- if (text) {
- say(text, {
- colors: ['yellow'],
- font: 'simple3d',
- space: false
- })
- } else console.log(clc.yellow.bold('\n electron-vue'))
- console.log(clc.blue(' getting ready...') + '\n')
-}
-
-function init() {
- greeting()
-
- Promise.all([startRenderer(), startMain()])
- .then(() => {
- startElectron()
- })
- .catch(err => {
- console.error(err)
- })
-}
-
-init()
diff --git a/.electron-vue/webpack.main.config.js b/.electron-vue/webpack.main.config.js
deleted file mode 100644
index 3ca31471..00000000
--- a/.electron-vue/webpack.main.config.js
+++ /dev/null
@@ -1,105 +0,0 @@
-'use strict'
-
-process.env.BABEL_ENV = 'main'
-
-const path = require('path')
-const { dependencies } = require('../package.json')
-const webpack = require('webpack')
-
-const CopyWebpackPlugin = require('copy-webpack-plugin')
-
-let mainConfig = {
- entry: {
- main: path.join(__dirname, '../src/main/index.ts'),
- preload: path.join(__dirname, '../src/main/preload.js')
- },
- externals: [...Object.keys(dependencies || {})],
- module: {
- rules: [
- {
- test: /\.ts$/,
- exclude: /node_modules/,
- use: [
- {
- loader: 'ts-loader',
- options: {
- transpileOnly: true
- }
- }
- ]
- },
- {
- test: /\.js$/,
- use: 'babel-loader',
- exclude: /node_modules/
- },
- {
- test: /\.node$/,
- use: 'node-loader'
- },
- {
- test: /\.json$/,
- exclude: /node_modules/,
- use: 'json-loader',
- type: 'javascript/auto'
- }
- ]
- },
- node: {
- __dirname: process.env.NODE_ENV !== 'production',
- __filename: process.env.NODE_ENV !== 'production'
- },
- output: {
- filename: '[name].js',
- libraryTarget: 'commonjs2',
- path: path.join(__dirname, '../dist/electron')
- },
- plugins: [
- new webpack.NoEmitOnErrorsPlugin(),
- new CopyWebpackPlugin({
- patterns: [
- {
- from: path.join(__dirname, '../src/config/locales'),
- to: path.join(__dirname, '../dist/electron/locales'),
- globOptions: {
- ignore: ['.*', '*~']
- }
- }
- ]
- })
- ],
- resolve: {
- alias: {
- // Same as tsconfig.json
- '@': path.join(__dirname, '../src/renderer'),
- '~': path.join(__dirname, '../')
- },
- extensions: ['.js', '.json', '.node', '.ts']
- },
- target: 'electron-main'
-}
-
-/**
- * Adjust mainConfig for development settings
- */
-if (process.env.NODE_ENV !== 'production') {
- mainConfig.plugins.push(
- new webpack.DefinePlugin({
- __static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
- })
- )
-}
-
-/**
- * Adjust mainConfig for production settings
- */
-if (process.env.NODE_ENV === 'production') {
- mainConfig.mode = 'production'
- mainConfig.plugins.push(
- new webpack.DefinePlugin({
- 'process.env.NODE_ENV': '"production"'
- })
- )
-}
-
-module.exports = mainConfig
diff --git a/.electron-vue/webpack.renderer.config.js b/.electron-vue/webpack.renderer.config.js
deleted file mode 100644
index 96d66111..00000000
--- a/.electron-vue/webpack.renderer.config.js
+++ /dev/null
@@ -1,262 +0,0 @@
-'use strict'
-
-process.env.BABEL_ENV = 'renderer'
-
-const path = require('path')
-const { dependencies } = require('../package.json')
-const webpack = require('webpack')
-
-const CopyWebpackPlugin = require('copy-webpack-plugin')
-const MiniCssExtractPlugin = require('mini-css-extract-plugin')
-const HtmlWebpackPlugin = require('html-webpack-plugin')
-const { VueLoaderPlugin } = require('vue-loader')
-
-let rendererConfig = {
- entry: {
- renderer: path.join(__dirname, '../src/renderer/main.ts')
- },
- module: {
- rules: [
- {
- test: /\.m?js$/,
- resolve: {
- fullySpecified: false
- }
- },
- {
- test: /\.vue$/,
- use: {
- loader: 'vue-loader',
- options: {
- extractCSS: process.env.NODE_ENV === 'production',
- esModule: true,
- optimizeSSR: false
- }
- }
- },
- {
- test: /\.scss$/,
- use: [
- 'vue-style-loader',
- {
- loader: 'css-loader',
- options: {
- modules: false,
- esModule: false
- }
- },
- 'sass-loader'
- ]
- },
- {
- test: /\.sass$/,
- use: [
- 'vue-style-loader',
-
- {
- loader: 'css-loader',
- options: {
- modules: false,
- esModule: false
- }
- },
- 'sass-loader?indentedSyntax'
- ]
- },
- {
- test: /\.less$/,
- use: [
- 'vue-style-loader',
- {
- loader: 'css-loader',
- options: {
- modules: false,
- esModule: false
- }
- },
- 'less-loader'
- ]
- },
- {
- test: /\.css$/,
- use: [
- 'vue-style-loader',
- {
- loader: 'css-loader',
- options: {
- modules: false,
- esModule: false
- }
- }
- ]
- },
- {
- test: /\.html$/,
- use: 'vue-html-loader'
- },
- {
- test: /\.ts$/,
- exclude: /node_modules/,
- use: [
- {
- loader: 'babel-loader?cacheDirectory'
- },
- {
- loader: 'ts-loader',
- options: {
- appendTsSuffixTo: [/\.vue$/],
- transpileOnly: true
- }
- }
- ]
- },
- {
- test: /\.js$/,
- use: 'babel-loader?cacheDirectory',
- exclude: /node_modules/
- },
- {
- test: /\.node$/,
- use: 'node-loader'
- },
- {
- test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- use: {
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'imgs/[name]--[folder].[ext]',
- esModule: false
- }
- }
- },
- {
- test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'media/[name]--[folder].[ext]'
- }
- },
- {
- test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- use: {
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'fonts/[name]--[folder].[ext]'
- }
- }
- },
- {
- test: /\.json$/,
- exclude: /node_modules/,
- use: 'json-loader',
- type: 'javascript/auto'
- }
- ]
- },
- node: {
- __dirname: process.env.NODE_ENV !== 'production',
- __filename: process.env.NODE_ENV !== 'production'
- },
- devServer: {
- hot: true,
- hotOnly: true
- },
- plugins: [
- new VueLoaderPlugin(),
- new MiniCssExtractPlugin({ filename: 'styles.css' }),
- new HtmlWebpackPlugin({
- filename: 'index.html',
- template: path.resolve(__dirname, '../src/index.ejs'),
- minify: {
- collapseWhitespace: true,
- removeAttributeQuotes: true,
- removeComments: true
- },
- nodeModules: process.env.NODE_ENV !== 'production' ? path.resolve(__dirname, '../node_modules') : false
- }),
- new webpack.NoEmitOnErrorsPlugin(),
- new webpack.DefinePlugin({
- 'process.browser': true,
- 'process.env.NODE_DEBUG': false
- }),
- new webpack.ProvidePlugin({
- Buffer: ['buffer', 'Buffer']
- }),
- new webpack.ProvidePlugin({
- process: 'process/browser'
- })
- ],
- output: {
- filename: '[name].js',
- path: path.join(__dirname, '../dist/electron')
- },
- resolve: {
- alias: {
- // Same as tsconfig.json
- '@': path.join(__dirname, '../src/renderer'),
- '~': path.join(__dirname, '../')
- },
- extensions: ['.ts', '.js', '.vue', '.json', '.css', '.node'],
- fallback: {
- timers: require.resolve('timers-browserify'),
- url: require.resolve('url/'),
- assert: require.resolve('assert/'),
- buffer: require.resolve('buffer/'),
- os: require.resolve('os-browserify/browser'),
- path: require.resolve('path-browserify'),
- crypto: require.resolve('crypto-browserify'),
- http: require.resolve('stream-http'),
- https: require.resolve('https-browserify'),
- stream: require.resolve('stream-browserify'),
- zlib: require.resolve('browserify-zlib'),
- net: false,
- tls: false,
- fs: false,
- dns: false
- }
- },
- target: 'web'
-}
-
-/**
- * Adjust rendererConfig for development settings
- */
-if (process.env.NODE_ENV !== 'production') {
- rendererConfig.plugins.push(
- new webpack.DefinePlugin({
- __static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
- })
- )
- rendererConfig.devtool = 'eval-cheap-module-source-map'
-}
-
-/**
- * Adjust rendererConfig for production settings
- */
-if (process.env.NODE_ENV === 'production') {
- rendererConfig.mode = 'production'
- rendererConfig.plugins.push(
- new CopyWebpackPlugin({
- patterns: [
- {
- from: path.join(__dirname, '../static'),
- to: path.join(__dirname, '../dist/electron/static'),
- globOptions: {
- ignore: ['.*', '*~']
- }
- }
- ]
- }),
- new webpack.DefinePlugin({
- 'process.env.NODE_ENV': '"production"'
- }),
- new webpack.LoaderOptionsPlugin({
- minimize: true
- })
- )
-}
-
-module.exports = rendererConfig
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 3659f1ad..00000000
--- a/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/*
-dist/*
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 7f910044..00000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,42 +0,0 @@
-module.exports = {
- root: true,
- parser: 'vue-eslint-parser',
- parserOptions: {
- parser: '@typescript-eslint/parser',
- sourceType: 'module',
- ecmaVersion: 12
- },
- env: {
- browser: true,
- node: true,
- es2021: true
- },
- extends: ['eslint:recommended', 'plugin:vue/vue3-recommended', '@vue/typescript/recommended', 'prettier'],
- globals: {
- __static: true
- },
- plugins: ['@typescript-eslint', 'vue'],
- rules: {
- // allow paren-less arrow functions
- 'arrow-parens': 0,
- // allow async-await
- 'generator-star-spacing': 0,
- // allow debugger during development
- 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
- 'no-unused-vars': 'off',
- '@typescript-eslint/no-unused-vars': [
- 'error',
- {
- argsIgnorePattern: '^_'
- }
- ],
- '@typescript-eslint/no-explicit-any': 'off',
- camelcase: 'off',
- '@typescript-eslint/camelcase': 'off',
- 'space-before-function-paren': 'off',
- 'vue/multi-word-component-names': 'off',
- 'vue/attributes-order': 'off',
- 'vue/attribute-hyphenation': 'off',
- 'vue/no-v-html': 'off'
- }
-}
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 65453a6f..00000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-github: h3poteto
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 02831e10..00000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: ''
-labels: bug
-assignees: ''
-
----
-
-## Description
-
-
-
-## How To Reproduce
-1.
-2.
-3.
-
-## Your Environment
- - OS: [e.g. MacOS]
- - Whalebird Version: [e.g. 1.0.0]
- - Instance: [e.g. mastodon.social]
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index a758b5e6..00000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: ''
-labels: 'feature'
-assignees: ''
-
----
-
-## Describe
-
-
-## Why
-
diff --git a/.github/ISSUE_TEMPLATE/other-request.md b/.github/ISSUE_TEMPLATE/other-request.md
deleted file mode 100644
index fa9546b8..00000000
--- a/.github/ISSUE_TEMPLATE/other-request.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-name: Other request
-about: Free format issue template
-title: ''
-labels: ''
-assignees: ''
-
----
-
-
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index afcc71f8..00000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,8 +0,0 @@
-## Description
-
-
-## Related Issues
-
-
-## Appearance
-
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 19939002..00000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: Build
-
-on:
- push:
- branches:
- - master
-
- pull_request:
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@master
- - uses: actions/setup-node@v3
- with:
- node-version: 18
- - name: Install
- run: |
- yarn install
- - name: typecheck
- run: |
- yarn run typecheck
- - name: Test
- run: |
- yarn run spec
- - name: Compile main
- run: |
- yarn run pack:main
- - name: Compile renderer
- run: |
- yarn run pack:renderer
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 02e9df87..00000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,110 +0,0 @@
-name: Release
-
-on:
- push:
- tags:
- - 'v*'
-
-jobs:
- release-linux:
- runs-on: ubuntu-latest
- timeout-minutes: 40
-
- env:
- SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.STORE_LOGIN }}
-
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: yarn
- - name: Build
- run: |
- make install
- make clean
- make build
-
- - name: Install Snapcraft
- uses: samuelmeuli/action-snapcraft@v2
-
- - name: Release
- uses: samuelmeuli/action-electron-builder@v1
- with:
- skip_build: true
- # GitHub token, automatically provided to the action
- # (No need to define this secret in the repo settings)
- github_token: ${{ secrets.github_token }}
-
- # If the commit is tagged with a version (e.g. "v1.0.0"),
- # release the app after building
- release: ${{ startsWith(github.ref, 'refs/tags/v') }}
-
- release-windows:
- runs-on: windows-latest
- timeout-minutes: 40
-
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: yarn
- - name: Build
- run: |
- make install
- make clean
- make build
-
- - name: Release
- uses: samuelmeuli/action-electron-builder@v1
- with:
- skip_build: true
- # GitHub token, automatically provided to the action
- # (No need to define this secret in the repo settings)
- github_token: ${{ secrets.github_token }}
-
- # If the commit is tagged with a version (e.g. "v1.0.0"),
- # release the app after building
- release: ${{ startsWith(github.ref, 'refs/tags/v') }}
-
-
- release-macos:
- runs-on: macos-latest
- timeout-minutes: 40
-
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-node@v3
- with:
- node-version: '18'
- cache: yarn
-
- - name: Apple Codesigning
- uses: apple-actions/import-codesign-certs@v2
- with:
- p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
- p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
-
- - name: Build
- run: |
- make install
- make clean
- make build
-
- - name: Release
- uses: samuelmeuli/action-electron-builder@v1
- env:
- APPLE_ID: ${{ secrets.APPLE_ID }}
- APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
- ASC_PROVIDER: ${{ secrets.ASC_PROVIDER }}
- TEAM_ID: ${{ secrets.ASC_PROVIDER }}
- with:
- skip_build: true
- # GitHub token, automatically provided to the action
- # (No need to define this secret in the repo settings)
- github_token: ${{ secrets.github_token }}
-
- # If the commit is tagged with a version (e.g. "v1.0.0"),
- # release the app after building
- release: ${{ startsWith(github.ref, 'refs/tags/v') }}
diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml
deleted file mode 100644
index 691aa062..00000000
--- a/.github/workflows/reviewdog.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: reviewdog
-
-on:
- pull_request:
-
-permissions:
- pull-requests: write
-
-jobs:
- eslint:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@master
- - uses: actions/setup-node@v3
- with:
- node-version: 18
- - name: Install
- run: |
- yarn install
- - uses: reviewdog/action-setup@v1
- - name: Run eslint
- env:
- REVIEWDOG_GITHUB_API_TOKEN: ${{ github.token }}
- run: |
- yarn run lint:eslint | reviewdog -f=eslint -reporter=github-pr-review -fail-on-error=true
-
- stylelint:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@master
- - uses: actions/setup-node@v3
- with:
- node-version: 18
- - name: Install
- run: |
- yarn install
- - uses: reviewdog/action-setup@v1
- - name: Run stylelint
- env:
- REVIEWDOG_GITHUB_API_TOKEN: ${{ github.token }}
- run: |
- yarn run lint:stylelint --no-color | reviewdog -f=stylelint -reporter=github-pr-review -level=error -filter-mode=nofilter -fail-on-error=false
diff --git a/.github/workflows/thirdparty.yml b/.github/workflows/thirdparty.yml
deleted file mode 100644
index dfa9de84..00000000
--- a/.github/workflows/thirdparty.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Thirdparty
-
-on:
- schedule:
- - cron: '54 10 * * *'
-
-permissions:
- contents: write
- pull-requests: write
-
-jobs:
- update:
- runs-on: ubuntu-latest
- timeout-minutes: 10
-
- steps:
- - uses: actions/setup-node@v3
- with:
- node-version: 18
- - uses: actions/checkout@v4
- - name: Install packages
- run: |
- yarn install
- npm install -g license-checker
- - name: Check
- run: |
- yarn run thirdparty
- - uses: peter-evans/create-pull-request@v5
- with:
- commit-message: "[Auto update] Thirdparty libraries list"
- branch: auto-update/thirdparty
- base: master
- delete-branch: true
- title: "[Auto update] Thirdparty libraries list"
diff --git a/.gitignore b/.gitignore
index e14ad718..956f56fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,5 @@
-.DS_Store
-dist/electron/*
-dist/web/*
-build/*
-!build/icons
-coverage
-node_modules/
-npm-debug.log
-npm-debug.log.*
-thumbs.db
-packages/*
-!.gitkeep
-*.db
-*.provisionprofile
-/thirdparty.json
\ No newline at end of file
+node_modules
+*.log
+.next
+app
+dist
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 076d681c..00000000
--- a/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-@h3poteto:registry=https://npm.pkg.github.com
diff --git a/.prettierrc b/.prettierrc
index 93a4b3df..bb0bc5c3 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -5,4 +5,4 @@
"printWidth": 140,
"trailingComma": "none",
"arrowParens": "avoid"
-}
+}
\ No newline at end of file
diff --git a/.stylelintignore b/.stylelintignore
deleted file mode 100644
index ee8ec9ea..00000000
--- a/.stylelintignore
+++ /dev/null
@@ -1,5 +0,0 @@
-node_modules
-dist
-build
-packages
-.electron-vue
diff --git a/.stylelintrc.json b/.stylelintrc.json
deleted file mode 100644
index cd47c3ad..00000000
--- a/.stylelintrc.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "extends": ["stylelint-config-html/vue", "stylelint-config-standard", "stylelint-config-prettier"],
- "overrides": [
- {
- "customSyntax": "postcss-scss",
- "files": ["**/*.scss"]
- }
- ],
- "rules": {
- "alpha-value-notation": "number",
- "color-function-notation": "legacy",
- "color-hex-length": null,
- "no-descending-specificity": null,
- "no-empty-source": null,
- "selector-class-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$",
- "selector-id-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$",
- "selector-pseudo-class-no-unknown": [
- true,
- {
- "ignorePseudoClasses": ["deep"]
- }
- ],
- "shorthand-property-no-redundant-values": null
- }
-}
diff --git a/.tool-versions b/.tool-versions
deleted file mode 100644
index 8f2e342a..00000000
--- a/.tool-versions
+++ /dev/null
@@ -1 +0,0 @@
-nodejs 18.18.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 4e7fc057..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,1884 +0,0 @@
-# Change Log
-
-## [4.3.4] - 2021-02-18
-### Changed
-- [#2157](https://github.com/h3poteto/whalebird-desktop/pull/2157) build(deps): Bump i18next from 19.8.7 to 19.8.8
-- [#2154](https://github.com/h3poteto/whalebird-desktop/pull/2154) build(deps-dev): Bump @typescript-eslint/parser from 4.14.2 to 4.15.1
-- [#2147](https://github.com/h3poteto/whalebird-desktop/pull/2147) build(deps-dev): Bump eslint from 7.19.0 to 7.20.0
-- [#2152](https://github.com/h3poteto/whalebird-desktop/pull/2152) build(deps-dev): Bump @typescript-eslint/typescript-estree from 4.14.2 to 4.15.1
-- [#2150](https://github.com/h3poteto/whalebird-desktop/pull/2150) build(deps-dev): Bump @typescript-eslint/eslint-plugin from 4.14.2 to 4.15.1
-- [#2153](https://github.com/h3poteto/whalebird-desktop/pull/2153) build(deps-dev): Bump mini-css-extract-plugin from 1.3.5 to 1.3.7
-- [#2148](https://github.com/h3poteto/whalebird-desktop/pull/2148) build(deps-dev): Bump @types/node from 14.14.25 to 14.14.28
-- [#2142](https://github.com/h3poteto/whalebird-desktop/pull/2142) build(deps-dev): Bump stylelint from 13.9.0 to 13.10.0
-- [#2146](https://github.com/h3poteto/whalebird-desktop/pull/2146) build(deps-dev): Bump eslint-plugin-vue from 7.5.0 to 7.6.0
-- [#2144](https://github.com/h3poteto/whalebird-desktop/pull/2144) build(deps-dev): Bump @babel/preset-env from 7.12.13 to 7.12.16
-- [#2141](https://github.com/h3poteto/whalebird-desktop/pull/2141) build(deps-dev): Bump ajv from 7.0.4 to 7.1.0
-- [#2139](https://github.com/h3poteto/whalebird-desktop/pull/2139) build(deps-dev): Bump ts-loader from 8.0.15 to 8.0.17
-- [#2140](https://github.com/h3poteto/whalebird-desktop/pull/2140) build(deps-dev): Bump @babel/core from 7.12.13 to 7.12.16
-- [#2131](https://github.com/h3poteto/whalebird-desktop/pull/2131) build(deps-dev): Bump css-loader from 5.0.1 to 5.0.2
-- [#2138](https://github.com/h3poteto/whalebird-desktop/pull/2138) build(deps-dev): Bump eslint-plugin-promise from 4.2.1 to 4.3.1
-- [#2136](https://github.com/h3poteto/whalebird-desktop/pull/2136) build(deps-dev): Bump ts-jest from 26.5.0 to 26.5.1
-- [#2126](https://github.com/h3poteto/whalebird-desktop/pull/2126) build(deps-dev): Bump electron from 11.2.2 to 11.2.3
-- [#2156](https://github.com/h3poteto/whalebird-desktop/pull/2156) Use NotificationType of megalodon to handle notifications
-- [#2155](https://github.com/h3poteto/whalebird-desktop/pull/2155) build(deps): Bump megalodon from 3.3.3 to 3.4.0
-
-### Fixed
-- [#2149](https://github.com/h3poteto/whalebird-desktop/pull/2149) refs #2145 Divide quit application menu item to quit app in macOS
-
-## [4.3.3] - 2021-02-08
-### Added
-- [#2078](https://github.com/h3poteto/whalebird-desktop/pull/2078) refs #2024 Add help command for cli interface
-- [#2075](https://github.com/h3poteto/whalebird-desktop/pull/2075) closes #2068 Add delete button for list
-- [#2074](https://github.com/h3poteto/whalebird-desktop/pull/2074) closes #2028 Add a configuration item to disable spellchecker
-- [#2071](https://github.com/h3poteto/whalebird-desktop/pull/2071) closes #2035 Add a notice for toot visibility settings
-
-### Changed
-- [#2124](https://github.com/h3poteto/whalebird-desktop/pull/2124) build(deps-dev): Bump @types/node from 14.14.22 to 14.14.25
-- [#2123](https://github.com/h3poteto/whalebird-desktop/pull/2123) build(deps-dev): Bump @babel/plugin-transform-runtime from 7.12.13 to 7.12.15
-- [#2122](https://github.com/h3poteto/whalebird-desktop/pull/2122) build(deps-dev): Bump chai from 4.2.0 to 4.3.0
-- [#2120](https://github.com/h3poteto/whalebird-desktop/pull/2120) build(deps-dev): Bump @vue/test-utils from 1.1.2 to 1.1.3
-- [#2119](https://github.com/h3poteto/whalebird-desktop/pull/2119) build(deps-dev): Bump ts-loader from 8.0.14 to 8.0.15
-- [#2117](https://github.com/h3poteto/whalebird-desktop/pull/2117) build(deps): Bump vue-router from 3.4.9 to 3.5.1
-- [#2116](https://github.com/h3poteto/whalebird-desktop/pull/2116) Use unicode-emoji-json instead of emojilib
-- [#2107](https://github.com/h3poteto/whalebird-desktop/pull/2107) build(deps-dev): Bump all-object-keys from 2.1.1 to 2.2.0
-- [#2105](https://github.com/h3poteto/whalebird-desktop/pull/2105) build(deps-dev): Bump eslint from 7.17.0 to 7.19.0
-- [#2115](https://github.com/h3poteto/whalebird-desktop/pull/2115) Use --node-env in webpack-cli instead of cross-env in pack command
-- [#2101](https://github.com/h3poteto/whalebird-desktop/pull/2101) build(deps-dev): Bump electron from 11.2.0 to 11.2.2
-- [#2113](https://github.com/h3poteto/whalebird-desktop/pull/2113) build(deps-dev): Bump @babel/runtime from 7.12.5 to 7.12.13
-- [#2110](https://github.com/h3poteto/whalebird-desktop/pull/2110) build(deps-dev): Bump stylelint from 13.8.0 to 13.9.0
-- [#2108](https://github.com/h3poteto/whalebird-desktop/pull/2108) build(deps): Bump megalodon from 3.3.2 to 3.3.3
-- [#2106](https://github.com/h3poteto/whalebird-desktop/pull/2106) build(deps): Bump element-ui from 2.14.1 to 2.15.0
-- [#2114](https://github.com/h3poteto/whalebird-desktop/pull/2114) Bump @typescript-eslint from 3.10.1 to 4.14.2
-- [#2112](https://github.com/h3poteto/whalebird-desktop/pull/2112) build(deps-dev): Bump eslint-plugin-vue from 7.4.1 to 7.5.0
-- [#2111](https://github.com/h3poteto/whalebird-desktop/pull/2111) build(deps-dev): Bump core-js from 3.8.2 to 3.8.3
-- [#2104](https://github.com/h3poteto/whalebird-desktop/pull/2104) build(deps): Bump sanitize-html from 2.3.0 to 2.3.2
-- [#2103](https://github.com/h3poteto/whalebird-desktop/pull/2103) build(deps): Bump vuex from 3.6.0 to 3.6.2
-- [#2102](https://github.com/h3poteto/whalebird-desktop/pull/2102) build(deps-dev): Bump eslint-config-prettier from 7.1.0 to 7.2.0
-- [#2100](https://github.com/h3poteto/whalebird-desktop/pull/2100) build(deps-dev): Bump ts-jest from 26.4.4 to 26.5.0
-- [#2099](https://github.com/h3poteto/whalebird-desktop/pull/2099) build(deps-dev): Bump cfonts from 2.8.6 to 2.9.1
-- [#2098](https://github.com/h3poteto/whalebird-desktop/pull/2098) build(deps): Bump i18next from 19.8.4 to 19.8.7
-- [#2097](https://github.com/h3poteto/whalebird-desktop/pull/2097) build(deps): Bump electron-log from 4.3.0 to 4.3.1
-- [#2095](https://github.com/h3poteto/whalebird-desktop/pull/2095) build(deps-dev): Bump webpack-cli from 4.2.0 to 4.5.0
-- [#2094](https://github.com/h3poteto/whalebird-desktop/pull/2094) build(deps-dev): Bump @babel/plugin-transform-runtime from 7.12.1 to 7.12.13
-- [#2093](https://github.com/h3poteto/whalebird-desktop/pull/2093) build(deps-dev): Bump @babel/core from 7.12.9 to 7.12.13
-- [#2090](https://github.com/h3poteto/whalebird-desktop/pull/2090) build(deps-dev): Bump ajv from 6.12.6 to 7.0.4
-- [#2048](https://github.com/h3poteto/whalebird-desktop/pull/2048) build(deps-dev): Bump webpack-dev-server from 3.11.0 to 3.11.2
-- [#2092](https://github.com/h3poteto/whalebird-desktop/pull/2092) build(deps-dev): Bump @babel/preset-env from 7.12.7 to 7.12.13
-- [#2086](https://github.com/h3poteto/whalebird-desktop/pull/2086) build(deps-dev): Bump mini-css-extract-plugin from 1.3.3 to 1.3.5
-- [#2066](https://github.com/h3poteto/whalebird-desktop/pull/2066) build(deps-dev): Bump @types/node from 14.14.10 to 14.14.22
-- [#2064](https://github.com/h3poteto/whalebird-desktop/pull/2064) build(deps-dev): Bump @types/lodash from 4.14.165 to 4.14.168
-- [#2056](https://github.com/h3poteto/whalebird-desktop/pull/2056) build(deps-dev): Bump electron-debug from 3.1.0 to 3.2.0
-- [#2051](https://github.com/h3poteto/whalebird-desktop/pull/2051) build(deps): Bump electron-context-menu from 2.3.0 to 2.4.0
-- [#2085](https://github.com/h3poteto/whalebird-desktop/pull/2085) New Crowdin updates
-- [#2055](https://github.com/h3poteto/whalebird-desktop/pull/2055) build(deps-dev): Bump sass-loader from 10.1.0 to 10.1.1
-- [#2053](https://github.com/h3poteto/whalebird-desktop/pull/2053) build(deps-dev): Bump @vue/test-utils from 1.1.1 to 1.1.2
-- [#2050](https://github.com/h3poteto/whalebird-desktop/pull/2050) build(deps-dev): Bump ts-loader from 8.0.11 to 8.0.14
-- [#2049](https://github.com/h3poteto/whalebird-desktop/pull/2049) build(deps-dev): Bump html-webpack-plugin from 4.5.0 to 4.5.1
-- [#2047](https://github.com/h3poteto/whalebird-desktop/pull/2047) build(deps-dev): Bump vue-loader from 15.9.5 to 15.9.6
-- [#2045](https://github.com/h3poteto/whalebird-desktop/pull/2045) build(deps): Bump vue-resize from 0.5.0 to 1.0.0
-- [#2044](https://github.com/h3poteto/whalebird-desktop/pull/2044) build(deps-dev): Bump webpack-merge from 5.4.0 to 5.7.3
-- [#2082](https://github.com/h3poteto/whalebird-desktop/pull/2082) New Crowdin updates
-- [#2081](https://github.com/h3poteto/whalebird-desktop/pull/2081) closes #2079 Quit main application when press quit menu or Ctrl+Q
-- [#2077](https://github.com/h3poteto/whalebird-desktop/pull/2077) New Crowdin updates
-- [#2073](https://github.com/h3poteto/whalebird-desktop/pull/2073) New Crowdin updates
-- [#2072](https://github.com/h3poteto/whalebird-desktop/pull/2072) New Crowdin updates
-
-
-### Fixed
-- [#2076](https://github.com/h3poteto/whalebird-desktop/pull/2076) Fix confirm message
-- [#2070](https://github.com/h3poteto/whalebird-desktop/pull/2070) Don't wrap attachment previews in new toot
-- [#2069](https://github.com/h3poteto/whalebird-desktop/pull/2069) closes #2033 Reject adding 5+ images before upload images in new toot
-
-## [4.3.2] - 2021-01-20
-### Changed
-- [#2062](https://github.com/h3poteto/whalebird-desktop/pull/2062) New Crowdin updates
-- [#2041](https://github.com/h3poteto/whalebird-desktop/pull/2041) build(deps-dev): Bump electron from 11.0.3 to 11.2.0
-- [#1996](https://github.com/h3poteto/whalebird-desktop/pull/1996) build(deps-dev): Bump typescript from 4.0.5 to 4.1.3
-- [#2031](https://github.com/h3poteto/whalebird-desktop/pull/2031) build(deps-dev): Bump eslint-plugin-prettier from 3.1.4 to 3.3.1
-- [#2027](https://github.com/h3poteto/whalebird-desktop/pull/2027) build(deps-dev): Bump eslint from 7.14.0 to 7.17.0
-- [#2026](https://github.com/h3poteto/whalebird-desktop/pull/2026) build(deps-dev): Bump core-js from 3.8.0 to 3.8.2
-- [#2040](https://github.com/h3poteto/whalebird-desktop/pull/2040) build(deps-dev): Bump @typescript-eslint/typescript-estree from 4.6.0 to 4.13.0
-- [#2034](https://github.com/h3poteto/whalebird-desktop/pull/2034) build(deps-dev): Bump @types/jest from 26.0.15 to 26.0.20
-- [#2004](https://github.com/h3poteto/whalebird-desktop/pull/2004) build(deps-dev): Bump eslint-config-prettier from 6.15.0 to 7.1.0
-- [#1969](https://github.com/h3poteto/whalebird-desktop/pull/1969) build(deps-dev): Bump cross-env from 7.0.2 to 7.0.3
-- [#2030](https://github.com/h3poteto/whalebird-desktop/pull/2030) build(deps-dev): Bump eslint-plugin-vue from 7.1.0 to 7.4.1
-- [#2029](https://github.com/h3poteto/whalebird-desktop/pull/2029) build(deps): [Security] Bump axios from 0.21.0 to 0.21.1
-- [#2001](https://github.com/h3poteto/whalebird-desktop/pull/2001) build(deps-dev): Bump copy-webpack-plugin from 6.3.2 to 6.4.1
-- [#2002](https://github.com/h3poteto/whalebird-desktop/pull/2002) build(deps): Bump sanitize-html from 2.1.2 to 2.3.0
-- [#1966](https://github.com/h3poteto/whalebird-desktop/pull/1966) build(deps-dev): Bump babel-jest from 26.6.1 to 26.6.3
-- [#2038](https://github.com/h3poteto/whalebird-desktop/pull/2038) New Crowdin updates
-- [#1990](https://github.com/h3poteto/whalebird-desktop/pull/1990) build(deps-dev): Bump mini-css-extract-plugin from 1.2.1 to 1.3.3
-- [#1980](https://github.com/h3poteto/whalebird-desktop/pull/1980) build(deps-dev): Bump electron-packager from 15.1.0 to 15.2.0
-- [#1964](https://github.com/h3poteto/whalebird-desktop/pull/1964) build(deps-dev): Bump css-loader from 5.0.0 to 5.0.1
-- [#1961](https://github.com/h3poteto/whalebird-desktop/pull/1961) build(deps-dev): Bump jest from 26.6.1 to 26.6.3
-- [#1960](https://github.com/h3poteto/whalebird-desktop/pull/1960) build(deps-dev): Bump eslint-plugin-html from 6.1.0 to 6.1.1
-- [#2006](https://github.com/h3poteto/whalebird-desktop/pull/2006) build(deps): [Security] Bump node-notifier from 8.0.0 to 8.0.1
-- [#1992](https://github.com/h3poteto/whalebird-desktop/pull/1992) build(deps): [Security] Bump ini from 1.3.5 to 1.3.8
-- [#2019](https://github.com/h3poteto/whalebird-desktop/pull/2019) closes #1997 Add Sinhala in i18n
-- [#2015](https://github.com/h3poteto/whalebird-desktop/pull/2015) New Crowdin updates
-- [#2012](https://github.com/h3poteto/whalebird-desktop/pull/2012) New Crowdin updates
-- [#2009](https://github.com/h3poteto/whalebird-desktop/pull/2009) Add Traditional Chinese in i18n
-- [#2010](https://github.com/h3poteto/whalebird-desktop/pull/2010) New Crowdin updates
-- [#2011](https://github.com/h3poteto/whalebird-desktop/pull/2011) Update crowdin config for zh-TW
-
-### Fixed
-- [#2037](https://github.com/h3poteto/whalebird-desktop/pull/2037) Fix icon for mac app
-- [#2020](https://github.com/h3poteto/whalebird-desktop/pull/2020) Fix cancel action for confirm in element-ui
-- [#2016](https://github.com/h3poteto/whalebird-desktop/pull/2016) closes #2014 Display only predefined notification type in notifications
-- [#2018](https://github.com/h3poteto/whalebird-desktop/pull/2018) refs #1997 Fix Sinhala language code for crowdin
-- [#2013](https://github.com/h3poteto/whalebird-desktop/pull/2013) Fix typos
-
-## [4.3.1] - 2020-12-03
-### Changed
-- [#1967](https://github.com/h3poteto/whalebird-desktop/pull/1967) Update node version to 14.15.1
-- [#1958](https://github.com/h3poteto/whalebird-desktop/pull/1958) Update definition type files
-- [#1950](https://github.com/h3poteto/whalebird-desktop/pull/1950) Bump node-sass from 4.14.1 to 5.0.0
-- [#1954](https://github.com/h3poteto/whalebird-desktop/pull/1954) Bump electron from 10.1.5 to 11.0.3
-- [#1951](https://github.com/h3poteto/whalebird-desktop/pull/1951) Bump copy-webpack-plugin from 6.2.1 to 6.3.2
-- [#1946](https://github.com/h3poteto/whalebird-desktop/pull/1946) Bump vuex from 3.5.1 to 3.6.0
-- [#1941](https://github.com/h3poteto/whalebird-desktop/pull/1941) Bump eslint from 7.12.1 to 7.14.0
-- [#1945](https://github.com/h3poteto/whalebird-desktop/pull/1945) Bump electron-log from 4.2.4 to 4.3.0
-- [#1922](https://github.com/h3poteto/whalebird-desktop/pull/1922) Bump eslint-config-standard from 14.1.1 to 16.0.2
-- [#1956](https://github.com/h3poteto/whalebird-desktop/pull/1956) Bump @vue/test-utils from 1.1.0 to 1.1.1
-- [#1949](https://github.com/h3poteto/whalebird-desktop/pull/1949) Bump ts-jest from 26.4.3 to 26.4.4
-- [#1955](https://github.com/h3poteto/whalebird-desktop/pull/1955) Bump webpack-merge from 5.2.0 to 5.4.0
-- [#1953](https://github.com/h3poteto/whalebird-desktop/pull/1953) Bump prettier from 2.1.2 to 2.2.1
-- [#1952](https://github.com/h3poteto/whalebird-desktop/pull/1952) Bump core-js from 3.6.5 to 3.8.0
-- [#1948](https://github.com/h3poteto/whalebird-desktop/pull/1948) Bump sanitize-html from 2.1.1 to 2.1.2
-- [#1947](https://github.com/h3poteto/whalebird-desktop/pull/1947) Bump i18next from 19.8.3 to 19.8.4
-- [#1943](https://github.com/h3poteto/whalebird-desktop/pull/1943) Bump electron-json-storage from 4.2.0 to 4.3.0
-- [#1942](https://github.com/h3poteto/whalebird-desktop/pull/1942) Bump vue-router from 3.4.8 to 3.4.9
-- [#1940](https://github.com/h3poteto/whalebird-desktop/pull/1940) Bump babel-loader from 8.1.0 to 8.2.2
-- [#1939](https://github.com/h3poteto/whalebird-desktop/pull/1939) Bump stylelint from 13.7.2 to 13.8.0
-- [#1938](https://github.com/h3poteto/whalebird-desktop/pull/1938) refactor: Use invoke instead of send for ipc
-- [#1930](https://github.com/h3poteto/whalebird-desktop/pull/1930) Bump @babel/core from 7.11.6 to 7.12.9
-- [#1931](https://github.com/h3poteto/whalebird-desktop/pull/1931) Bump @types/node from 14.14.5 to 14.14.10
-- [#1928](https://github.com/h3poteto/whalebird-desktop/pull/1928) Bump @babel/preset-env from 7.11.5 to 7.12.7
-- [#1927](https://github.com/h3poteto/whalebird-desktop/pull/1927) Bump eslint-plugin-standard from 4.0.1 to 5.0.0
-- [#1916](https://github.com/h3poteto/whalebird-desktop/pull/1916) Bump ts-loader from 8.0.4 to 8.0.11
-- [#1914](https://github.com/h3poteto/whalebird-desktop/pull/1914) Bump @types/lodash from 4.14.162 to 4.14.165
-- [#1911](https://github.com/h3poteto/whalebird-desktop/pull/1911) Bump webpack-cli from 3.3.12 to 4.2.0
-- [#1908](https://github.com/h3poteto/whalebird-desktop/pull/1908) Bump @babel/runtime from 7.11.2 to 7.12.5
-- [#1906](https://github.com/h3poteto/whalebird-desktop/pull/1906) Bump vue-loader from 15.9.3 to 15.9.5
-- [#1892](https://github.com/h3poteto/whalebird-desktop/pull/1892) Bump @babel/plugin-proposal-class-properties from 7.10.4 to 7.12.1
-- [#1919](https://github.com/h3poteto/whalebird-desktop/pull/1919) Bump sass-loader from 10.0.2 to 10.1.0
-- [#1895](https://github.com/h3poteto/whalebird-desktop/pull/1895) Bump node-loader from 1.0.1 to 1.0.2
-- [#1881](https://github.com/h3poteto/whalebird-desktop/pull/1881) Bump url-loader from 4.1.0 to 4.1.1
-- [#1890](https://github.com/h3poteto/whalebird-desktop/pull/1890) Bump @babel/plugin-transform-runtime from 7.11.5 to 7.12.1
-- [#1887](https://github.com/h3poteto/whalebird-desktop/pull/1887) Bump file-loader from 6.1.0 to 6.2.0
-- [#1885](https://github.com/h3poteto/whalebird-desktop/pull/1885) Bump @types/jest from 26.0.14 to 26.0.15
-- [#1877](https://github.com/h3poteto/whalebird-desktop/pull/1877) Bump electron-builder from 22.8.1 to 22.9.1
-- [#1913](https://github.com/h3poteto/whalebird-desktop/pull/1913) New Crowdin updates
-
-### Fixed
-- [#1972](https://github.com/h3poteto/whalebird-desktop/pull/1972) clean: Remove unnecessary comments
-- [#1971](https://github.com/h3poteto/whalebird-desktop/pull/1971) Fix build command for mas
-- [#1970](https://github.com/h3poteto/whalebird-desktop/pull/1970) fix: Don't always render emoji picker and tool menu
-- [#1959](https://github.com/h3poteto/whalebird-desktop/pull/1959) closes #1936 Fix compose window height when add poll options
-- [#1937](https://github.com/h3poteto/whalebird-desktop/pull/1937) closes #1932 Use el-popper instead of vue-popper for emoji picker in statuses
-- [#1935](https://github.com/h3poteto/whalebird-desktop/pull/1935) closes #1934 Use el-popper instead of vue-popper in Toot menu
-- [#1933](https://github.com/h3poteto/whalebird-desktop/pull/1933) closes #1921 Re-render when update toot in timelines
-- [#1924](https://github.com/h3poteto/whalebird-desktop/pull/1924) closes #1782 Avoid shortcut key on media description in new toot
-
-## [4.3.0] - 2020-10-31
-### Added
-- [#1858](https://github.com/h3poteto/whalebird-desktop/pull/1858) closes #1804 Add columns under Toots in side menu
-- [#1852](https://github.com/h3poteto/whalebird-desktop/pull/1852) closes #1845 Add Central Atlas Tamazight in i18n
-- [#1842](https://github.com/h3poteto/whalebird-desktop/pull/1842) closes #1766 Introduce vue-virtual-scroll for all timelines
-
-### Changed
-- [#1893](https://github.com/h3poteto/whalebird-desktop/pull/1893) Bump eslint-config-prettier from 6.14.0 to 6.15.0
-- [#1888](https://github.com/h3poteto/whalebird-desktop/pull/1888) Bump axios from 0.20.0 to 0.21.0
-- [#1886](https://github.com/h3poteto/whalebird-desktop/pull/1886) Bump webpack-merge from 5.1.4 to 5.2.0
-- [#1884](https://github.com/h3poteto/whalebird-desktop/pull/1884) Bump @babel/plugin-proposal-object-rest-spread from 7.11.0 to 7.12.1
-- [#1882](https://github.com/h3poteto/whalebird-desktop/pull/1882) Bump ajv from 6.12.5 to 6.12.6
-- [#1880](https://github.com/h3poteto/whalebird-desktop/pull/1880) Bump css-loader from 4.3.0 to 5.0.0
-- [#1879](https://github.com/h3poteto/whalebird-desktop/pull/1879) Bump mini-css-extract-plugin from 1.2.0 to 1.2.1
-- [#1878](https://github.com/h3poteto/whalebird-desktop/pull/1878) Bump typescript from 4.0.3 to 4.0.5
-- [#1876](https://github.com/h3poteto/whalebird-desktop/pull/1876) Bump @types/lodash from 4.14.161 to 4.14.162
-- [#1865](https://github.com/h3poteto/whalebird-desktop/pull/1865) Bump jest from 26.4.2 to 26.6.1
-- [#1875](https://github.com/h3poteto/whalebird-desktop/pull/1875) Bump @types/node from 14.11.1 to 14.14.5
-- [#1874](https://github.com/h3poteto/whalebird-desktop/pull/1874) Bump eslint from 7.9.0 to 7.12.1
-- [#1873](https://github.com/h3poteto/whalebird-desktop/pull/1873) Bump ts-jest from 26.4.0 to 26.4.3
-- [#1868](https://github.com/h3poteto/whalebird-desktop/pull/1868) Bump i18next from 19.7.0 to 19.8.3
-- [#1867](https://github.com/h3poteto/whalebird-desktop/pull/1867) Bump electron from 10.1.2 to 10.1.5
-- [#1872](https://github.com/h3poteto/whalebird-desktop/pull/1872) Bump vue-router from 3.4.3 to 3.4.8
-- [#1871](https://github.com/h3poteto/whalebird-desktop/pull/1871) Bump @typescript-eslint/typescript-estree from 4.1.1 to 4.6.0
-- [#1866](https://github.com/h3poteto/whalebird-desktop/pull/1866) Bump babel-jest from 26.3.0 to 26.6.1
-- [#1864](https://github.com/h3poteto/whalebird-desktop/pull/1864) Bump mini-css-extract-plugin from 0.11.2 to 1.2.0
-- [#1862](https://github.com/h3poteto/whalebird-desktop/pull/1862) Bump sanitize-html from 1.27.4 to 2.1.1
-- [#1859](https://github.com/h3poteto/whalebird-desktop/pull/1859) Bump eslint-config-prettier from 6.11.0 to 6.14.0
-- [#1848](https://github.com/h3poteto/whalebird-desktop/pull/1848) Bump eslint-plugin-vue from 6.2.2 to 7.1.0
-- [#1836](https://github.com/h3poteto/whalebird-desktop/pull/1836) Bump style-loader from 1.2.1 to 2.0.0
-- [#1827](https://github.com/h3poteto/whalebird-desktop/pull/1827) Bump moment from 2.28.0 to 2.29.1
-- [#1839](https://github.com/h3poteto/whalebird-desktop/pull/1839) Bump copy-webpack-plugin from 6.1.1 to 6.2.1
-- [#1806](https://github.com/h3poteto/whalebird-desktop/pull/1806) Bump del from 5.1.0 to 6.0.0
-- [#1805](https://github.com/h3poteto/whalebird-desktop/pull/1805) Bump eslint-plugin-import from 2.22.0 to 2.22.1
-- [#1803](https://github.com/h3poteto/whalebird-desktop/pull/1803) Bump stylelint from 13.7.1 to 13.7.2
-- [#1853](https://github.com/h3poteto/whalebird-desktop/pull/1853) New Crowdin updates
-- [#1851](https://github.com/h3poteto/whalebird-desktop/pull/1851) New Crowdin updates
-- [#1820](https://github.com/h3poteto/whalebird-desktop/pull/1820) Clean up unused method calling
-- [#1813](https://github.com/h3poteto/whalebird-desktop/pull/1813) Fix changelog
-- [#1812](https://github.com/h3poteto/whalebird-desktop/pull/1812) Update changelog
-
-### Fixed
-- [#1819](https://github.com/h3poteto/whalebird-desktop/pull/1819) closes #1818 Change nodeIntegration to fix aboutWindow
-
-## [4.2.3] - 2020-09-25
-### Added
-- [#1780](https://github.com/h3poteto/whalebird-desktop/pull/1780) closes #1351 Add theme color in new toot window
-
-### Changed
-
-- [#1795](https://github.com/h3poteto/whalebird-desktop/pull/1795) Update electron version to 10.1.2 for mas
-- [#1786](https://github.com/h3poteto/whalebird-desktop/pull/1786) Bump typescript from 3.9.7 to 4.0.3
-- [#1793](https://github.com/h3poteto/whalebird-desktop/pull/1793) Bump ts-loader from 8.0.3 to 8.0.4
-- [#1774](https://github.com/h3poteto/whalebird-desktop/pull/1774) Bump @typescript-eslint/typescript-estree from 3.10.1 to 4.1.1
-- [#1773](https://github.com/h3poteto/whalebird-desktop/pull/1773) Bump electron from 10.1.0 to 10.1.2
-- [#1787](https://github.com/h3poteto/whalebird-desktop/pull/1787) Bump @types/node from 14.10.1 to 14.11.1
-- [#1794](https://github.com/h3poteto/whalebird-desktop/pull/1794) Bump ts-jest from 26.3.0 to 26.4.0
-- [#1792](https://github.com/h3poteto/whalebird-desktop/pull/1792) Bump html-webpack-plugin from 4.4.1 to 4.5.0
-- [#1788](https://github.com/h3poteto/whalebird-desktop/pull/1788) Bump copy-webpack-plugin from 6.1.0 to 6.1.1
-- [#1785](https://github.com/h3poteto/whalebird-desktop/pull/1785) Bump webpack from 4.44.1 to 4.44.2
-- [#1784](https://github.com/h3poteto/whalebird-desktop/pull/1784) Bump electron-builder from 22.8.0 to 22.8.1
-- [#1776](https://github.com/h3poteto/whalebird-desktop/pull/1776) Bump prettier from 2.1.1 to 2.1.2
-- [#1783](https://github.com/h3poteto/whalebird-desktop/pull/1783) Bump @types/jest from 26.0.13 to 26.0.14
-- [#1769](https://github.com/h3poteto/whalebird-desktop/pull/1769) Bump moment from 2.27.0 to 2.28.0
-- [#1770](https://github.com/h3poteto/whalebird-desktop/pull/1770) Bump ajv from 6.12.4 to 6.12.5
-- [#1740](https://github.com/h3poteto/whalebird-desktop/pull/1740) Bump axios from 0.19.2 to 0.20.0
-- [#1684](https://github.com/h3poteto/whalebird-desktop/pull/1784) Bump @babel/runtime from 7.11.0 to 7.11.2
-- [#1779](https://github.com/h3poteto/whalebird-desktop/pull/1779) Update issue templates
-- [#1778](https://github.com/h3poteto/whalebird-desktop/pull/1778) closes #1349 Set line-height in body to change according to font-size
-- [#1777](https://github.com/h3poteto/whalebird-desktop/pull/1777) closes #1755 Set backgroundColor to BrowserWindow to improve sub-pixel anti-aliasing
-- [#1764](https://github.com/h3poteto/whalebird-desktop/pull/1764) Fix npm command to yarn
-- [#1763](https://github.com/h3poteto/whalebird-desktop/pull/1763) Use yarn.lock to generate cache key in circleci
-- [#1762](https://github.com/h3poteto/whalebird-desktop/pull/1762) Clean up unused packages
-- [#1761](https://github.com/h3poteto/whalebird-desktop/pull/1761) Use yarn instead of npm
-- [#1756](https://github.com/h3poteto/whalebird-desktop/pull/1756) New Crowdin updates
-
-### Fixed
-
-- [#1791](https://github.com/h3poteto/whalebird-desktop/pull/1791) closes #1285 Fix highlighted account icon
-- [#1790](https://github.com/h3poteto/whalebird-desktop/pull/1790) Re-render compose window using v-if for resize handler event
-- [#1781](https://github.com/h3poteto/whalebird-desktop/pull/1781) Fix window height of new toot when close window with some contents
-- [#1765](https://github.com/h3poteto/whalebird-desktop/pull/1765) Fix types in integration spec
-
-
-
-## [4.2.2] - 2020-09-03
-### Added
-- [#1732](https://github.com/h3poteto/whalebird-desktop/pull/1732) closes #1713 Support to add bookmarks
-- [#1720](https://github.com/h3poteto/whalebird-desktop/pull/1320) closes #1714 Add bookmark list as timeline
-- [#1715](https://github.com/h3poteto/whalebird-desktop/pull/1715) closes #1453 Support quotation reblog
-
-### Changed
-
-- [#1729](https://github.com/h3poteto/whalebird-desktop/pull/1729) Bump @typescript-eslint/typescript-estree from 3.7.1 to 3.10.1
-- [#1734](https://github.com/h3poteto/whalebird-desktop/pull/1734) Bump electron from 9.1.2 to 10.1.0
-- [#1728](https://github.com/h3poteto/whalebird-desktop/pull/1728) Bump @typescript-eslint/eslint-plugin from 3.7.1 to 3.10.1
-- [#1736](https://github.com/h3poteto/whalebird-desktop/pull/1736) New Crowdin updates
-- [#1733](https://github.com/h3poteto/whalebird-desktop/pull/1733) Bump mini-css-extract-plugin from 0.9.0 to 0.11.0
-- [#1727](https://github.com/h3poteto/whalebird-desktop/pull/1727) Bump sass-loader from 9.0.2 to 10.0.1
-- [#1725](https://github.com/h3poteto/whalebird-desktop/pull/1725) Bump @types/lodash from 4.14.158 to 4.14.160
-- [#1724](https://github.com/h3poteto/whalebird-desktop/pull/1724) Bump @typescript-eslint/parser from 3.7.1 to 3.10.1
-- [#1723](https://github.com/h3poteto/whalebird-desktop/pull/1723) Bump jest from 26.2.2 to 26.4.2
-- [#1717](https://github.com/h3poteto/whalebird-desktop/pull/1717) Bump @babel/core from 7.11.0 to 7.11.4
-- [#1716](https://github.com/h3poteto/whalebird-desktop/pull/1716) Bump lodash from 4.17.19 to 4.17.20
-- [#1704](https://github.com/h3poteto/whalebird-desktop/pull/1704) Bump eslint from 7.5.0 to 7.7.0
-- [#1735](https://github.com/h3poteto/whalebird-desktop/pull/1735) New Crowdin updates
-- [#1722](https://github.com/h3poteto/whalebird-desktop/pull/1722) Bump ts-loader from 8.0.1 to 8.0.3
-- [#1709](https://github.com/h3poteto/whalebird-desktop/pull/1709) Bump webpack-merge from 5.0.9 to 5.1.2
-- [#1701](https://github.com/h3poteto/whalebird-desktop/pull/1701) Bump vue-router from 3.3.4 to 3.4.3
-- [#1699](https://github.com/h3poteto/whalebird-desktop/pull/1599) Bump babel-jest from 26.2.2 to 26.3.0
-- [#1692](https://github.com/h3poteto/whalebird-desktop/pull/1682) Bump electron-context-menu from 2.2.0 to 2.3.0
-- [#1690](https://github.com/h3poteto/whalebird-desktop/pull/1690) Bump jsdom from 16.3.0 to 16.4.0
-- [#1689](https://github.com/h3poteto/whalebird-desktop/pull/1689) Bump eslint-plugin-html from 6.0.2 to 6.0.3
-- [#1731](https://github.com/h3poteto/whalebird-desktop/pull/1731) New Crowdin updates
-- [#1721](https://github.com/h3poteto/whalebird-desktop/pull/1721) Remove unused nvmrc
-- [#1688](https://github.com/h3poteto/whalebird-desktop/pull/1688) Bump css-loader from 3.6.0 to 4.2.1
-- [#1705](https://github.com/h3poteto/whalebird-desktop/pull/1705) [Security] Bump dot-prop from 4.2.0 to 4.2.1
-
-### Fixed
-
-- [#1719](https://github.com/h3poteto/whalebird-desktop/pull/1719) refs #1694 Set limit height when new toot window height is resized
-- [#1711](https://github.com/h3poteto/whalebird-desktop/pull/1711) Fix options for css-loader 4.0.0
-
-
-## [4.2.1] - 2020-08-07
-### Changed
-
-- [#1668](https://github.com/h3poteto/whalebird-desktop/pull/1668) Revert "Bump css-loader from 3.6.0 to 4.1.1"
-- [#1669](https://github.com/h3poteto/whalebird-desktop/pull/1669) Update @typescript-eslint/parser and jest
-- [#1664](https://github.com/h3poteto/whalebird-desktop/pull/1664) Bump @babel/plugin-proposal-object-rest-spread from 7.10.4 to 7.11.0
-- [#1654](https://github.com/h3poteto/whalebird-desktop/pull/1654) Bump megalodon from 3.2.3 to 3.2.4
-- [#1667](https://github.com/h3poteto/whalebird-desktop/pull/1667) Bump ts-jest from 24.3.0 to 26.1.4
-- [#1666](https://github.com/h3poteto/whalebird-desktop/pull/1666) Bump @typescript-eslint/eslint-plugin from 2.34.0 to 3.7.1
-- [#1665](https://github.com/h3poteto/whalebird-desktop/pull/1665) Bump eslint from 6.8.0 to 7.5.0
-- [#1663](https://github.com/h3poteto/whalebird-desktop/pull/1663) Bump @babel/preset-env from 7.10.4 to 7.11.0
-- [#1661](https://github.com/h3poteto/whalebird-desktop/pull/1661) Bump electron-builder from 22.7.0 to 22.8.0
-- [#1660](https://github.com/h3poteto/whalebird-desktop/pull/1660) Bump node-loader from 1.0.0 to 1.0.1
-- [#1659](https://github.com/h3poteto/whalebird-desktop/pull/1659) Bump @babel/runtime from 7.10.5 to 7.11.0
-- [#1658](https://github.com/h3poteto/whalebird-desktop/pull/1658) Bump babel-jest from 26.1.0 to 26.2.2
-- [#1657](https://github.com/h3poteto/whalebird-desktop/pull/1657) Bump blueimp-load-image from 5.13.0 to 5.14.0
-- [#1656](https://github.com/h3poteto/whalebird-desktop/pull/1656) Bump webpack from 4.43.0 to 4.44.1
-- [#1655](https://github.com/h3poteto/whalebird-desktop/pull/1655) Bump @babel/core from 7.10.5 to 7.11.0
-- [#1645](https://github.com/h3poteto/whalebird-desktop/pull/1645) Bump electron from 9.1.0 to 9.1.2
-- [#1653](https://github.com/h3poteto/whalebird-desktop/pull/1653) Bump @babel/plugin-transform-runtime from 7.10.4 to 7.11.0
-- [#1649](https://github.com/h3poteto/whalebird-desktop/pull/1649) Bump sanitize-html from 1.27.0 to 1.27.2
-- [#1648](https://github.com/h3poteto/whalebird-desktop/pull/1648) Bump css-loader from 3.6.0 to 4.1.1
-- [#1646](https://github.com/h3poteto/whalebird-desktop/pull/1646) [Security] Bump elliptic from 6.5.2 to 6.5.3
-- [#1644](https://github.com/h3poteto/whalebird-desktop/pull/1644) Bump @types/node from 14.0.20 to 14.0.27
-- [#1643](https://github.com/h3poteto/whalebird-desktop/pull/1643) Bump @typescript-eslint/typescript-estree from 3.6.0 to 3.7.1
-- [#1640](https://github.com/h3poteto/whalebird-desktop/pull/1640) Bump i18next from 19.5.6 to 19.6.3
-- [#1636](https://github.com/h3poteto/whalebird-desktop/pull/1636) Bump electron-mock-ipc from 0.3.6 to 0.3.7
-- [#1635](https://github.com/h3poteto/whalebird-desktop/pull/1635) Bump regenerator-runtime from 0.13.5 to 0.13.7
-- [#1634](https://github.com/h3poteto/whalebird-desktop/pull/1634) Bump @types/lodash from 4.14.157 to 4.14.158
-- [#1628](https://github.com/h3poteto/whalebird-desktop/pull/1628) Bump vue-awesome from 4.0.2 to 4.1.0
-- [#1626](https://github.com/h3poteto/whalebird-desktop/pull/1626) Bump electron-devtools-installer from 3.1.0 to 3.1.1
-- [#1624](https://github.com/h3poteto/whalebird-desktop/pull/1624) Bump typescript from 3.9.6 to 3.9.7
-- [#1625](https://github.com/h3poteto/whalebird-desktop/pull/1625) Bump cfonts from 2.8.5 to 2.8.6
-- [#1617](https://github.com/h3poteto/whalebird-desktop/pull/1617) Bump @babel/core from 7.10.4 to 7.10.5
-- [#1616](https://github.com/h3poteto/whalebird-desktop/pull/1616) Bump ts-loader from 8.0.0 to 8.0.1
-- [#1615](https://github.com/h3poteto/whalebird-desktop/pull/1615) Bump @babel/runtime from 7.10.4 to 7.10.5
-- [#1611](https://github.com/h3poteto/whalebird-desktop/pull/1611) Bump electron-context-menu from 2.1.0 to 2.2.0
-- [#1609](https://github.com/h3poteto/whalebird-desktop/pull/1609) Bump @types/nedb from 1.8.9 to 1.8.10
-- [#1623](https://github.com/h3poteto/whalebird-desktop/pull/1623) Add AUR badge in README
-- [#1621](https://github.com/h3poteto/whalebird-desktop/pull/1621) Change AUR package in README
-
-### Fixed
-
-- [#1651](https://github.com/h3poteto/whalebird-desktop/pull/1651) closes #1647 Adjust status height when attachments are dropped
-- [#1650](https://github.com/h3poteto/whalebird-desktop/pull/1650) closes #1642 Fix calculate diff in change list memberships
-- [#1622](https://github.com/h3poteto/whalebird-desktop/pull/1622) Use target instead of linter.eslint.dir in sideci.yml
-
-
-
-## [4.2.0] - 2020-07-14
-### Added
-- [#1555](https://github.com/h3poteto/whalebird-desktop/pull/1555) refs #1316 Allow resize new toot window
-
-### Changed
-- [#1608](https://github.com/h3poteto/whalebird-desktop/pull/1608) Bump i18next from 19.5.5 to 19.5.6
-- [#1607](https://github.com/h3poteto/whalebird-desktop/pull/1607) Bump jsdom from 16.2.2 to 16.3.0
-- [#1583](https://github.com/h3poteto/whalebird-desktop/pull/1583) Bump electron from 9.0.3 to 9.1.0
-- [#1604](https://github.com/h3poteto/whalebird-desktop/pull/1604) Bump electron-json-storage from 4.1.8 to 4.2.0
-- [#1606](https://github.com/h3poteto/whalebird-desktop/pull/1606) Bump webpack-merge from 5.0.8 to 5.0.9
-- [#1605](https://github.com/h3poteto/whalebird-desktop/pull/1605) Bump electron-mock-ipc from 0.3.5 to 0.3.6
-- [#1601](https://github.com/h3poteto/whalebird-desktop/pull/1601) Bump ajv from 6.12.2 to 6.12.3
-- [#1598](https://github.com/h3poteto/whalebird-desktop/pull/1598) Bump @types/node from 14.0.13 to 14.0.20
-- [#1597](https://github.com/h3poteto/whalebird-desktop/pull/1597) Bump typescript from 3.9.5 to 3.9.6
-- [#1595](https://github.com/h3poteto/whalebird-desktop/pull/1595) Bump electron-devtools-installer from 3.0.0 to 3.1.0
-- [#1587](https://github.com/h3poteto/whalebird-desktop/pull/1587) Bump i18next from 19.5.4 to 19.5.5
-- [#1603](https://github.com/h3poteto/whalebird-desktop/pull/1603) Bump eslint-plugin-import from 2.21.2 to 2.22.0
-- [#1602](https://github.com/h3poteto/whalebird-desktop/pull/1602) Bump webpack-merge from 4.2.2 to 5.0.8
-- [#1600](https://github.com/h3poteto/whalebird-desktop/pull/1600) Bump ts-loader from 7.0.5 to 8.0.0
-- [#1599](https://github.com/h3poteto/whalebird-desktop/pull/1599) Bump electron-context-menu from 2.0.1 to 2.1.0
-- [#1596](https://github.com/h3poteto/whalebird-desktop/pull/1596) Bump sass-loader from 8.0.2 to 9.0.2
-- [#1592](https://github.com/h3poteto/whalebird-desktop/pull/1592) Bump @babel/plugin-proposal-class-properties from 7.10.1 to 7.10.4
-- [#1591](https://github.com/h3poteto/whalebird-desktop/pull/1591) Bump vuex from 3.4.0 to 3.5.1
-- [#1593](https://github.com/h3poteto/whalebird-desktop/pull/1593) Bump copy-webpack-plugin from 6.0.2 to 6.0.3
-- [#1594](https://github.com/h3poteto/whalebird-desktop/pull/1594) Bump vue-loader from 15.9.2 to 15.9.3
-- [#1590](https://github.com/h3poteto/whalebird-desktop/pull/1590) Bump babel-jest from 26.0.1 to 26.1.0
-- [#1589](https://github.com/h3poteto/whalebird-desktop/pull/1589) Bump node-loader from 0.6.0 to 1.0.0
-- [#1588](https://github.com/h3poteto/whalebird-desktop/pull/1588) Bump electron-packager from 14.2.1 to 15.0.0
-- [#1586](https://github.com/h3poteto/whalebird-desktop/pull/1586) Bump lodash from 4.17.15 to 4.17.19
-- [#1578](https://github.com/h3poteto/whalebird-desktop/pull/1578) Bump @babel/runtime from 7.10.2 to 7.10.4
-- [#1580](https://github.com/h3poteto/whalebird-desktop/pull/1580) Bump @babel/core from 7.10.2 to 7.10.4
-- [#1579](https://github.com/h3poteto/whalebird-desktop/pull/1579) Bump @babel/plugin-transform-runtime from 7.10.1 to 7.10.4
-- [#1582](https://github.com/h3poteto/whalebird-desktop/pull/1582) Bump i18next from 19.4.5 to 19.5.4
-- [#1585](https://github.com/h3poteto/whalebird-desktop/pull/1585) Bump @typescript-eslint/typescript-estree from 3.2.0 to 3.6.0
-- [#1577](https://github.com/h3poteto/whalebird-desktop/pull/1577) Bump @babel/preset-env from 7.10.2 to 7.10.4
-- [#1576](https://github.com/h3poteto/whalebird-desktop/pull/1576) Bump @babel/plugin-proposal-object-rest-spread from 7.10.1 to 7.10.4
-- [#1570](https://github.com/h3poteto/whalebird-desktop/pull/1570) Bump @types/lodash from 4.14.155 to 4.14.157
-- [#1563](https://github.com/h3poteto/whalebird-desktop/pull/1563) Bump blueimp-load-image from 5.12.0 to 5.13.0
-- [#1557](https://github.com/h3poteto/whalebird-desktop/pull/1557) Bump moment from 2.26.0 to 2.27.0
-- [#1556](https://github.com/h3poteto/whalebird-desktop/pull/1556) Bump webpack-cli from 3.3.11 to 3.3.12
-- [#1554](https://github.com/h3poteto/whalebird-desktop/pull/1554) Bump sanitize-html from 1.26.0 to 1.27.0
-- [#1553](https://github.com/h3poteto/whalebird-desktop/pull/1553) Bump stylelint from 13.6.0 to 13.6.1
-- [#1551](https://github.com/h3poteto/whalebird-desktop/pull/1551) Bump electron-log from 4.2.1 to 4.2.2
-- [#1549](https://github.com/h3poteto/whalebird-desktop/pull/1549) Bump eslint-plugin-prettier from 3.1.3 to 3.1.4
-- [#1548](https://github.com/h3poteto/whalebird-desktop/pull/1548) Bump vue-router from 3.3.3 to 3.3.4
-- [#1547](https://github.com/h3poteto/whalebird-desktop/pull/1547) Bump cfonts from 2.8.3 to 2.8.5
-- [#1545](https://github.com/h3poteto/whalebird-desktop/pull/1545) Bump css-loader from 3.5.3 to 3.6.0
-- [#1568](https://github.com/h3poteto/whalebird-desktop/pull/1568) New Crowdin updates
-
-### Fixed
-- [#1573](https://github.com/h3poteto/whalebird-desktop/pull/1573) closes #1542 Set proxy config for BrowserWindow
-
-## [4.1.3] - 2020-06-16
-### Added
-- [#1514](https://github.com/h3poteto/whalebird-desktop/pull/1514) closes #1348 Add a menu to hide menu bar
-- [#1524](https://github.com/h3poteto/whalebird-desktop/pull/1524) closes #1427 Get and show identity proof of accounts
-
-### Changed
-- [#1538](https://github.com/h3poteto/whalebird-desktop/pull/1538) Bump copy-webpack-plugin from 6.0.1 to 6.0.2
-- [#1543](https://github.com/h3poteto/whalebird-desktop/pull/1543) Bump cfonts from 2.8.2 to 2.8.3
-- [#1534](https://github.com/h3poteto/whalebird-desktop/pull/1534) Bump @babel/plugin-proposal-object-rest-spread from 7.9.6 to 7.10.1
-- [#1544](https://github.com/h3poteto/whalebird-desktop/pull/1544) Bump vue-router from 3.2.0 to 3.3.3
-- [#1541](https://github.com/h3poteto/whalebird-desktop/pull/1541) Bump moment from 2.24.0 to 2.26.0
-- [#1540](https://github.com/h3poteto/whalebird-desktop/pull/1540) Bump about-window from 1.13.2 to 1.13.4
-- [#1532](https://github.com/h3poteto/whalebird-desktop/pull/1532) Bump electron-packager from 14.0.6 to 14.2.1
-- [#1537](https://github.com/h3poteto/whalebird-desktop/pull/1537) Bump eslint-plugin-import from 2.20.2 to 2.21.2
-- [#1536](https://github.com/h3poteto/whalebird-desktop/pull/1536) Bump @types/lodash from 4.14.152 to 4.14.155
-- [#1533](https://github.com/h3poteto/whalebird-desktop/pull/1533) Bump typescript from 3.9.3 to 3.9.5
-- [#1531](https://github.com/h3poteto/whalebird-desktop/pull/1531) Bump stylelint from 13.5.0 to 13.6.0
-- [#1530](https://github.com/h3poteto/whalebird-desktop/pull/1530) Bump @babel/plugin-transform-runtime from 7.10.0 to 7.10.1
-- [#1529](https://github.com/h3poteto/whalebird-desktop/pull/1529) Bump electron-devtools-installer from 2.2.4 to 3.0.0
-- [#1528](https://github.com/h3poteto/whalebird-desktop/pull/1528) Bump chalk from 4.0.0 to 4.1.0
-- [#1501](https://github.com/h3poteto/whalebird-desktop/pull/1501) Bump i18next from 19.4.1 to 19.4.5
-- [#1526](https://github.com/h3poteto/whalebird-desktop/pull/1526) Bump webpack from 4.42.1 to 4.43.0
-- [#1525](https://github.com/h3poteto/whalebird-desktop/pull/1525) Bump @babel/core from 7.9.6 to 7.10.2
-- [#1519](https://github.com/h3poteto/whalebird-desktop/pull/1519) Bump @babel/preset-env from 7.9.6 to 7.10.2
-- [#1491](https://github.com/h3poteto/whalebird-desktop/pull/1491) Bump electron-builder from 22.4.1 to 22.7.0
-- [#1527](https://github.com/h3poteto/whalebird-desktop/pull/1527) Bump @types/node from 14.0.5 to 14.0.13
-- [#1489](https://github.com/h3poteto/whalebird-desktop/pull/1489) Bump animate.css from 3.7.2 to 4.1.0
-- [#1520](https://github.com/h3poteto/whalebird-desktop/pull/1520) Bump @typescript-eslint/typescript-estree from 2.33.0 to 3.2.0
-- [#1510](https://github.com/h3poteto/whalebird-desktop/pull/1510) Bump sanitize-html from 1.23.0 to 1.26.0
-- [#1509](https://github.com/h3poteto/whalebird-desktop/pull/1509) Bump electron-log from 4.1.1 to 4.2.1
-- [#1505](https://github.com/h3poteto/whalebird-desktop/pull/1505) Bump @babel/runtime from 7.9.6 to 7.10.2
-- [#1486](https://github.com/h3poteto/whalebird-desktop/pull/1486) Bump @typescript-eslint/parser from 2.33.0 to 2.34.0
-- [#1500](https://github.com/h3poteto/whalebird-desktop/pull/1500) Bump electron-debug from 3.0.1 to 3.1.0
-- [#1498](https://github.com/h3poteto/whalebird-desktop/pull/1498) Bump core-js from 3.6.4 to 3.6.5
-- [#1496](https://github.com/h3poteto/whalebird-desktop/pull/1496) Bump @panter/vue-i18next from 0.15.1 to 0.15.2
-- [#1493](https://github.com/h3poteto/whalebird-desktop/pull/1493) Bump vue-loader from 15.9.1 to 15.9.2
-- [#1492](https://github.com/h3poteto/whalebird-desktop/pull/1492) Bump @babel/plugin-proposal-class-properties from 7.8.3 to 7.10.1
-- [#1490](https://github.com/h3poteto/whalebird-desktop/pull/1490) Bump vuex from 3.1.3 to 3.4.0
-- [#1488](https://github.com/h3poteto/whalebird-desktop/pull/1488) Bump blueimp-load-image from 5.10.0 to 5.12.0
-- [#1484](https://github.com/h3poteto/whalebird-desktop/pull/1484) Bump @vue/test-utils from 1.0.0-beta.33 to 1.0.3
-- [#1523](https://github.com/h3poteto/whalebird-desktop/pull/1523) closes #1280 Enable spellchecker
-- [#1443](https://github.com/h3poteto/whalebird-desktop/pull/1443) Bump electron-context-menu from 0.16.0 to 2.0.1
-- [#1522](https://github.com/h3poteto/whalebird-desktop/pull/1522) Bump electron from 7.2.1 to 9.0.3
-- [#1518](https://github.com/h3poteto/whalebird-desktop/pull/1518) New Crowdin translations
-- [#1517](https://github.com/h3poteto/whalebird-desktop/pull/1517) New Crowdin translations
-- [#1497](https://github.com/h3poteto/whalebird-desktop/pull/1497) Bump webpack-dev-server from 3.10.3 to 3.11.0
-- [#1515](https://github.com/h3poteto/whalebird-desktop/pull/1515) New Crowdin translations
-- [#1512](https://github.com/h3poteto/whalebird-desktop/pull/1512) [Security] Bump websocket-extensions from 0.1.3 to 0.1.4
-
-### Fixed
-- [#1550](https://github.com/h3poteto/whalebird-desktop/pull/1550) Remove menu bar menu when platform is darwin
-- [#1513](https://github.com/h3poteto/whalebird-desktop/pull/1513) closes #1507 Change blockquote style
-
-## [4.1.2] - 2020-06-01
-### Added
-- [#1474](https://github.com/h3poteto/whalebird-desktop/pull/1474) closes #1471 Handle follow requests in notifications
-
-### Changed
-- [#1475](https://github.com/h3poteto/whalebird-desktop/pull/1475) closes #1452 Emojify quoted contents
-- [#1473](https://github.com/h3poteto/whalebird-desktop/pull/1473) Bump typescript from 3.8.3 to 3.9.3
-- [#1447](https://github.com/h3poteto/whalebird-desktop/pull/1447) Bump style-loader from 1.1.3 to 1.2.1
-- [#1480](https://github.com/h3poteto/whalebird-desktop/pull/1480) Bump @types/node from 13.13.4 to 14.0.5
-- [#1463](https://github.com/h3poteto/whalebird-desktop/pull/1463) Bump copy-webpack-plugin from 5.1.1 to 6.0.1
-- [#1478](https://github.com/h3poteto/whalebird-desktop/pull/1478) Bump ts-loader from 7.0.3 to 7.0.5
-- [#1479](https://github.com/h3poteto/whalebird-desktop/pull/1479) Bump @babel/plugin-transform-runtime from 7.8.3 to 7.10.0
-- [#1461](https://github.com/h3poteto/whalebird-desktop/pull/1461) Bump stylelint from 13.3.2 to 13.5.0
-- [#1477](https://github.com/h3poteto/whalebird-desktop/pull/1477) Bump element-ui from 2.13.0 to 2.13.2
-- [#1466](https://github.com/h3poteto/whalebird-desktop/pull/1466) Bump eslint-loader from 3.0.4 to 4.0.2
-- [#1465](https://github.com/h3poteto/whalebird-desktop/pull/1465) Bump @types/lodash from 4.14.149 to 4.14.152
-- [#1462](https://github.com/h3poteto/whalebird-desktop/pull/1462) Bump node-sass from 4.13.1 to 4.14.1
-- [#1460](https://github.com/h3poteto/whalebird-desktop/pull/1460) Bump vue-router from 3.1.6 to 3.2.0
-- [#1459](https://github.com/h3poteto/whalebird-desktop/pull/1459) Bump @typescript-eslint/eslint-plugin from 2.30.0 to 2.34.0
-- [#1457](https://github.com/h3poteto/whalebird-desktop/pull/1457) Bump css-loader from 3.5.2 to 3.5.3
-- [#1455](https://github.com/h3poteto/whalebird-desktop/pull/1455) Bump babel-loader from 8.0.6 to 8.1.0
-- [#1450](https://github.com/h3poteto/whalebird-desktop/pull/1450) Bump eslint-plugin-prettier from 3.1.2 to 3.1.3
-- [#1448](https://github.com/h3poteto/whalebird-desktop/pull/1448) Bump @babel/plugin-proposal-object-rest-spread from 7.9.5 to 7.9.6
-- [#1446](https://github.com/h3poteto/whalebird-desktop/pull/1446) Bump stylelint-config-standard from 19.0.0 to 20.0.0
-- [#1476](https://github.com/h3poteto/whalebird-desktop/pull/1476) Bump electron-mock-ipc from 0.3.3 to 0.3.5
-- [#1472](https://github.com/h3poteto/whalebird-desktop/pull/1472) New Crowdin translations
-
-
-### Fixed
-- [#1494](https://github.com/h3poteto/whalebird-desktop/pull/1494) closes #1438 Fix reblog target id when reblog using shortcut key
-- [#1482](https://github.com/h3poteto/whalebird-desktop/pull/1482) Fix ignore option of copy-webpack-plugin
-- [#1481](https://github.com/h3poteto/whalebird-desktop/pull/1481) Fix options for copy-webpack-plugin
-- [#1470](https://github.com/h3poteto/whalebird-desktop/pull/1470) closes #1451 Fix quoted status notification in notifications
-
-## [4.1.1] - 2020-05-18
-### Added
-- [#1435](https://github.com/h3poteto/whalebird-desktop/pull/1435) refs #1321 Show quoted status for fedibird
-- [#1433](https://github.com/h3poteto/whalebird-desktop/pull/1433) refs #1321 Show quoted status in timelines for Misskey
-- [#1431](https://github.com/h3poteto/whalebird-desktop/pull/1431) closes #1317 Show link preview in toot
-
-### Changed
-- [#1445](https://github.com/h3poteto/whalebird-desktop/pull/1445) Fix lexical scope
-- [#1437](https://github.com/h3poteto/whalebird-desktop/pull/1437) Bump html-webpack-plugin from 3.2.0 to 4.3.0
-- [#1444](https://github.com/h3poteto/whalebird-desktop/pull/1444) Add AUR link to install whalebird in README
-- [#1441](https://github.com/h3poteto/whalebird-desktop/pull/1441) Bump @typescript-eslint/parser from 2.26.0 to 2.33.0
-- [#1438](https://github.com/h3poteto/whalebird-desktop/pull/1438) Bump @typescript-eslint/typescript-estree from 2.28.0 to 2.33.0
-- [#1428](https://github.com/h3poteto/whalebird-desktop/pull/1428) Bump babel-jest from 25.4.0 to 26.0.1
-- [#1418](https://github.com/h3poteto/whalebird-desktop/pull/1418) Bump @babel/preset-env from 7.7.1 to 7.9.6
-- [#1416](https://github.com/h3poteto/whalebird-desktop/pull/1416) Bump eslint-config-standard from 12.0.0 to 14.1.1
-- [#1436](https://github.com/h3poteto/whalebird-desktop/pull/1436) [Security] Bump handlebars from 4.5.3 to 4.7.6
-- [#1434](https://github.com/h3poteto/whalebird-desktop/pull/1434) Bump blueimp-load-image from 2.26.0 to 5.10.0
-- [#1429](https://github.com/h3poteto/whalebird-desktop/pull/1429) Bump ts-loader from 6.2.2 to 7.0.3
-- [#1413](https://github.com/h3poteto/whalebird-desktop/pull/1413) Bump prettier from 2.0.4 to 2.0.5
-- [#1423](https://github.com/h3poteto/whalebird-desktop/pull/1423) Bump @babel/core from 7.9.0 to 7.9.6
-- [#1422](https://github.com/h3poteto/whalebird-desktop/pull/1422) Bump request from 2.88.0 to 2.88.2
-- [#1420](https://github.com/h3poteto/whalebird-desktop/pull/1420) Bump cfonts from 2.8.1 to 2.8.2
-- [#1419](https://github.com/h3poteto/whalebird-desktop/pull/1419) Bump file-loader from 2.0.0 to 6.0.0
-- [#1417](https://github.com/h3poteto/whalebird-desktop/pull/1417) Bump @babel/runtime from 7.9.2 to 7.9.6
-- [#1412](https://github.com/h3poteto/whalebird-desktop/pull/1412) Bump eslint-config-prettier from 6.10.1 to 6.11.0
-- [#1411](https://github.com/h3poteto/whalebird-desktop/pull/1411) Bump @types/node from 13.13.2 to 13.13.4
-- [#1409](https://github.com/h3poteto/whalebird-desktop/pull/1409) Bump ajv from 6.6.1 to 6.12.2
-- [#1405](https://github.com/h3poteto/whalebird-desktop/pull/1405) Bump vue-popperjs from 2.2.0 to 2.3.0
-- [#1430](https://github.com/h3poteto/whalebird-desktop/pull/1430) Update megalodon version to 3.1.2
-- [#1424](https://github.com/h3poteto/whalebird-desktop/pull/1424) New Crowdin translations
-
-### Fixed
-- [#1440](https://github.com/h3poteto/whalebird-desktop/pull/1440) Fix word-wrap in pre tag in status
-- [#1426](https://github.com/h3poteto/whalebird-desktop/pull/1426) closes #1425 Fix update after react emoji to the statuses
-
-## [4.1.0] - 2020-05-05
-### Added
-- [#1395](https://github.com/h3poteto/whalebird-desktop/pull/1395) New Crowdin translations
-- [#1394](https://github.com/h3poteto/whalebird-desktop/pull/1394) refs #1281 Handle emoji reactions in web socket
-- [#1393](https://github.com/h3poteto/whalebird-desktop/pull/1393) refs #1281 Add emoji reaction notification
-- [#1392](https://github.com/h3poteto/whalebird-desktop/pull/1392) New translations translation.json (Polish)
-- [#1391](https://github.com/h3poteto/whalebird-desktop/pull/1391) refs #1281 Add reaction button and refresh after reaction
-- [#1389](https://github.com/h3poteto/whalebird-desktop/pull/1389) refs #1281 Send emoji reactions to statuses
-
-### Changed
-- [#1375](https://github.com/h3poteto/whalebird-desktop/pull/1375) Bump eslint from 5.16.0 to 6.8.0
-- [#1401](https://github.com/h3poteto/whalebird-desktop/pull/1401) Bump @typescript-eslint/eslint-plugin from 2.24.0 to 2.30.0
-- [#1383](https://github.com/h3poteto/whalebird-desktop/pull/1383) Bump vue-router from 3.1.3 to 3.1.6
-- [#1380](https://github.com/h3poteto/whalebird-desktop/pull/1380) Bump eslint-plugin-node from 11.0.0 to 11.1.0
-- [#1379](https://github.com/h3poteto/whalebird-desktop/pull/1379) Bump cfonts from 2.4.6 to 2.8.1
-- [#1400](https://github.com/h3poteto/whalebird-desktop/pull/1400) Bump babel-jest from 25.3.0 to 25.4.0
-- [#1388](https://github.com/h3poteto/whalebird-desktop/pull/1388) Bump @types/node from 13.11.1 to 13.13.2
-- [#1386](https://github.com/h3poteto/whalebird-desktop/pull/1386) Bump @babel/plugin-proposal-object-rest-spread from 7.9.0 to 7.9.5
-- [#1385](https://github.com/h3poteto/whalebird-desktop/pull/1385) Bump axios from 0.19.1 to 0.19.2
-- [#1384](https://github.com/h3poteto/whalebird-desktop/pull/1384) Bump webpack-dev-server from 3.10.1 to 3.10.3
-- [#1382](https://github.com/h3poteto/whalebird-desktop/pull/1382) Bump css-loader from 3.2.0 to 3.5.2
-- [#1377](https://github.com/h3poteto/whalebird-desktop/pull/1377) Bump url-loader from 3.0.0 to 4.1.0
-- [#1376](https://github.com/h3poteto/whalebird-desktop/pull/1376) Bump vue-click-outside from 1.0.7 to 1.1.0
-- [#1374](https://github.com/h3poteto/whalebird-desktop/pull/1374) Bump sanitize-html from 1.22.0 to 1.23.0
-- [#1373](https://github.com/h3poteto/whalebird-desktop/pull/1373) Bump eslint-plugin-html from 6.0.0 to 6.0.2
-- [#1372](https://github.com/h3poteto/whalebird-desktop/pull/1372) Bump @vue/test-utils from 1.0.0-beta.32 to 1.0.0-beta.33
-- [#1370](https://github.com/h3poteto/whalebird-desktop/pull/1370) Bump eslint-plugin-standard from 4.0.0 to 4.0.1
-- [#1368](https://github.com/h3poteto/whalebird-desktop/pull/1368) Bump chalk from 3.0.0 to 4.0.0
-- [#1369](https://github.com/h3poteto/whalebird-desktop/pull/1369) Bump electron-mock-ipc from 0.3.2 to 0.3.3
-- [#1387](https://github.com/h3poteto/whalebird-desktop/pull/1387) Bump megalodon version to 3.1.1
-
-### Fixed
-- [#1398](https://github.com/h3poteto/whalebird-desktop/pull/1398) closes #1397 Fix opened user's timeline in sidebar
-- [#1396](https://github.com/h3poteto/whalebird-desktop/pull/1396) refs #1390 Fix list memberships parser when add or remove list member
-
-## [4.0.2] - 2020-04-17
-### Added
-- [#1347](https://github.com/h3poteto/whalebird-desktop/pull/1347) closes #1279 Generate sha256sum file after build
-
-### Changed
-- [#1361](https://github.com/h3poteto/whalebird-desktop/pull/1361) Bump babel-jest from 24.9.0 to 25.3.0
-- [#1366](https://github.com/h3poteto/whalebird-desktop/pull/1366) Bump prettier from 1.19.1 to 2.0.4
-- [#1360](https://github.com/h3poteto/whalebird-desktop/pull/1360) Bump stylelint from 12.0.1 to 13.3.2
-- [#1363](https://github.com/h3poteto/whalebird-desktop/pull/1363) Bump eslint-plugin-import from 2.20.0 to 2.20.2
-- [#1334](https://github.com/h3poteto/whalebird-desktop/pull/1334) Bump webpack from 4.39.2 to 4.42.1
-- [#1364](https://github.com/h3poteto/whalebird-desktop/pull/1364) Bump @typescript-eslint/typescript-estree from 2.16.0 to 2.28.0
-- [#1342](https://github.com/h3poteto/whalebird-desktop/pull/1342) Bump @babel/core from 7.8.4 to 7.9.0
-- [#1353](https://github.com/h3poteto/whalebird-desktop/pull/1353) Bump @types/node from 13.1.6 to 13.11.1
-- [#1365](https://github.com/h3poteto/whalebird-desktop/pull/1365) Bump i18next from 19.0.3 to 19.4.1
-- [#1362](https://github.com/h3poteto/whalebird-desktop/pull/1362) Bump regenerator-runtime from 0.13.3 to 0.13.5
-- [#1352](https://github.com/h3poteto/whalebird-desktop/pull/1352) Bump eslint-loader from 2.1.1 to 3.0.4
-- [#1341](https://github.com/h3poteto/whalebird-desktop/pull/1341) Bump vuex from 3.1.2 to 3.1.3
-- [#1339](https://github.com/h3poteto/whalebird-desktop/pull/1339) Bump @typescript-eslint/parser from 2.18.0 to 2.26.0
-- [#1336](https://github.com/h3poteto/whalebird-desktop/pull/1336) Bump jsdom from 15.2.1 to 16.2.2
-- [#1333](https://github.com/h3poteto/whalebird-desktop/pull/1333) Bump ts-loader from 6.2.1 to 6.2.2
-- [#1331](https://github.com/h3poteto/whalebird-desktop/pull/1331) Bump webpack-cli from 3.3.10 to 3.3.11
-- [#1327](https://github.com/h3poteto/whalebird-desktop/pull/1327) Bump cross-env from 5.2.0 to 7.0.2
-- [#1330](https://github.com/h3poteto/whalebird-desktop/pull/1330) Bump babel-eslint from 10.0.3 to 10.1.0
-- [#1328](https://github.com/h3poteto/whalebird-desktop/pull/1328) Bump style-loader from 1.1.2 to 1.1.3
-- [#1322](https://github.com/h3poteto/whalebird-desktop/pull/1322) Bump @babel/plugin-proposal-object-rest-spread from 7.7.7 to 7.9.0
-- [#1359](https://github.com/h3poteto/whalebird-desktop/pull/1359) Update electron version to 7.2.1
-- [#1358](https://github.com/h3poteto/whalebird-desktop/pull/1358) Update typescript version to 3.8.3
-- [#1356](https://github.com/h3poteto/whalebird-desktop/pull/1356) Update electron-log to 4.1.1 and fix proxy spec
-
-
-### Fixed
-- [#1355](https://github.com/h3poteto/whalebird-desktop/pull/1355) closes #1263 Specify word-break to normal in New toot
-- [#1354](https://github.com/h3poteto/whalebird-desktop/pull/1354) closes #1318 Apply font-size settings in New toot
-
-
-## [4.0.1] - 2020-04-03
-### Added
-- [#1337](https://github.com/h3poteto/whalebird-desktop/pull/1337) closes #1307 Confirm timelines after initialized
-- [#1279](https://github.com/h3poteto/whalebird-desktop/pull/1279) closes #1279 Generate sha256sum file after build
-
-### Changed
-- [#1319](https://github.com/h3poteto/whalebird-desktop/pull/1319) Bump @babel/runtime from 7.8.0 to 7.9.2
-- [#1305](https://github.com/h3poteto/whalebird-desktop/pull/1305) Bump vue-loader from 15.8.3 to 15.9.1
-- [#1315](https://github.com/h3poteto/whalebird-desktop/pull/1315) Bump eslint-config-prettier from 6.9.0 to 6.10.1
-- [#1311](https://github.com/h3poteto/whalebird-desktop/pull/1311) Bump @vue/test-utils from 1.0.0-beta.30 to 1.0.0-beta.32
-- [#1306](https://github.com/h3poteto/whalebird-desktop/pull/1306) Bump eslint-plugin-promise from 4.0.1 to 4.2.1
-- [#1274](https://github.com/h3poteto/whalebird-desktop/pull/1274) Bump mini-css-extract-plugin from 0.4.5 to 0.9.0
-- [#1304](https://github.com/h3poteto/whalebird-desktop/pull/1304) Bump mousetrap from 1.6.3 to 1.6.5
-- [#1303](https://github.com/h3poteto/whalebird-desktop/pull/1303) Bump @typescript-eslint/eslint-plugin from 2.19.0 to 2.24.0
-- [#1301](https://github.com/h3poteto/whalebird-desktop/pull/1301) Bump eslint-plugin-vue from 6.1.2 to 6.2.2
-- [#1299](https://github.com/h3poteto/whalebird-desktop/pull/1299) Bump webpack-merge from 4.1.4 to 4.2.2
-- [#1290](https://github.com/h3poteto/whalebird-desktop/pull/1290) Bump @types/jest from 24.9.1 to 25.1.4
-- [#1288](https://github.com/h3poteto/whalebird-desktop/pull/1288) Bump sanitize-html from 1.20.1 to 1.22.0
-- [#1272](https://github.com/h3poteto/whalebird-desktop/pull/1272) Bump babel-plugin-istanbul from 5.1.0 to 6.0.0
-- [#1271](https://github.com/h3poteto/whalebird-desktop/pull/1271) Bump node-sass from 4.13.0 to 4.13.1
-- [#1270](https://github.com/h3poteto/whalebird-desktop/pull/1270) Bump @trodi/electron-splashscreen from 0.3.4 to 1.0.0
-
-### Fixed
-- [#1345](https://github.com/h3poteto/whalebird-desktop/pull/1345) closes #1325 Update megalodon version to 3.0.1
-
-## [4.0.0] - 2020-03-24
-### Added
-- [#1298](https://github.com/h3poteto/whalebird-desktop/pull/1298) refs #816 Add support for Misskey login
-
-### Changed
-- [#1314](https://github.com/h3poteto/whalebird-desktop/pull/1314) New Crowdin translations
-- [#1312](https://github.com/h3poteto/whalebird-desktop/pull/1312) New Crowdin translations
-- [#1309](https://github.com/h3poteto/whalebird-desktop/pull/1309) New Crowdin translations
-
-## [3.2.0] - 2020-03-17
-### Added
-- [#1278](https://github.com/h3poteto/whalebird-desktop/pull/1278) Add bidi support
-- [#1269](https://github.com/h3poteto/whalebird-desktop/pull/1269) Load system theme for dark mode
-
-### Changed
-- [#1296](https://github.com/h3poteto/whalebird-desktop/pull/1296) Update electron-builder version to 22.4.0
-- [#1292](https://github.com/h3poteto/whalebird-desktop/pull/1292) Update megalodon version to 3.0.0-beta.4
-- [#1293](https://github.com/h3poteto/whalebird-desktop/pull/1293) Update sideci settings
-- [#1291](https://github.com/h3poteto/whalebird-desktop/pull/1291) [Security] Bump acorn from 5.7.3 to 5.7.4
-- [#1268](https://github.com/h3poteto/whalebird-desktop/pull/1268) Upgrade Electron version to 7.1.11
-- [#1266](https://github.com/h3poteto/whalebird-desktop/pull/1266) Bump @typescript-eslint/eslint-plugin from 1.5.0 to 2.19.0
-- [#1264](https://github.com/h3poteto/whalebird-desktop/pull/1264) Bump electron-context-menu from 0.15.2 to 0.16.0
-- [#1262](https://github.com/h3poteto/whalebird-desktop/pull/1262) Bump vue-loader from 15.7.2 to 15.8.3
-- [#1261](https://github.com/h3poteto/whalebird-desktop/pull/1261) Bump electron-json-storage from 4.1.5 to 4.1.8
-- [#1260](https://github.com/h3poteto/whalebird-desktop/pull/1260) Bump eslint-plugin-import from 2.19.1 to 2.20.0
-- [#1259](https://github.com/h3poteto/whalebird-desktop/pull/1259) Bump prettier from 1.17.0 to 1.19.1
-- [#1254](https://github.com/h3poteto/whalebird-desktop/pull/1254) Bump @typescript-eslint/parser from 2.15.0 to 2.18.0
-- [#1256](https://github.com/h3poteto/whalebird-desktop/pull/1256) Bump @babel/core from 7.7.7 to 7.8.4
-- [#1252](https://github.com/h3poteto/whalebird-desktop/pull/1252) Bump @types/jest from 24.0.25 to 24.9.1
-- [#1248](https://github.com/h3poteto/whalebird-desktop/pull/1248) Bump sass-loader from 7.1.0 to 8.0.2
-- [#1246](https://github.com/h3poteto/whalebird-desktop/pull/1246) Bump core-js from 3.6.1 to 3.6.4
-- [#1244](https://github.com/h3poteto/whalebird-desktop/pull/1244) Bump @typescript-eslint/typescript-estree from 1.5.0 to 2.16.0
-- [#1241](https://github.com/h3poteto/whalebird-desktop/pull/1241) Bump @babel/plugin-proposal-class-properties from 7.7.0 to 7.8.3
-
-## [3.1.0] - 2020-01-23
-### Added
-- [#1223](https://github.com/h3poteto/whalebird-desktop/pull/1223) Read exif and rotate image for all attachment images
-
-### Changed
-
-- [#1239](https://github.com/h3poteto/whalebird-desktop/pull/1239) Bump all-object-keys from 1.1.1 to 2.1.1
-- [#1238](https://github.com/h3poteto/whalebird-desktop/pull/1238) Bump webpack-cli from 3.1.2 to 3.3.10
-- [#1237](https://github.com/h3poteto/whalebird-desktop/pull/1237) Bump @types/node from 11.11.4 to 13.1.6
-- [#1236](https://github.com/h3poteto/whalebird-desktop/pull/1236) Bump ts-jest from 24.2.0 to 24.3.0
-- [#1235](https://github.com/h3poteto/whalebird-desktop/pull/1235) Bump electron-context-menu from 0.15.1 to 0.15.2
-- [#1234](https://github.com/h3poteto/whalebird-desktop/pull/1234) Bump element-ui from 2.4.11 to 2.13.0
-- [#1233](https://github.com/h3poteto/whalebird-desktop/pull/1233) Bump @babel/plugin-transform-runtime from 7.6.2 to 7.8.3
-- [#1230](https://github.com/h3poteto/whalebird-desktop/pull/1230) Bump @babel/runtime from 7.7.7 to 7.8.0
-- [#1229](https://github.com/h3poteto/whalebird-desktop/pull/1229) Bump vuex from 3.0.1 to 3.1.2
-- [#1228](https://github.com/h3poteto/whalebird-desktop/pull/1238) Bump @mapbox/stylelint-processor-arbitrary-tags from 0.2.0 to 0.3.0
-- [#1227](https://github.com/h3poteto/whalebird-desktop/pull/1227) Bump @typescript-eslint/parser from 1.5.0 to 2.15.0
-- [#1224](https://github.com/h3poteto/whalebird-desktop/pull/1224) Hide detail menu in toot detail sidebar
-- [#1217](https://github.com/h3poteto/whalebird-desktop/pull/1217) Update electron-builder version to >= 22.0.0
-- [#1215](https://github.com/h3poteto/whalebird-desktop/pull/1215) Bump moment from 2.22.2 to 2.24.0
-- [#1211](https://github.com/h3poteto/whalebird-desktop/pull/1211) Bump electron-mock-ipc from 0.3.1 to 0.3.2
-- [#1214](https://github.com/h3poteto/whalebird-desktop/pull/1214) Bump eslint-plugin-node from 10.0.0 to 11.0.0
-- [#1213](https://github.com/h3poteto/whalebird-desktop/pull/1213) Bump axios from 0.19.0 to 0.19.1
-- [#1212](https://github.com/h3poteto/whalebird-desktop/pull/1212) Bump i18next from 12.1.0 to 19.0.3
-- [#1210](https://github.com/h3poteto/whalebird-desktop/pull/1210) Bump url-loader from 2.2.0 to 3.0.0
-- [#1209](https://github.com/h3poteto/whalebird-desktop/pull/1209) Bump stylelint from 10.1.0 to 12.0.1
-- [#1208](https://github.com/h3poteto/whalebird-desktop/pull/1208) Bump vue-shortkey from 3.1.6 to 3.1.7
-
-### Fixed
-
-- [#1232](https://github.com/h3poteto/whalebird-desktop/pull/1232) Fix url-loader for loading icon
-- [#1231](https://github.com/h3poteto/whalebird-desktop/pull/1231) Catch error when can not load image in exifImageUrl
-- [#1221](https://github.com/h3poteto/whalebird-desktop/pull/1221) Fix lazy loading for account timeline in sidebar
-- [#1219](https://github.com/h3poteto/whalebird-desktop/pull/1219) Fix i18next namespace for new version
-
-
-
-## [3.0.3] - 2020-01-08
-### Changed
-- [#1207](https://github.com/h3poteto/whalebird-desktop/pull/1207) Update electron version to 6.1.7
-- [#1201](https://github.com/h3poteto/whalebird-desktop/pull/1201) Bump @types/jest from 24.0.15 to 24.0.25
-- [#1204](https://github.com/h3poteto/whalebird-desktop/pull/1204) Bump animate.css from 3.7.0 to 3.7.2
-- [#1203](https://github.com/h3poteto/whalebird-desktop/pull/1203) Bump ts-jest from 24.0.2 to 24.2.0
-- [#1202](https://github.com/h3poteto/whalebird-desktop/pull/1202) Bump webpack-dev-server from 3.9.0 to 3.10.1
-- [#1200](https://github.com/h3poteto/whalebird-desktop/pull/1200) Bump @types/nedb from 1.8.7 to 1.8.9
-- [#1199](https://github.com/h3poteto/whalebird-desktop/pull/1199) Bump eslint-plugin-vue from 6.0.1 to 6.1.2
-- [#1198](https://github.com/h3poteto/whalebird-desktop/pull/1198) Bump cfonts from 2.4.5 to 2.4.6
-- [#1197](https://github.com/h3poteto/whalebird-desktop/pull/1197) Bump @babel/core from 7.4.3 to 7.7.7
-- [#1205](https://github.com/h3poteto/whalebird-desktop/pull/1205) New Crowdin translations
-- [#1194](https://github.com/h3poteto/whalebird-desktop/pull/1194) Bump eslint-plugin-prettier from 3.0.1 to 3.1.2
-- [#1196](https://github.com/h3poteto/whalebird-desktop/pull/1196) Bump eslint-config-prettier from 6.7.0 to 6.9.0
-- [#1195](https://github.com/h3poteto/whalebird-desktop/pull/1195) Bump @babel/runtime from 7.7.4 to 7.7.7
-- [#1193](https://github.com/h3poteto/whalebird-desktop/pull/1193) Bump @vue/test-utils from 1.0.0-beta.29 to 1.0.0-beta.30
-- [#1192](https://github.com/h3poteto/whalebird-desktop/pull/1192) New Crowdin translations
-- [#1191](https://github.com/h3poteto/whalebird-desktop/pull/1191) Bump core-js from 3.0.0 to 3.6.1
-- [#1186](https://github.com/h3poteto/whalebird-desktop/pull/1186) Bump vue and vue-template-compiler
-- [#1190](https://github.com/h3poteto/whalebird-desktop/pull/1190) Bump style-loader from 1.0.0 to 1.1.2
-- [#1185](https://github.com/h3poteto/whalebird-desktop/pull/1185) Bump copy-webpack-plugin from 5.0.5 to 5.1.1
-- [#1183](https://github.com/h3poteto/whalebird-desktop/pull/1183) Bump eslint-plugin-vue from 5.2.2 to 6.0.1
-- [#1182](https://github.com/h3poteto/whalebird-desktop/pull/1182) Bump eslint-plugin-import from 2.18.2 to 2.19.1
-- [#1180](https://github.com/h3poteto/whalebird-desktop/pull/1180) Bump eslint-config-prettier from 4.1.0 to 6.7.0
-- [#1176](https://github.com/h3poteto/whalebird-desktop/pull/1176) Bump @babel/plugin-proposal-object-rest-spread from 7.7.4 to 7.7.7
-
-
-
-## [3.0.2] - 2019-12-23
-### Changed
-- [#1142](https://github.com/h3poteto/whalebird-desktop/pull/1142) Bump cfonts from 2.3.0 to 2.4.5
-- [#1160](https://github.com/h3poteto/whalebird-desktop/pull/1160) Bump @babel/plugin-proposal-object-rest-spread from 7.4.3 to 7.7.4
-- [#1153](https://github.com/h3poteto/whalebird-desktop/pull/1153) Bump @babel/runtime from 7.4.3 to 7.7.4
-- [#1151](https://github.com/h3poteto/whalebird-desktop/pull/1151) Bump regenerator-runtime from 0.13.1 to 0.13.3
-- [#1152](https://github.com/h3poteto/whalebird-desktop/pull/1152) Bump @types/i18next from 12.1.0 to 13.0.0
-- [#1150](https://github.com/h3poteto/whalebird-desktop/pull/1150) Bump stylelint-config-standard from 18.3.0 to 19.0.0
-- [#1141](https://github.com/h3poteto/whalebird-desktop/pull/1141) Bump sanitize-html from 1.19.3 to 1.20.1
-- [#1139](https://github.com/h3poteto/whalebird-desktop/pull/1139) Bump babel-loader from 8.0.5 to 8.0.6
-- [#1138](https://github.com/h3poteto/whalebird-desktop/pull/1138) Bump vue-popperjs from 1.6.1 to 2.2.0
-
-### Fixed
-- [#1177](https://github.com/h3poteto/whalebird-desktop/pull/1177) Fix loading css path for vue-popper.js
-- [#1175](https://github.com/h3poteto/whalebird-desktop/pull/1175) Fix reading translation files japanese and italian
-
-## [3.0.1] - 2019-12-22
-### Added
-- [#1169](https://github.com/h3poteto/whalebird-desktop/pull/1169) Search account in reply_to and context before account name search
-- [#1129](https://github.com/h3poteto/whalebird-desktop/pull/1129) Add sponsor link in donate
-- [#1128](https://github.com/h3poteto/whalebird-desktop/pull/1128) Add FUNDING.yml for sponsors
-- [#1127](https://github.com/h3poteto/whalebird-desktop/pull/1127) Add dependabot badge in README
-- [#1125](https://github.com/h3poteto/whalebird-desktop/pull/1125) Add some empty language translations
-- [#1124](https://github.com/h3poteto/whalebird-desktop/pull/1124) Add explain for crowdin in readme
-- [#1117](https://github.com/h3poteto/whalebird-desktop/pull/1117) Update crowdin to specify locale mapping
-- [#1115](https://github.com/h3poteto/whalebird-desktop/pull/1115) Introduce Crowdin configuration
-
-### Changed
-- [#1168](https://github.com/h3poteto/whalebird-desktop/pull/1168) Update node version to 12.13.1 in CircleCI
-- [#1165](https://github.com/h3poteto/whalebird-desktop/pull/1165) New Crowdin translations
-- [#1155](https://github.com/h3poteto/whalebird-desktop/pull/1155) Use ipcRenderer directly from electron
-- [#1149](https://github.com/h3poteto/whalebird-desktop/pull/1149) Load translation json directly instead of i18next-sync-fs-backend
-- [#1148](https://github.com/h3poteto/whalebird-desktop/pull/1148) Stop to specify libraryTarget for renderer in webpack
-- [#1137](https://github.com/h3poteto/whalebird-desktop/pull/1137) Bump style-loader from 0.23.1 to 1.0.0
-- [#1143](https://github.com/h3poteto/whalebird-desktop/pull/1143) Bump @panter/vue-i18next from 0.13.0 to 0.15.1
-- [#1144](https://github.com/h3poteto/whalebird-desktop/pull/1144) Bump about-window from 1.13.1 to 1.13.2
-- [#1145](https://github.com/h3poteto/whalebird-desktop/pull/1145) Bump @types/lodash from 4.14.123 to 4.14.149
-- [#1146](https://github.com/h3poteto/whalebird-desktop/pull/1146) Bump eslint-plugin-import from 2.14.0 to 2.18.2
-- [#1147](https://github.com/h3poteto/whalebird-desktop/pull/1147) Use window object in index.ejs
-- [#1135](https://github.com/h3poteto/whalebird-desktop/pull/1135) Use ipc, shell and clipboard from preload.js
-- [#1133](https://github.com/h3poteto/whalebird-desktop/pull/1133) Bump axios from 0.18.1 to 0.19.0
-- [#1122](https://github.com/h3poteto/whalebird-desktop/pull/1122) Bump webpack-dev-server from 3.8.0 to 3.9.0
-- [#1130](https://github.com/h3poteto/whalebird-desktop/pull/1130) Bump jsdom from 13.0.0 to 15.2.1
-- [#1131](https://github.com/h3poteto/whalebird-desktop/pull/1131) Bump chalk from 2.4.2 to 3.0.0
-- [#1132](https://github.com/h3poteto/whalebird-desktop/pull/1132) Bump del from 3.0.0 to 5.1.0
-- [#1123](https://github.com/h3poteto/whalebird-desktop/pull/1123) Bump eslint-plugin-html from 4.0.6 to 6.0.0
-- [#1121](https://github.com/h3poteto/whalebird-desktop/pull/1121) Bump @babel/preset-env from 7.4.3 to 7.7.1
-- [#1134](https://github.com/h3poteto/whalebird-desktop/pull/1134) Bump vue-awesome from 3.2.0 to 4.0.2
-- [#1120](https://github.com/h3poteto/whalebird-desktop/pull/1120) Bump hoek from 6.1.2 to 6.1.3
-- [#1119](https://github.com/h3poteto/whalebird-desktop/pull/1119) Bump electron-context-menu from 0.12.0 to 0.15.1
-- [#1126](https://github.com/h3poteto/whalebird-desktop/pull/1126) New Crowdin translations
-- [#1118](https://github.com/h3poteto/whalebird-desktop/pull/1118) New Crowdin translations
-- [#1116](https://github.com/h3poteto/whalebird-desktop/pull/1116) New Crowdin translations
-- [#1113](https://github.com/h3poteto/whalebird-desktop/pull/1113) Always fallback to English when the translation key is missing
-- [#1108](https://github.com/h3poteto/whalebird-desktop/pull/1108) Bump mousetrap from 1.6.2 to 1.6.3
-- [#1109](https://github.com/h3poteto/whalebird-desktop/pull/1109) Bump url-loader from 1.1.2 to 2.2.0
-- [#1110](https://github.com/h3poteto/whalebird-desktop/pull/1110) Bump vue-router from 3.0.2 to 3.1.3
-- [#1111](https://github.com/h3poteto/whalebird-desktop/pull/1111) Bump electron-debug from 2.2.0 to 3.0.1
-- [#1112](https://github.com/h3poteto/whalebird-desktop/pull/1112) Bump eslint-plugin-node from 8.0.0 to 10.0.0
-- [#1104](https://github.com/h3poteto/whalebird-desktop/pull/1104) Bump @babel/plugin-proposal-class-properties from 7.4.0 to 7.7.0
-- [#1103](https://github.com/h3poteto/whalebird-desktop/pull/1103) Bump copy-webpack-plugin from 4.6.0 to 5.0.5
-- [#1105](https://github.com/h3poteto/whalebird-desktop/pull/1105) Update Italy translations
-- [#1080](https://github.com/h3poteto/whalebird-desktop/pull/1080) Bump @babel/plugin-proposal-class-properties from 7.4.0 to 7.5.5
-- [#1082](https://github.com/h3poteto/whalebird-desktop/pull/1082) Bump css-loader from 3.0.0 to 3.2.0
-- [#1079](https://github.com/h3poteto/whalebird-desktop/pull/1079) Bump vue-loader from 15.4.2 to 15.7.2
-- [#1078](https://github.com/h3poteto/whalebird-desktop/pull/1079) Bump @babel/plugin-transform-runtime from 7.4.3 to 7.6.2
-- [#1073](https://github.com/h3poteto/whalebird-desktop/pull/1073) Bump ts-loader from 6.0.4 to 6.2.1
-- [#1074](https://github.com/h3poteto/whalebird-desktop/pull/1074) Bump node-sass from 4.12.0 to 4.13.0
-- [#1072](https://github.com/h3poteto/whalebird-desktop/pull/1072) Bump chalk from 2.4.1 to 2.4.2
-- [#1071](https://github.com/h3poteto/whalebird-desktop/pull/1071) Bump webpack-hot-middleware from 2.24.3 to 2.25.0
-- [#1070](https://github.com/h3poteto/whalebird-desktop/pull/1070) Bump babel-eslint from 10.0.1 to 10.0.3
-
-### Fixed
-- [#1174](https://github.com/h3poteto/whalebird-desktop/pull/1174) Remove babel-minify because webpack can minify using terser when production
-- [#1172](https://github.com/h3poteto/whalebird-desktop/pull/1172) Build preload script for production
-- [#1171](https://github.com/h3poteto/whalebird-desktop/pull/1171) Update megalodon version to 2.1.1
-- [#1167](https://github.com/h3poteto/whalebird-desktop/pull/1167) Add test for toot parser
-- [#1166](https://github.com/h3poteto/whalebird-desktop/pull/1166) Remove word-break in toot
-- [#1164](https://github.com/h3poteto/whalebird-desktop/pull/1164) Use default preference if the file does not exist when get proxy configuration
-- [#1162](https://github.com/h3poteto/whalebird-desktop/pull/1162) Update megalodon version to 2.1.0
-- [#1159](https://github.com/h3poteto/whalebird-desktop/pull/1159) Update jest version to 24.9.0 and fix some tests
-- [#1157](https://github.com/h3poteto/whalebird-desktop/pull/1157) Update electron-mock-ipc version to 0.3.1
-
-## [3.0.0] - 2019-11-17
-### Added
-- [#1090](https://github.com/h3poteto/whalebird-desktop/pull/1090) Add AppImage in release builds
-- [#1081](https://github.com/h3poteto/whalebird-desktop/pull/1081) Add notice in login for users who use proxy server
-- [#1069](https://github.com/h3poteto/whalebird-desktop/pull/1069) Reload proxy configuration after changed
-- [#1066](https://github.com/h3poteto/whalebird-desktop/pull/1066) Load proxy information and apply for all network connection
-- [#1060](https://github.com/h3poteto/whalebird-desktop/pull/1060) Add a tray menu to open window
-- [#1064](https://github.com/h3poteto/whalebird-desktop/pull/1064) Add proxy configuration in preferences
-
-### Changed
-- [#1094](https://github.com/h3poteto/whalebird-desktop/pull/1094) Use system proxy as default in preferences
-- [#1093](https://github.com/h3poteto/whalebird-desktop/pull/1093) Update word instance to server
-- [#1088](https://github.com/h3poteto/whalebird-desktop/pull/1088) Update translation when domain does not find
-- [#1087](https://github.com/h3poteto/whalebird-desktop/pull/1087) Check instance API before request host-meta when confirm instance
-- [#1067](https://github.com/h3poteto/whalebird-desktop/pull/1067) Update electron version to 6.1.0
-- [#1063](https://github.com/h3poteto/whalebird-desktop/pull/1063) Replace old Hiragino font for macOS
-- [#1062](https://github.com/h3poteto/whalebird-desktop/pull/1062) Update megalodon version to 2.0.0
-
-### Fixed
-- [#1101](https://github.com/h3poteto/whalebird-desktop/pull/1101) fix: Codesign script for app store
-- [#1100](https://github.com/h3poteto/whalebird-desktop/pull/1100) fix: Remove debugging code in websocket
-- [#1099](https://github.com/h3poteto/whalebird-desktop/pull/1099) Update megalodon version to 2.0.1
-- [#1097](https://github.com/h3poteto/whalebird-desktop/pull/1097) Reject duplicated status when append statuses in mutations
-- [#1089](https://github.com/h3poteto/whalebird-desktop/pull/1089) Trim authorization token and domain URL
-- [#1068](https://github.com/h3poteto/whalebird-desktop/pull/1068) Fix comparison between login user and target account
-
-
-## [2.9.0] - 2019-10-11
-### Added
-- [#1056](https://github.com/h3poteto/whalebird-desktop/pull/1056) Upgrade electron version to 5.0.11
-- [#1045](https://github.com/h3poteto/whalebird-desktop/pull/1045) Add a preference to auto launch at login
-
-### Changed
-- [#1057](https://github.com/h3poteto/whalebird-desktop/pull/1057) Update electron-builder version to 21.2.0
-- [#1053](https://github.com/h3poteto/whalebird-desktop/pull/1053) Allow resize sidebar using drag
-- [#1049](https://github.com/h3poteto/whalebird-desktop/pull/1049) Through auto-launch in darwin
-- [#1048](https://github.com/h3poteto/whalebird-desktop/pull/1048) Add shortcut description for reload
-- [#1047](https://github.com/h3poteto/whalebird-desktop/pull/1047) Remove QR code for bitcoin
-
-### Fixed
-- [#1052](https://github.com/h3poteto/whalebird-desktop/pull/1052) Fix scrollbar design for preferences and settings
-- [#1050](https://github.com/h3poteto/whalebird-desktop/pull/1050) Fix loading color in preferences
-
-
-## [2.8.6] - 2019-09-19
-### Added
-- [#1043](https://github.com/h3poteto/whalebird-desktop/pull/1043) Start to pacman support in release package
-- [#1038](https://github.com/h3poteto/whalebird-desktop/pull/1038) Add reload method in SideBar
-
-### Changed
-- [#1044](https://github.com/h3poteto/whalebird-desktop/pull/1044) Update electron version to 5.0.10
-- [#1041](https://github.com/h3poteto/whalebird-desktop/pull/1041) Replace multispinner with another one
-- [#1033](https://github.com/h3poteto/whalebird-desktop/pull/1033) Use authorized request to get instance information when start streamings
-- [#1032](https://github.com/h3poteto/whalebird-desktop/pull/1032) Confirm ActivityPub instance to read host-meta before login
-
-### Fixed
-- [#1042](https://github.com/h3poteto/whalebird-desktop/pull/1042) Do not enforce single instance in darwin
-- [#1037](https://github.com/h3poteto/whalebird-desktop/pull/1037) Fix validation status when change the domain in Login
-
-
-## [2.8.5] - 2019-09-09
-### Changed
-- [#1029](https://github.com/h3poteto/whalebird-desktop/pull/1029) Block to root path when user use browser-back
-- [#1024](https://github.com/h3poteto/whalebird-desktop/pull/1024) Update German translation
-- [#1020](https://github.com/h3poteto/whalebird-desktop/pull/1020) audit: Update eslint-utils version to 1.4.2
-- [#1016](https://github.com/h3poteto/whalebird-desktop/pull/1016) Update megalodon version to 1.0.2
-- [#1015](https://github.com/h3poteto/whalebird-desktop/pull/1015) Update megalodon version to 1.0.1
-- [#1014](https://github.com/h3poteto/whalebird-desktop/pull/1014) Enforces single instance for linux and windows
-
-### Fixed
-- [#1026](https://github.com/h3poteto/whalebird-desktop/pull/1026) Set word-break for toot content
-- [#1023](https://github.com/h3poteto/whalebird-desktop/pull/1023) Update megalodon version to 1.0.3
-- [#1019](https://github.com/h3poteto/whalebird-desktop/pull/1019) fix: Close request when modal is closed
-- [#1018](https://github.com/h3poteto/whalebird-desktop/pull/1018) fix: Remove cache file when load error
-- [#1013](https://github.com/h3poteto/whalebird-desktop/pull/1013) Enable nodeIntegration in about window
-
-
-
-## [2.8.4] - 2019-08-23
-### Added
-- [#1006](https://github.com/h3poteto/whalebird-desktop/pull/1006) Show tray icon only linux and windows, and append tray menu
-
-### Changed
-- [#1008](https://github.com/h3poteto/whalebird-desktop/pull/1008) Set autoplay for movie attachments
-- [#1007](https://github.com/h3poteto/whalebird-desktop/pull/1007) Update Electron version to 5.0.9
-- [#1004](https://github.com/h3poteto/whalebird-desktop/pull/1004) Cancel requests when suggestion is selected or closed
-- [#1003](https://github.com/h3poteto/whalebird-desktop/pull/1003) Update changelog
-
-### Fixed
-- [#1011](https://github.com/h3poteto/whalebird-desktop/pull/1011) Through close event when platform is darwin
-- [#1005](https://github.com/h3poteto/whalebird-desktop/pull/1005) Update French translation
-
-
-
-## [2.8.3] - 2019-08-13
-### Added
-- [#1000](https://github.com/h3poteto/whalebird-desktop/pull/1000) Add spec for zh_cn translation json
-- [#998](https://github.com/h3poteto/whalebird-desktop/pull/998) Simplified Chinese translation
-- [#995](https://github.com/h3poteto/whalebird-desktop/pull/995) Cache accounts and search cache when suggest
-- [#990](https://github.com/h3poteto/whalebird-desktop/pull/990) Cache hashtags
-- [#984](https://github.com/h3poteto/whalebird-desktop/pull/984) Add description for CSC_NAME in document
-
-### Changed
-- [#997](https://github.com/h3poteto/whalebird-desktop/pull/997) Use v2 API for suggestion
-- [#994](https://github.com/h3poteto/whalebird-desktop/pull/994) Move suggest logic to vuex
-- [#986](https://github.com/h3poteto/whalebird-desktop/pull/986) Use websocket as default streaming method for all timelines
-
-### Fixed
-- [#1001](https://github.com/h3poteto/whalebird-desktop/pull/1001) Fix API endpoint for direct messages, use conversations
-- [#996](https://github.com/h3poteto/whalebird-desktop/pull/996) Fix uniqueness in suggestion
-- [#987](https://github.com/h3poteto/whalebird-desktop/pull/987) Get streaming url for instance API before start streaming
-
-
-
-## [2.8.2] - 2019-07-25
-### Changed
-- [#974](https://github.com/h3poteto/whalebird-desktop/pull/974) Notify notification in main process
-- [#973](https://github.com/h3poteto/whalebird-desktop/pull/973) Update screenshot in README for recent updates
-
-### Fixed
-- [#981](https://github.com/h3poteto/whalebird-desktop/pull/981) Set appId to notify in windows10
-- [#979](https://github.com/h3poteto/whalebird-desktop/pull/979) fix: Check webContents status when receive status in streaming
-- [#978](https://github.com/h3poteto/whalebird-desktop/pull/978) Check webContent status before send event in all streamings
-- [#977](https://github.com/h3poteto/whalebird-desktop/pull/977) Fix digits number of percentage in polls
-
-
-## [2.8.1] - 2019-07-21
-### Added
-- [#966](https://github.com/h3poteto/whalebird-desktop/pull/966) Add a spec for translation json files
-- [#963](https://github.com/h3poteto/whalebird-desktop/pull/963) Add polls form in new toot modal
-- [#962](https://github.com/h3poteto/whalebird-desktop/pull/962) Add poll form in Toot
-
-## Changed
-- [#961](https://github.com/h3poteto/whalebird-desktop/pull/961) Update megalodon version to 0.8.2
-- [#960](https://github.com/h3poteto/whalebird-desktop/pull/960) Update outdated packages
-- [#959](https://github.com/h3poteto/whalebird-desktop/pull/959) Update megalodon version to 0.8.1
-
-## Fixed
-- [#971](https://github.com/h3poteto/whalebird-desktop/pull/971) Clear polls after close new toot modal
-- [#970](https://github.com/h3poteto/whalebird-desktop/pull/970) Attach only polls if it is specified
-- [#968](https://github.com/h3poteto/whalebird-desktop/pull/968) Fix code link in README which explain who to add new language
-- [#967](https://github.com/h3poteto/whalebird-desktop/pull/967) Add default fonts for emoji in Linux
-
-
-
-## [2.8.0] - 2019-07-13
-### Added
-- [#946](https://github.com/h3poteto/whalebird-desktop/pull/946) Run all userstreaming in background and notify for all accounts
-
-### Changed
-- [#955](https://github.com/h3poteto/whalebird-desktop/pull/955) Remove unused tests and packages
-- [#954](https://github.com/h3poteto/whalebird-desktop/pull/954) Update outdated packages
-- [#953](https://github.com/h3poteto/whalebird-desktop/pull/953) Use electron-mock-ipc instead of electron-ipc-mock
-- [#951](https://github.com/h3poteto/whalebird-desktop/pull/951) Update node version to 10.16.0
-- [#950](https://github.com/h3poteto/whalebird-desktop/pull/950) Update megalodon version to 0.8.0
-
-### Fixed
-- [#957](https://github.com/h3poteto/whalebird-desktop/pull/957) Stop user streaming after remove account association
-
-
-
-## [2.7.5] - 2019-06-20
-### Changed
-- [#945](https://github.com/h3poteto/whalebird-desktop/pull/945) Update Electron version to 4.2.4
-- [#944](https://github.com/h3poteto/whalebird-desktop/pull/944) Allow up to 72pt font in Appearance
-- [#939](https://github.com/h3poteto/whalebird-desktop/pull/939) Add integration tests for Contents
-
-### Fixed
-- [#942](https://github.com/h3poteto/whalebird-desktop/pull/942) Update megalodon version to 0.7.5
-
-
-## [2.7.4] - 2019-06-12
-### Added
-
-- [#935](https://github.com/h3poteto/whalebird-desktop/pull/935) Customize toot padding
-- [#929](https://github.com/h3poteto/whalebird-desktop/pull/929) Add arm architecture in build target
-
-### Changed
-
-- [#938](https://github.com/h3poteto/whalebird-desktop/pull/938) Update megalodon version to 0.7.2
-- [#937](https://github.com/h3poteto/whalebird-desktop/pull/937) refactor: Use type instead of interface
-- [#936](https://github.com/h3poteto/whalebird-desktop/pull/936) refactor: Replace any type and organize preference
-- [#931](https://github.com/h3poteto/whalebird-desktop/pull/931) Update megalodon version to 0.7.1
-- [#930](https://github.com/h3poteto/whalebird-desktop/pull/930) Handle delete event of streamings
-
-### Fixed
-
-- [#941](https://github.com/h3poteto/whalebird-desktop/pull/941) Update megalodon for User Agent and add User Agent in streaming
-- [#933](https://github.com/h3poteto/whalebird-desktop/pull/933) Fix hashtag when it is fixed
-- [#928](https://github.com/h3poteto/whalebird-desktop/pull/928) Upgrade megalodon and fix id type
-
-
-
-## [2.7.3] - 2019-05-27
-### Added
-- [#925](https://github.com/h3poteto/whalebird-desktop/pull/925) Update access token using refresh token when expire the token
-
-### Fixed
-
-- [#927](https://github.com/h3poteto/whalebird-desktop/pull/927) Downgrade electron version to 4.2.2
-- [#924](https://github.com/h3poteto/whalebird-desktop/pull/924) Stop loading after initialized in direct messages
-- [#922](https://github.com/h3poteto/whalebird-desktop/pull/922) Unbind streaming for mentions when change accounts
-
-
-## [2.7.2] - 2019-05-21
-### Added
-- [#911](https://github.com/h3poteto/whalebird-desktop/pull/911) Add a menu to read follow requests, and accept/reject it
-- [#903](https://github.com/h3poteto/whalebird-desktop/pull/903) Add Italian translation
-- [#902](https://github.com/h3poteto/whalebird-desktop/pull/902) Add request loading circle
-### Changed
-- [#917](https://github.com/h3poteto/whalebird-desktop/pull/917) Change loading in order to change channel while loading
-- [#916](https://github.com/h3poteto/whalebird-desktop/pull/916) Stop loading after fetch home timeline
-- [#914](https://github.com/h3poteto/whalebird-desktop/pull/914) refactor: Move logics to vuex store in new toot
-- [#910](https://github.com/h3poteto/whalebird-desktop/pull/910) Update electron version to 5.0.1 for mas
-- [#900](https://github.com/h3poteto/whalebird-desktop/pull/900) Update electron version to 5.0.1
-- [#899](https://github.com/h3poteto/whalebird-desktop/pull/899) Use accounts/search API instead of v2/search
-### Fixed
-- [#919](https://github.com/h3poteto/whalebird-desktop/pull/919) Fix favourite and reblog event
-- [#918](https://github.com/h3poteto/whalebird-desktop/pull/918) Update favourited, Reblogged toot in all timelines
-- [#912](https://github.com/h3poteto/whalebird-desktop/pull/912) Update pinned hashtags if tags are exist
-- [#908](https://github.com/h3poteto/whalebird-desktop/pull/908) Remove commas between pinned hashtags in new toot
-
-
-## [2.7.1] - 2019-04-25
-### Added
-- [#898](https://github.com/h3poteto/whalebird-desktop/pull/898) Build package for 32bit
-- [#891](https://github.com/h3poteto/whalebird-desktop/pull/891) Introduce prettier combined eslint
-- [#862](https://github.com/h3poteto/whalebird-desktop/pull/862) Add detail link on timestamp in toot
-
-### Changed
-
-- [#888](https://github.com/h3poteto/whalebird-desktop/pull/888) Change scrollbar design
-- [#887](https://github.com/h3poteto/whalebird-desktop/pull/887) Remove unused setting files
-- [#850](https://github.com/h3poteto/whalebird-desktop/issues/850) Use typescript in store
-
-### Fixed
-
-- [#897](https://github.com/h3poteto/whalebird-desktop/pull/897) Show a menu item for save image in context menu
-- [#407](https://github.com/h3poteto/whalebird-desktop/issues/407) Can not remove the list members
-
-
-
-## [2.7.0] - 2019-03-25
-### Added
-
-- [#849](https://github.com/h3poteto/whalebird-desktop/pull/849) Add mentions timeline
-- [#847](https://github.com/h3poteto/whalebird-desktop/pull/847) Add integration tests for ListMembership modal
-- [#846](https://github.com/h3poteto/whalebird-desktop/pull/846) Add integration tests for AddListMember modal
-
-### Changed
-
-- [#855](https://github.com/h3poteto/whalebird-desktop/pull/855) Add mention timeline to jump list
-- [#853](https://github.com/h3poteto/whalebird-desktop/pull/853) Update electron-builder version to 20.39.0
-- [#845](https://github.com/h3poteto/whalebird-desktop/pull/845) Update electron version to 4.0.8
-
-### Fixed
-
-- [#856](https://github.com/h3poteto/whalebird-desktop/pull/856) Hide long username and instance name in side menu
-- [#854](https://github.com/h3poteto/whalebird-desktop/pull/854) Fix validation which checks toot max length
-- [#852](https://github.com/h3poteto/whalebird-desktop/pull/852) Add ttfinfo
-- [#842](https://github.com/h3poteto/whalebird-desktop/pull/842) Merge french translation missing file to translation
-- [#841](https://github.com/h3poteto/whalebird-desktop/pull/841) Fix package.json for Windows
-- [#839](https://github.com/h3poteto/whalebird-desktop/pull/839) Completing French translation
-
-
-
-## [2.6.3] - 2019-02-25
-### Added
-- [#836](https://github.com/h3poteto/whalebird-desktop/pull/836) Add option to hide all attachments
-- [#833](https://github.com/h3poteto/whalebird-desktop/pull/833) Add tests for Jump modal
-- [#827](https://github.com/h3poteto/whalebird-desktop/pull/827) Add option to ignore CW and NSFW
-- [#824](https://github.com/h3poteto/whalebird-desktop/pull/824) Add unit/integration tests for TimelineSpace
-- [#823](https://github.com/h3poteto/whalebird-desktop/pull/823) Add unit tests for Home
-- [#820](https://github.com/h3poteto/whalebird-desktop/pull/820) Add integration tests for Contents/Home
-
-### Changed
-- [#838](https://github.com/h3poteto/whalebird-desktop/pull/838) Update megalodon version to 0.5.0
-- [#828](https://github.com/h3poteto/whalebird-desktop/pull/828) refactor: Use computed instead of methods in Toot
-- [#819](https://github.com/h3poteto/whalebird-desktop/pull/819) Update Korean translation
-
-### Fixed
-- [#837](https://github.com/h3poteto/whalebird-desktop/pull/837) Reload app general config after change preferences
-- [#835](https://github.com/h3poteto/whalebird-desktop/pull/835) Adjust z-index for emoji picker in NewTootModal
-- [#834](https://github.com/h3poteto/whalebird-desktop/pull/834) Fix state definition in integration spec
-- [#826](https://github.com/h3poteto/whalebird-desktop/pull/826) Merge and lint ko translation json
-
-
-
-## [2.6.2] - 2019-01-08
-
-### Added
-- [#818](https://github.com/h3poteto/whalebird-desktop/pull/818) Add Makefile to build release files
-- [#786](https://github.com/h3poteto/whalebird-desktop/pull/786) Add a button to switch websocket for streaming
-
-### Changed
-- [#817](https://github.com/h3poteto/whalebird-desktop/pull/817) Add integration/unit tests for TimelineSpace/HeaderMenu
-- [#815](https://github.com/h3poteto/whalebird-desktop/pull/815) Add unit/integration tests for SideMenu
-- [#814](https://github.com/h3poteto/whalebird-desktop/pull/814) Add unit/integration tests for GlobalHeader
-- [#813](https://github.com/h3poteto/whalebird-desktop/pull/813) Add Preferences store tests
-- [#812](https://github.com/h3poteto/whalebird-desktop/pull/812) Add Authorize store tests
-- [#811](https://github.com/h3poteto/whalebird-desktop/pull/811) Fix Login spec to use ipc mock
-- [#810](https://github.com/h3poteto/whalebird-desktop/pull/810) Add Login store unit tests
-- [#809](https://github.com/h3poteto/whalebird-desktop/pull/809) Use jest for unit tests instead of mocha
-
-### Fixed
-- [#808](https://github.com/h3poteto/whalebird-desktop/pull/808) Fix cursor position when user types arrow keys on image description
-- [#807](https://github.com/h3poteto/whalebird-desktop/pull/807) Don't send event to webContents when window is already closed
-- [#806](https://github.com/h3poteto/whalebird-desktop/pull/806) Fix typo when stop direct messages streaming
-- [#805](https://github.com/h3poteto/whalebird-desktop/pull/805) Use same arrow icon for collapse buttons
-- [#803](https://github.com/h3poteto/whalebird-desktop/pull/803) Use same arrow icon for collapse buttons
-- [#799](https://github.com/h3poteto/whalebird-desktop/pull/799) Rescue parser error after streaming listener is closed
-- [#790](https://github.com/h3poteto/whalebird-desktop/pull/790) Emojify display name in follow notification
-- [#787](https://github.com/h3poteto/whalebird-desktop/pull/787) Updated English Text
-
-
-
-## [2.6.1] - 2018-12-14
-
-### Added
-- [#773](https://github.com/h3poteto/whalebird-desktop/pull/773) Add instance icon in account header
-
-### Changed
-
-- [#785](https://github.com/h3poteto/whalebird-desktop/pull/785) Make UI a bit more accessible
-- [#779](https://github.com/h3poteto/whalebird-desktop/pull/779) Bump megalodon to version 0.4.6
-- [#771](https://github.com/h3poteto/whalebird-desktop/pull/771) Update more packages
-- [#770](https://github.com/h3poteto/whalebird-desktop/pull/770) Upgrade Electron version to 3.0.10
-
-### Fixed
-
-- [#783](https://github.com/h3poteto/whalebird-desktop/pull/783) Close sidebar before changing account
-- [#782](https://github.com/h3poteto/whalebird-desktop/pull/782) Add Pinned toot update handler
-- [#781](https://github.com/h3poteto/whalebird-desktop/pull/781) Fix RTL content leaking direction
-- [#777](https://github.com/h3poteto/whalebird-desktop/pull/777) Fix media description again
-- [#776](https://github.com/h3poteto/whalebird-desktop/pull/776) Keep an error listener after stopping socket
-- [#774](https://github.com/h3poteto/whalebird-desktop/pull/774) Update README for node version
-- [#766](https://github.com/h3poteto/whalebird-desktop/pull/766) Fix retrieving a retoot's toot tree
-
-
-
-## [2.6.0] - 2018-12-04
-### Added
-
-- [#759](https://github.com/h3poteto/whalebird-desktop/pull/759) Enable searching toots by link
-- [#756](https://github.com/h3poteto/whalebird-desktop/pull/756) Switch focus between Timelines and Account Profile using shortcut keys
-- [#755](https://github.com/h3poteto/whalebird-desktop/pull/755) Switch focus between Timeline and Toot Detail using shortcut keys
-
-### Changed
-
-- [#751](https://github.com/h3poteto/whalebird-desktop/pull/751) Change help command of shortcut
-- [#748](https://github.com/h3poteto/whalebird-desktop/pull/748) Enable account dropdown in narrow sidebar menu
-- [#747](https://github.com/h3poteto/whalebird-desktop/pull/747) Increase sidebar to 360px
-
-### Fixed
-
-- [#764](https://github.com/h3poteto/whalebird-desktop/pull/764) Update shortcut help for switching focus
-- [#761](https://github.com/h3poteto/whalebird-desktop/pull/761) Stylelint fixes
-- [#757](https://github.com/h3poteto/whalebird-desktop/pull/757) Fix moving cursor in CW input
-- [#754](https://github.com/h3poteto/whalebird-desktop/pull/754) Fix undoing retoots/favourites
-- [#753](https://github.com/h3poteto/whalebird-desktop/pull/753) Keep timestamp up-to-date and accessible
-- [#752](https://github.com/h3poteto/whalebird-desktop/pull/752) Fix user layout in Follow(ers) tab
-- [#746](https://github.com/h3poteto/whalebird-desktop/pull/746) Fix editing media description
-- [#745](https://github.com/h3poteto/whalebird-desktop/pull/745) Clear sidebar timeline also when component changed
-- [#744](https://github.com/h3poteto/whalebird-desktop/pull/744) Emojify account profile
-
-
-
-## [2.5.3] - 2018-11-26
-### Added
-
-- [#740](https://github.com/h3poteto/whalebird-desktop/pull/740) Add tag as search target and show results of search tags
-- [#733](https://github.com/h3poteto/whalebird-desktop/pull/733) Enable adding a media description
-
-### Changed
-
-- [#739](https://github.com/h3poteto/whalebird-desktop/pull/739) Update more packages
-- [#736](https://github.com/h3poteto/whalebird-desktop/pull/736) Update Noto Sans
-- [#730](https://github.com/h3poteto/whalebird-desktop/pull/730) Update more node.js packages
-- [#729](https://github.com/h3poteto/whalebird-desktop/pull/729) Upgrade megalodon version to 0.4.5
-
-### Fixed
-
-- [#743](https://github.com/h3poteto/whalebird-desktop/pull/743) Change header width when open global header and side menu
-- [#738](https://github.com/h3poteto/whalebird-desktop/pull/738) Remove spinner after image has been loaded
-- [#737](https://github.com/h3poteto/whalebird-desktop/pull/737) Fix header length when not using narrow menu
-- [#735](https://github.com/h3poteto/whalebird-desktop/pull/735) Fix json style in locales
-- [#732](https://github.com/h3poteto/whalebird-desktop/pull/732) Fix Whalebird font stack
-- [#731](https://github.com/h3poteto/whalebird-desktop/pull/731) Fix typo in Follow component
-
-
-## [2.5.2] - 2018-11-19
-### Added
-- [#728](https://github.com/h3poteto/whalebird-desktop/pull/728) Add donate buttons for Patreon and Liberapay
-- [#722](https://github.com/h3poteto/whalebird-desktop/pull/722) Enable a vue-loading overlay for the media viewer
-- [#721](https://github.com/h3poteto/whalebird-desktop/pull/721) Show loading spinner when loading images
-- [#719](https://github.com/h3poteto/whalebird-desktop/pull/719) Add settings button on header menu
-
-### Changed
-- [#723](https://github.com/h3poteto/whalebird-desktop/pull/723) Update toot modal to copy CWs
-- [#716](https://github.com/h3poteto/whalebird-desktop/pull/716) Update Toot layout
-- [#715](https://github.com/h3poteto/whalebird-desktop/pull/715) Update vue and most related dependencies
-- [#712](https://github.com/h3poteto/whalebird-desktop/pull/712) Update most related dependencies
-- [#711](https://github.com/h3poteto/whalebird-desktop/pull/711) Update i18next and @panter/vue-i18next
-
-### Fixed
-- [#726](https://github.com/h3poteto/whalebird-desktop/pull/726) Always clear timeline between switches/refreshes
-- [#725](https://github.com/h3poteto/whalebird-desktop/pull/725) Fix failover image refresh
-- [#724](https://github.com/h3poteto/whalebird-desktop/pull/724) Fix username emojification in sidebar
-- [#720](https://github.com/h3poteto/whalebird-desktop/pull/720) fix: Stop unbind events when reload, and call unbind when destroy
-- [#718](https://github.com/h3poteto/whalebird-desktop/pull/718) Check acct when parse account
-- [#717](https://github.com/h3poteto/whalebird-desktop/pull/717) fix: Await initialize when TimelineSpace is created
-- [#709](https://github.com/h3poteto/whalebird-desktop/pull/709) Fix timeline header width when account sidebar is collapsed
-
-
-
-## [2.5.1] - 2018-11-16
-### Added
-- [#705](https://github.com/h3poteto/whalebird-desktop/pull/705) Render emojis in username
-
-### Changed
-- [#706](https://github.com/h3poteto/whalebird-desktop/pull/706) Show substitute image when can not load the image
-- [#704](https://github.com/h3poteto/whalebird-desktop/pull/704) Don't load emoji picker as default for performance
-- [#701](https://github.com/h3poteto/whalebird-desktop/pull/701) Upgrade Webpack version to 4.x
-- [#700](https://github.com/h3poteto/whalebird-desktop/pull/700) Upgrade electron version to 3.0.8
-
-### Fixed
-- [#707](https://github.com/h3poteto/whalebird-desktop/pull/707) refactor: Cage Cards components in molecules according to atomic design
-- [#703](https://github.com/h3poteto/whalebird-desktop/pull/703) Fix toot parser for account, tag and link
-- [#699](https://github.com/h3poteto/whalebird-desktop/pull/699) Improve performance issue when users type new status
-
-
-
-## [2.5.0] - 2018-11-11
-### Added
-- [#694](https://github.com/h3poteto/whalebird-desktop/pull/694) Allow customize unread notification of timelines
-- [#689](https://github.com/h3poteto/whalebird-desktop/pull/689) Add emoji picker in new toot modal
-- [#688](https://github.com/h3poteto/whalebird-desktop/pull/688) Enable Direct Messages timeline
-
-### Changed
-- [#693](https://github.com/h3poteto/whalebird-desktop/pull/693) Add streaming update for direct message
-- [#686](https://github.com/h3poteto/whalebird-desktop/pull/686) Enable playback of animated media
-
-### Fixed
-- [#697](https://github.com/h3poteto/whalebird-desktop/pull/697) Fix unread mark on side menu when public timeline is updated
-- [#692](https://github.com/h3poteto/whalebird-desktop/pull/692) Block changing account when the modal is active
-- [#690](https://github.com/h3poteto/whalebird-desktop/pull/690) Fix tag parser in tootParser for Pleroma's tag
-- [#687](https://github.com/h3poteto/whalebird-desktop/pull/687) Do not position the :arrow_up: button behind the sidebar
-
-
-## [2.4.4] - 2018-11-01
-### Added
-- [#682](https://github.com/h3poteto/whalebird-desktop/pull/682) Add sensitive settings and sync to each instance
-
-### Changed
-- [#678](https://github.com/h3poteto/whalebird-desktop/pull/678) Move visibility settings to sync instance settings
-
-### Fixed
-- [#684](https://github.com/h3poteto/whalebird-desktop/pull/684) Open the links in meta fields in the default browser
-- [#683](https://github.com/h3poteto/whalebird-desktop/pull/683) Remove duplicated emojis when suggest
-- [#679](https://github.com/h3poteto/whalebird-desktop/pull/679) Remove unnecessary state to fix preference's menu
-
-
-
-## [2.4.3] - 2018-10-26
-### Added
-- [#675](https://github.com/h3poteto/whalebird-desktop/pull/675) Add option to hide/show global header
-- [#661](https://github.com/h3poteto/whalebird-desktop/pull/661) Show follow/unfollow button in follow/followers tab in profile
-
-### Changed
-- [#669](https://github.com/h3poteto/whalebird-desktop/pull/669) Save refresh token if it exists
-
-### Fixed
-- [#676](https://github.com/h3poteto/whalebird-desktop/pull/676) Load hide/show status when reopen app
-- [#674](https://github.com/h3poteto/whalebird-desktop/pull/674) Fix side menu design for narrow style
-- [#672](https://github.com/h3poteto/whalebird-desktop/pull/672) Clear notification badge on app icon when reload or scroll
-- [#671](https://github.com/h3poteto/whalebird-desktop/pull/671) Add role and alt tag for accessibility
-- [#670](https://github.com/h3poteto/whalebird-desktop/pull/670) Block to open account profile when the account is not found
-
-## [2.4.2] -2018-10-14
-### Added
-- [#656](https://github.com/h3poteto/whalebird-desktop/pull/656) Show profile's metadata in account profile
-
-### Changed
-- [#653](https://github.com/h3poteto/whalebird-desktop/pull/653) Update Korean translation
-
-### Fixed
-- [#659](https://github.com/h3poteto/whalebird-desktop/pull/659) Fix order of unique when initialize
-- [#658](https://github.com/h3poteto/whalebird-desktop/pull/658) Fix searching account when open my profile
-- [#655](https://github.com/h3poteto/whalebird-desktop/pull/655) Fix accounts order on global header
-- [#654](https://github.com/h3poteto/whalebird-desktop/pull/654) Reorder accounts and fix order method
-- [#652](https://github.com/h3poteto/whalebird-desktop/pull/652) Fix toot parser for Pleroma
-
-
-## [2.4.1] - 2018-10-10
-### Fixed
-- [#649](https://github.com/h3poteto/whalebird-desktop/pull/649) Add menu to reopen window after close window in macOS
-- [#645](https://github.com/h3poteto/whalebird-desktop/pull/645) Fix calling unbind local streaming in timeline space
-
-
-
-## [2.4.0] - 2018-10-09
-
-### Added
-- [#638](https://github.com/h3poteto/whalebird-desktop/pull/638) Connect to Pleroma with Web Socket to streaming update
-- [#631](https://github.com/h3poteto/whalebird-desktop/pull/631) Add reporting method and mute/block method on toot
-
-### Changed
-- [#642](https://github.com/h3poteto/whalebird-desktop/pull/642) Update megalodon version to 0.4.3 for reconnect
-- [#636](https://github.com/h3poteto/whalebird-desktop/pull/636) Update too max characters if the API responds toot_max_chars
-
-### Fixed
-- [#643](https://github.com/h3poteto/whalebird-desktop/pull/643) Fix bind method when reloading
-- [#641](https://github.com/h3poteto/whalebird-desktop/pull/641) Fix protocol of websocket in streaming
-- [#640](https://github.com/h3poteto/whalebird-desktop/pull/640) Fix hashtag and list streaming of Pleroma
-- [#639](https://github.com/h3poteto/whalebird-desktop/pull/639) Fix message id in timeline
-- [#637](https://github.com/h3poteto/whalebird-desktop/pull/637) Open toot detail when user click favourited or rebloged notifications
-
-
-## [2.3.1] - 2018-09-29
-### Fixed
-- [#629](https://github.com/h3poteto/whalebird-desktop/pull/629) [hotfix] Use system-font-families instead of font-manager because it is native module
-
-
-
-## [2.3.0] - 2018-09-28
-### Added
-- [#626](https://github.com/h3poteto/whalebird-desktop/pull/626) Change default fonts in preferences
-- [#624](https://github.com/h3poteto/whalebird-desktop/pull/624) Add some color themes
-- [#623](https://github.com/h3poteto/whalebird-desktop/pull/623) Allow to use customize color theme in preferences
-- [#620](https://github.com/h3poteto/whalebird-desktop/pull/620) Show toot design sample in appearance setting page
-
-### Changed
-- [#622](https://github.com/h3poteto/whalebird-desktop/pull/622) Update electron version to 2.0.10
-- [#621](https://github.com/h3poteto/whalebird-desktop/pull/621) Update deprecated packages for audit
-
-### Fixed
-- [#627](https://github.com/h3poteto/whalebird-desktop/pull/627) Update Korean localization
-
-## [2.2.2] - 2018-09-22
-### Added
-- [#617](https://github.com/h3poteto/whalebird-desktop/pull/617) Pin hashtag in new toot
-- [#614](https://github.com/h3poteto/whalebird-desktop/pull/614) Suggest hashtags in new toot
-
-### Changed
-- [#615](https://github.com/h3poteto/whalebird-desktop/pull/615) Reduce statuses when merge timeline
-
-### Fixed
-- [#616](https://github.com/h3poteto/whalebird-desktop/pull/616) Fix line height for font icons
-- [#613](https://github.com/h3poteto/whalebird-desktop/pull/613) Call close confirm when cancel new toot
-- [#612](https://github.com/h3poteto/whalebird-desktop/pull/612) Stop shortcut when jump modal is hidden
-- [#608](https://github.com/h3poteto/whalebird-desktop/pull/608) Set nowrap for domain name in side menu
-
-
-
-## [2.2.1] - 2018-09-17
-### Added
-- [#602](https://github.com/h3poteto/whalebird-desktop/pull/602) Add mute/block menu
-- [#599](https://github.com/h3poteto/whalebird-desktop/pull/599) Add shortcut events for notification
-- [#596](https://github.com/h3poteto/whalebird-desktop/pull/596) Minimize to tray for win32
-
-### Changed
-
-- [#606](https://github.com/h3poteto/whalebird-desktop/pull/606) Show tags in side menu
-- [#593](https://github.com/h3poteto/whalebird-desktop/pull/593) Update Korean localization
-
-### Fixed
-
-- [#605](https://github.com/h3poteto/whalebird-desktop/pull/605) Fix losing focused toot in timeline
-- [#604](https://github.com/h3poteto/whalebird-desktop/pull/604) Fix typo in doc
-- [#603](https://github.com/h3poteto/whalebird-desktop/pull/603) Fix popper design
-- [#600](https://github.com/h3poteto/whalebird-desktop/pull/600) Fix default fonts for japanese
-- [#591](https://github.com/h3poteto/whalebird-desktop/pull/591) Fix circleci badge
-
-
-
-## [2.2.0] - 2018-09-01
-### Added
-- [#590](https://github.com/h3poteto/whalebird-desktop/pull/590) Change time format and set in preferences
-- [#586](https://github.com/h3poteto/whalebird-desktop/pull/586) Switch notification in preferences
-- [#583](https://github.com/h3poteto/whalebird-desktop/pull/583) Suggest native emoji in New Toot modal
-- [#576](https://github.com/h3poteto/whalebird-desktop/pull/576) Add shortcut keys to read image and contents warning
-
-### Changed
-- [#585](https://github.com/h3poteto/whalebird-desktop/pull/585) Update packages for node 10.x
-- [#584](https://github.com/h3poteto/whalebird-desktop/pull/584) Update electron version to 2.0.8
-- [#580](https://github.com/h3poteto/whalebird-desktop/pull/580) Update Korean localization
-- [#573](https://github.com/h3poteto/whalebird-desktop/pull/573) Update shortcut description
-
-### Fixed
-- [#589](https://github.com/h3poteto/whalebird-desktop/pull/589) Fix bug for save preference in general
-- [#588](https://github.com/h3poteto/whalebird-desktop/pull/588) Fix closing image modal using esc
-- [#587](https://github.com/h3poteto/whalebird-desktop/pull/587) Fix closing sidebar when overlaid
-- [#575](https://github.com/h3poteto/whalebird-desktop/pull/575) New Korean localization
-
-## [2.1.2] - 2018-08-27
-### Added
-- [#562](https://github.com/h3poteto/whalebird-desktop/pull/562) Add shortcut help modal
-- [#557](https://github.com/h3poteto/whalebird-desktop/pull/557) Add shortcut keys to control toot
-- [#552](https://github.com/h3poteto/whalebird-desktop/pull/552) Set shortcut keys to move toot on timeline
-- [#547](https://github.com/h3poteto/whalebird-desktop/pull/547) Add title to display description when hover icon
-
-### Changed
-- [#571](https://github.com/h3poteto/whalebird-desktop/pull/571) Add donate link and QR code in README
-- [#565](https://github.com/h3poteto/whalebird-desktop/pull/565) Close preference page with esc
-- [#559](https://github.com/h3poteto/whalebird-desktop/pull/559) Add description of shortcut in README
-
-### Fixed
-- [#570](https://github.com/h3poteto/whalebird-desktop/pull/570) Fix reply visibility level
-- [#566](https://github.com/h3poteto/whalebird-desktop/pull/566) Fix shortcut events
-- [#560](https://github.com/h3poteto/whalebird-desktop/pull/560) Set active tab to first when close preferences
-- [#556](https://github.com/h3poteto/whalebird-desktop/pull/556) Update Korean localization
-
-
-
-## [2.1.1] - 2018-08-21
-### Added
-- [#534](https://github.com/h3poteto/whalebird-desktop/pull/534) Add Korean localization
-- [#532](https://github.com/h3poteto/whalebird-desktop/pull/532) Support clipboard picture
-- [#528](https://github.com/h3poteto/whalebird-desktop/pull/528) Add Polish translation
-
-### Fixed
-- [#546](https://github.com/h3poteto/whalebird-desktop/pull/546) Fix username to include domain when the user is another instance
-- [#545](https://github.com/h3poteto/whalebird-desktop/pull/545) Fix boost icon when the toot is direct
-- [#544](https://github.com/h3poteto/whalebird-desktop/pull/544) Fix domain validation for short domain
-- [#539](https://github.com/h3poteto/whalebird-desktop/pull/539) Focus on new toot modal after change account
-- [#538](https://github.com/h3poteto/whalebird-desktop/pull/538) Jump only modal is opened
-- [#535](https://github.com/h3poteto/whalebird-desktop/pull/535) Fix typo in README.md
-- [#529](https://github.com/h3poteto/whalebird-desktop/pull/529) Fix some minor typos
-
-
-## [2.1.0] - 2018-08-20
-### Added
-- [#519](https://github.com/h3poteto/whalebird-desktop/pull/519) Suggest custom emojis in new toot
-- [#516](https://github.com/h3poteto/whalebird-desktop/pull/516) Parse emoji and show emoji in toot
-- [#514](https://github.com/h3poteto/whalebird-desktop/pull/514) Add description how to add language in README
-- [#513](https://github.com/h3poteto/whalebird-desktop/pull/513) Add show profile menu
-
-### Fixed
-- [#524](https://github.com/h3poteto/whalebird-desktop/pull/524) Fix space in notifications
-- [#523](https://github.com/h3poteto/whalebird-desktop/pull/523) Control CW, NSFW, and emoji in notification
-
-
-## [2.0.1] - 2018-08-18
-### Added
-- [#503](https://github.com/h3poteto/whalebird-desktop/pull/503) Add confirm modal when close new toot
-- [#502](https://github.com/h3poteto/whalebird-desktop/pull/502) Added German translation
-- [#500](https://github.com/h3poteto/whalebird-desktop/pull/500) Show account name when hovering on global header
-
-### Changed
-- [#510](https://github.com/h3poteto/whalebird-desktop/pull/510) Change location of follow/unfollow and more info button in account profile
-- [#498](https://github.com/h3poteto/whalebird-desktop/pull/498) Add minimum requirements for contribution in README
-- [#496](https://github.com/h3poteto/whalebird-desktop/pull/496) Update README
-
-### Fixed
-- [#511](https://github.com/h3poteto/whalebird-desktop/pull/511) Fix Deutsch for close confirm modal
-- [#509](https://github.com/h3poteto/whalebird-desktop/pull/509) Update default toot visibility of new toot
-- [#499](https://github.com/h3poteto/whalebird-desktop/pull/499) Hide follower menu for own user account
-- [#497](https://github.com/h3poteto/whalebird-desktop/pull/497) Translate loading message for each languages
-
-
-## [2.0.0] - 2018-08-15
-### Added
-- [#492](https://github.com/h3poteto/whalebird-desktop/pull/492) i18n + English spelling typos + French l10n
-- [#488](https://github.com/h3poteto/whalebird-desktop/pull/488) Switch language in preferences
-- [#483](https://github.com/h3poteto/whalebird-desktop/pull/483) Translate languages using i18next
-- [#472](https://github.com/h3poteto/whalebird-desktop/pull/472) Support for arrow keys when display medias
-- [#471](https://github.com/h3poteto/whalebird-desktop/pull/471) Suggest account name in new toot
-
-### Changed
-- [#489](https://github.com/h3poteto/whalebird-desktop/pull/489) Update electron version to 2.0.7
-- [#476](https://github.com/h3poteto/whalebird-desktop/pull/476) Check and submit instance with enter key in login form
-
-### Fixed
-- [#495](https://github.com/h3poteto/whalebird-desktop/pull/495) Fix loading message for japanese
-- [#494](https://github.com/h3poteto/whalebird-desktop/pull/494) Handle arrowleft and arrowright key in textarea
-- [#490](https://github.com/h3poteto/whalebird-desktop/pull/490) Fix build setting for locales
-- [#487](https://github.com/h3poteto/whalebird-desktop/pull/487) spelling typos
-- [#486](https://github.com/h3poteto/whalebird-desktop/pull/486) Fix API response of lists
-- [#475](https://github.com/h3poteto/whalebird-desktop/pull/475) Use vue-shortkey in jump modal because sometimes jump modal is freeze
-- [#474](https://github.com/h3poteto/whalebird-desktop/pull/474) Disable transparent because user can not change window size
-
-
-
-## [1.5.6] - 2018-08-07
-### Added
-- [#461](https://github.com/h3poteto/whalebird-desktop/pull/461) Add toot visibility setting and use it in new toot modal
-
-### Changed
-- [#468](https://github.com/h3poteto/whalebird-desktop/pull/468) Close new toot modal immediately after post toot
-
-### Fixed
-- [#470](https://github.com/h3poteto/whalebird-desktop/pull/470)Rescue error in lazy loading in favourite
-- [#467](https://github.com/h3poteto/whalebird-desktop/pull/467) Catch raise when the response does not have link header of favourites
-
-
-
-## [1.5.5] - 208-07-31
-### Fixed
-- [#465](https://github.com/h3poteto/whalebird-desktop/pull/457) Fix account switching in global header menu
-- [#464](https://github.com/h3poteto/whalebird-desktop/pull/457) Fix electron, and electron-json-storage version
-- [#462](https://github.com/h3poteto/whalebird-desktop/pull/457) Fix scroll of splash screen
-
-
-
-## [1.5.4] - 2018-07-29
-### Added
-- [#457](https://github.com/h3poteto/whalebird-desktop/pull/457) Add splash screen when starting the window
-
-### Changed
-- [#460](https://github.com/h3poteto/whalebird-desktop/pull/460) Update eslint-config-standard
-- [#459](https://github.com/h3poteto/whalebird-desktop/pull/459) Update eslint
-- [#456](https://github.com/h3poteto/whalebird-desktop/pull/456) Update deprecated plugins
-
-### Fixed
-- [#458](https://github.com/h3poteto/whalebird-desktop/pull/458) Corrected typo in webpack config
-- [#454](https://github.com/h3poteto/whalebird-desktop/pull/454) Update megalodon and fix lazy loading in favourite
-
-## [1.5.3] - 2018-07-23
-### Added
-- [#446](https://github.com/h3poteto/whalebird-desktop/pull/446) Hide and show application in mac
-
-### Changed
-- [#448](https://github.com/h3poteto/whalebird-desktop/pull/448) Update electron version to 2.0.5
-
-### Fixed
-- [#450](https://github.com/h3poteto/whalebird-desktop/pull/450) Fix scroll-behavior because custom scroll function is already defined
-- [#449](https://github.com/h3poteto/whalebird-desktop/pull/449) Disable some menu item when window is hidden in mac
-- [#445](https://github.com/h3poteto/whalebird-desktop/pull/445) Fix scroll speed when range is too small
-
-
-
-## [1.5.2] - 2018-07-20
-### Added
-- [#443](https://github.com/h3poteto/whalebird-desktop/pull/443) Add scroll top button in timeline
-
-### Changed
-- [#440](https://github.com/h3poteto/whalebird-desktop/pull/440) Update megalodon version to 0.2.0
-- [#438](https://github.com/h3poteto/whalebird-desktop/pull/438) Change boost icon when the status is private
-
-### Fixed
-- [#437](https://github.com/h3poteto/whalebird-desktop/pull/437) Use v-show instead of v-if where it is not necessary
-
-
-
-## [1.5.1] - 2018-07-13
-### Fixed
-- [#436](https://github.com/h3poteto/whalebird-desktop/pull/436) Use flex box instead of float at side menu
-- [#435](https://github.com/h3poteto/whalebird-desktop/pull/435) Allow subdomain when login
-
-## [1.5.0] - 2018-07-12
-### Added
-- [#431](https://github.com/h3poteto/whalebird-desktop/pull/431) Show authorization url to rescue it is not opened
-- [#429](https://github.com/h3poteto/whalebird-desktop/pull/429) Add filter for timelines based on regexp
-
-### Fixed
-- [#432](https://github.com/h3poteto/whalebird-desktop/pull/432) Close popover after do some actions
-
-## [1.4.3] - 2018-07-06
-### Added
-- [#428](https://github.com/h3poteto/whalebird-desktop/pull/428) Add stylelint and check in sider
-- [#427](https://github.com/h3poteto/whalebird-desktop/pull/427) Allow drop file to upload the media to mastodon
-- [#425](https://github.com/h3poteto/whalebird-desktop/pull/425) Validate domain name at login
-
-### Changed
-- [#426](https://github.com/h3poteto/whalebird-desktop/pull/426) Change color of collapse button
-
-
-## [1.4.2] - 2018-07-04
-### Added
-- [#422](https://github.com/h3poteto/whalebird-desktop/pull/422) Add small window layout menu
-
-### Changed
-- [#421](https://github.com/h3poteto/whalebird-desktop/pull/421) Use Lato font in textarea because backtick is broken in Noto
-- [#420](https://github.com/h3poteto/whalebird-desktop/pull/420) Display loading on the timeline space instead of loading covering the whole
-
-### Fixed
-- [#419](https://github.com/h3poteto/whalebird-desktop/pull/419) Fix target message when the message is reblogged in toot menu
-- [#418](https://github.com/h3poteto/whalebird-desktop/pull/418) Skip stop streaming if the object is not initialized
-
-
-## [1.4.1] - 2018-06-28
-### Added
-- [#412](https://github.com/h3poteto/whalebird-desktop/pull/412) Add reload button and reload each timeline
-- [#381](https://github.com/h3poteto/whalebird-desktop/pull/381) Allow reload pages with shortcut keys
-
-### Fixed
-- [#411](https://github.com/h3poteto/whalebird-desktop/pull/411) Fix display state of loading in side bar
-- [#410](https://github.com/h3poteto/whalebird-desktop/pull/410) Fix findLink method to detect link, tag, and account
-
-## [1.4.0] - 2018-06-20
-### Added
-- [#403](https://github.com/h3poteto/whalebird-desktop/pull/403) Create list editing page which can manage list memberships
-- [#401](https://github.com/h3poteto/whalebird-desktop/pull/401) Create lists in lists page
-- [#398](https://github.com/h3poteto/whalebird-desktop/pull/398) Add lists page
-- [#395](https://github.com/h3poteto/whalebird-desktop/pull/395) Open the manage lists window of an account on account profile
-
-### Changed
-- [#404](https://github.com/h3poteto/whalebird-desktop/pull/404) Set visibility from source message when reply
-- [#399](https://github.com/h3poteto/whalebird-desktop/pull/399) Update toot icon
-
-### Fixed
-- [#408](https://github.com/h3poteto/whalebird-desktop/pull/408) Reload side menu after create a list
-- [#400](https://github.com/h3poteto/whalebird-desktop/pull/400) Allow video to post toot
-
-## [1.3.4] - 2018-06-15
-### Added
-- [#394](https://github.com/h3poteto/whalebird-desktop/pull/394) Show icon badge when receive notifications
-- [#391](https://github.com/h3poteto/whalebird-desktop/pull/391) Remove all account associations
-
-### Changed
-- [#392](https://github.com/h3poteto/whalebird-desktop/pull/392) Allow movies as media when post toot
-
-### Fixed
-- [#389](https://github.com/h3poteto/whalebird-desktop/pull/389) Block to login the same account of the same domain
-- [#384](https://github.com/h3poteto/whalebird-desktop/pull/384) Encode tags for non ascii tags
-
-## [1.3.3] - 2018-06-10
-### Changed
-- [#379](https://github.com/h3poteto/whalebird-desktop/pull/379) Use megalodon instead of mastodon-api as mastodon api client
-
-### Fixed
-- [#384](https://github.com/h3poteto/whalebird-desktop/pull/384) Encode tag for non ascii tags
-
-
-## [1.3.2] - 2018-06-06
-### Fixed
-- [#376](https://github.com/h3poteto/whalebird-desktop/pull/376) Remove global shortcut and use mousetrap
-
-## [1.3.1] - 2018-06-06
-### Added
-- [#373](https://github.com/h3poteto/whalebird-desktop/pull/373) Open account profile when click account name in toot
-- [#372](https://github.com/h3poteto/whalebird-desktop/pull/372) Add shortcut key to jump
-
-### Fixed
-- [#371](https://github.com/h3poteto/whalebird-desktop/pull/371) Add hashtag and search page in jump list
-- [#369](https://github.com/h3poteto/whalebird-desktop/pull/369) Enable scroll in side menu
-
-## [1.3.0] - 2018-06-04
-### Added
-- [#362](https://github.com/h3poteto/whalebird-desktop/pull/362) Remove registered hashtag
-- [#359](https://github.com/h3poteto/whalebird-desktop/pull/359) Add hashtag page and show tag timeline
-- [#354](https://github.com/h3poteto/whalebird-desktop/pull/354) Set context menu
-- [#349](https://github.com/h3poteto/whalebird-desktop/pull/349) Add toot button on header menu
-
-### Changed
-- [#364](https://github.com/h3poteto/whalebird-desktop/pull/364) Open tag timeline page when click tag in toot
-
-### Fixed
-- [#348](https://github.com/h3poteto/whalebird-desktop/pull/348) Add a space after username in reply
-
-## [1.2.0] - 2018-05-29
-### Added
-- [#343](https://github.com/h3poteto/whalebird-desktop/pull/343) Allow drag & drop action to upload files
-- [#338](https://github.com/h3poteto/whalebird-desktop/pull/338) Set spoiler text when new toot
-- [#337](https://github.com/h3poteto/whalebird-desktop/pull/337) Set sensitive in new toot modal
-- [#336](https://github.com/h3poteto/whalebird-desktop/pull/336) Hide sensitive medias by default
-- [#331](https://github.com/h3poteto/whalebird-desktop/pull/331) Show content warning status and control visibility
-
-### Changed
-- [#339](https://github.com/h3poteto/whalebird-desktop/pull/339) Hide application when can not detect application
-
-### Fixed
-- [#346](https://github.com/h3poteto/whalebird-desktop/pull/346) Fix float setting in toot view
-- [#345](https://github.com/h3poteto/whalebird-desktop/pull/345) Fix font and color of placeholder in new toot modal
-- [#340](https://github.com/h3poteto/whalebird-desktop/pull/340) Fix typo in list streaming
-- [#335](https://github.com/h3poteto/whalebird-desktop/pull/335) Guard duplicate username in reply
-
-## [1.1.1] - 2018-05-22
-### Changed
-- [#321](https://github.com/h3poteto/whalebird-desktop/pull/321) Quit application when window is closed
-- [#320](https://github.com/h3poteto/whalebird-desktop/pull/320) Use forked repository for mastodon-api
-
-### Fixed
-- [#324](https://github.com/h3poteto/whalebird-desktop/pull/324) Show image as a picture if the extension is unknown in Media
-- [#322](https://github.com/h3poteto/whalebird-desktop/pull/322) Fix image size in image viewer
-
-
-## [1.1.0] - 2018-05-18
-### Added
-- [#304](https://github.com/h3poteto/whalebird-desktop/pull/304) Add a background streaming for local timeline
-
-### Changed
-- [#315](https://github.com/h3poteto/whalebird-desktop/pull/315) Show movie on Image Viewer
-- [#307](https://github.com/h3poteto/whalebird-desktop/pull/307) Fill all account name when the status is multiple replied
-- [#305](https://github.com/h3poteto/whalebird-desktop/pull/305) Show the application from which the status was posted
-
-### Fixed
-
-- [#313](https://github.com/h3poteto/whalebird-desktop/pull/313) Clear unread mark when change account
-- [#310](https://github.com/h3poteto/whalebird-desktop/pull/310) Update icon when user add a new account
-- [#308](https://github.com/h3poteto/whalebird-desktop/pull/308) Fix application name, and add comment for website
-
-
-## [1.0.1] - 2018-05-13
-### Added
-- [#296](https://github.com/h3poteto/whalebird-desktop/pull/296) Add lazyLoading in account profile timeline
-- [#295](https://github.com/h3poteto/whalebird-desktop/pull/295) Add following status for requested
-
-### Changed
-- [#294](https://github.com/h3poteto/whalebird-desktop/pull/294) Show original status timestamp in reblogged toot
-- [#292](https://github.com/h3poteto/whalebird-desktop/pull/292) Update toot status in SideBar
-
-### Fixed
-- [#298](https://github.com/h3poteto/whalebird-desktop/pull/298) Ran the new 'npm audit' and updated some of the packages that are mentioned
-- [#297](https://github.com/h3poteto/whalebird-desktop/pull/297) Fix image list arrow
-- [#289](https://github.com/h3poteto/whalebird-desktop/pull/289) Add asar unpacked resource for sounds in electron packager
-
-
-## [1.0.0] - 2018-05-05
-### Changed
-- [#280](https://github.com/h3poteto/whalebird-desktop/pull/280) Updated package lists to update vue-router & vuex versions to 3.0.1
-
-### Fixed
-- [#281](https://github.com/h3poteto/whalebird-desktop/pull/281) Fix loading circle in sidebar
-
-
-## [0.6.2] - 2018-04-30
-### Added
-- [#279](https://github.com/h3poteto/whalebird-desktop/pull/279) Add toot delete button
-- [#277](https://github.com/h3poteto/whalebird-desktop/pull/277) Show favourites count in toot
-- [#272](https://github.com/h3poteto/whalebird-desktop/pull/272) Show reblogs count in toot
-- [#270](https://github.com/h3poteto/whalebird-desktop/pull/270) Move image list of a toot
-- [#268](https://github.com/h3poteto/whalebird-desktop/pull/268) Add a button which copy link to toot
-
-### Changed
-- [#269](https://github.com/h3poteto/whalebird-desktop/pull/269) Add favourite effect
-
-### Fixed
-- [#278](https://github.com/h3poteto/whalebird-desktop/pull/278) Stop streaming when window is closed in macOS
-- [#275](https://github.com/h3poteto/whalebird-desktop/pull/275) Wording changes
-
-## [0.6.1] - 2018-04-25
-### Changed
-- [#248](https://github.com/h3poteto/whalebird-desktop/pull/248) Add transition effect to timeline
-
-### Fixed
-- [#266](https://github.com/h3poteto/whalebird-desktop/pull/266) Insert error of timeline when lazy loading
-- [#265](https://github.com/h3poteto/whalebird-desktop/pull/265) Fix change status in home and notifications
-- [#263](https://github.com/h3poteto/whalebird-desktop/pull/263) Background color of focused in notifications
-
-## [0.6.0] - 2018-04-22
-### Added
-- [#261](https://github.com/h3poteto/whalebird-desktop/pull/261) Add profile dropdown menu for user's profile
-- [#250](https://github.com/h3poteto/whalebird-desktop/pull/250) Allow to change font-size
-- [#239](https://github.com/h3poteto/whalebird-desktop/pull/239) Add about window for linux and windows
-
-### Changed
-- [#260](https://github.com/h3poteto/whalebird-desktop/pull/260) Display avatar in global header
-- [#249](https://github.com/h3poteto/whalebird-desktop/pull/249) Add image viewer transition
-- [#247](https://github.com/h3poteto/whalebird-desktop/pull/247) Archive timeline and store unread timeline
-- [#246](https://github.com/h3poteto/whalebird-desktop/pull/246) Disable renderer backgrounding of chromium
-- [#243](https://github.com/h3poteto/whalebird-desktop/pull/243) Change format of username
-- [#240](https://github.com/h3poteto/whalebird-desktop/pull/240) Hide overflowed username when width is narrow
-
-### Fixed
-- [#245](https://github.com/h3poteto/whalebird-desktop/pull/245) Block changing account when loading timeline
-- [#238](https://github.com/h3poteto/whalebird-desktop/pull/238) Close side bar when user change account
-- [#236](https://github.com/h3poteto/whalebird-desktop/pull/236) Clear timeline after components are destroyed
-
-## [0.5.0] - 2018-04-18
-### Added
-- [#232](https://github.com/h3poteto/whalebird-desktop/pull/232) Search page to find account
-- [#231](https://github.com/h3poteto/whalebird-desktop/pull/231) Add menu in account profile to open account in browser
-- [#226](https://github.com/h3poteto/whalebird-desktop/pull/226) Open toot detail in browser
-- [#222](https://github.com/h3poteto/whalebird-desktop/pull/222) Add lists channels in jump modal
-- [#214](https://github.com/h3poteto/whalebird-desktop/pull/214) Set theme color and setting theme in preferences
-
-
-### Changed
-- [#218](https://github.com/h3poteto/whalebird-desktop/pull/218) Open toot detail when double click
-- [#216](https://github.com/h3poteto/whalebird-desktop/pull/216) Add side bar transition effect
-
-### Fixed
-- [#230](https://github.com/h3poteto/whalebird-desktop/pull/230) Change popover library because vue-js-popover has some bugs
-- [#221](https://github.com/h3poteto/whalebird-desktop/pull/221) Change link color for dark theme
-- [#220](https://github.com/h3poteto/whalebird-desktop/pull/220) Handle error when lazy loading
-- [#219](https://github.com/h3poteto/whalebird-desktop/pull/219) Selected background color when dark theme
-- [#217](https://github.com/h3poteto/whalebird-desktop/pull/217) Fix label in side menu
-
-## [0.4.0] - 2018-04-12
-### Added
-- [#207](https://github.com/h3poteto/whalebird-desktop/pull/207) Change visibility level of toot
-- [#206](https://github.com/h3poteto/whalebird-desktop/pull/206) Allow user view toot detail at sidebar
-- [#200](https://github.com/h3poteto/whalebird-desktop/pull/200) Show lists in side menu
-
-### Changed
-- [#201](https://github.com/h3poteto/whalebird-desktop/pull/201) Show loading when user post new toot
-
-### Fixed
-- [#208](https://github.com/h3poteto/whalebird-desktop/pull/208) Block toot when new toot modal is closed
-- [#204](https://github.com/h3poteto/whalebird-desktop/pull/204) Set focus in watch directive on newToot
-- [#198](https://github.com/h3poteto/whalebird-desktop/pull/198) Fix image position in ImageViewer
-
-## [0.3.1] - 2018-04-08
-### Added
-- [#196](https://github.com/h3poteto/whalebird-desktop/pull/196) Add sound setting in preferences, and save setting data in json
-- [#195](https://github.com/h3poteto/whalebird-desktop/pull/195) Show follows/followers in account profile
-- [#194](https://github.com/h3poteto/whalebird-desktop/pull/194) Show user's timeline in account profile
-
-### Changed
-- [#191](https://github.com/h3poteto/whalebird-desktop/pull/191) Sound a system sound when user favourite or reblog
-
-### Fixed
-- [#192](https://github.com/h3poteto/whalebird-desktop/pull/192) Rescue order when account order is unexpected value
-- [#189](https://github.com/h3poteto/whalebird-desktop/pull/189) Show loading when user actions
-- [#187](https://github.com/h3poteto/whalebird-desktop/pull/187) fix: Open user profile on reblogger icon and reblogger name
-- [#185](https://github.com/h3poteto/whalebird-desktop/pull/185) fix: Set font size of close button in login
-- [#184](https://github.com/h3poteto/whalebird-desktop/pull/184) Set limit to attachment height
-
-## [0.3.0] - 2018-04-03
-### Added
-- [#176](https://github.com/h3poteto/whalebird-desktop/pull/176) Set accounts order in preferences
-- [#172](https://github.com/h3poteto/whalebird-desktop/pull/172) Create account preferences page
-
-### Changed
-- [#182](https://github.com/h3poteto/whalebird-desktop/pull/180) Use vue-shortkey at shortcut when post new toot
-- [#175](https://github.com/h3poteto/whalebird-desktop/pull/175) Save account username in local db
-
-### Fixed
-- [#180](https://github.com/h3poteto/whalebird-desktop/pull/180) Show error message when failed to start streaming
-- [#179](https://github.com/h3poteto/whalebird-desktop/pull/179) Set global background color to white
-- [#177](https://github.com/h3poteto/whalebird-desktop/pull/177) Skip removeEvents when dom does not have a target element
-- [#170](https://github.com/h3poteto/whalebird-desktop/pull/170) Fix click event on reblog in notifications
-- [#169](https://github.com/h3poteto/whalebird-desktop/pull/169) Set build category for mac and linux
-
-## [0.2.3] - 2018-03-31
-### Added
-- [#155](https://github.com/h3poteto/whalebird-desktop/pull/155) [#157](https://github.com/h3poteto/whalebird-desktop/pull/157) [#158](https://github.com/h3poteto/whalebird-desktop/pull/158) Add account profile page in side bar
-
-### Fixed
-- [#166](https://github.com/h3poteto/whalebird-desktop/pull/166) Reset ctrl key event handler when close new toot modal
-- [#162](https://github.com/h3poteto/whalebird-desktop/pull/162) Remove html tags in reply notifications
-- [#159](https://github.com/h3poteto/whalebird-desktop/pull/159) Set max height in the image viewer
-
-## [0.2.2] - 2018-03-29
-### Added
-- [#153](https://github.com/h3poteto/whalebird-desktop/pull/153) Attach images in toot
-- [#152](https://github.com/h3poteto/whalebird-desktop/pull/152) Open images in modal window when click the preview
-- [#150](https://github.com/h3poteto/whalebird-desktop/pull/150) Add lazy loading in timelines
-
-### Changed
-- [#147](https://github.com/h3poteto/whalebird-desktop/pull/147) Archive old statuses when close timeline, because it is too heavy
-
-## [0.2.1] - 2018-03-27
-### Added
-- [#142](https://github.com/h3poteto/whalebird-desktop/pull/142) Show unread marks in side menu
-
-### Changed
-- [#137](https://github.com/h3poteto/whalebird-desktop/pull/137) Use electron-builder instead of electron-packager when build release packages
-
-### Fixed
-- [#144](https://github.com/h3poteto/whalebird-desktop/pull/144) Open link on the default browser in notifications
-- [#140](https://github.com/h3poteto/whalebird-desktop/pull/140) Refactor closing modal window when post new toot
-- [#139](https://github.com/h3poteto/whalebird-desktop/pull/139) Show username if display_name is blank
-
-## [0.2.0] - 2018-03-26
-### Added
-
-- [#135](https://github.com/h3poteto/whalebird-desktop/pull/135) Release the Windows version
-- [#125](https://github.com/h3poteto/whalebird-desktop/pull/125), #126 Show attached images of toot in timeline
-- [#124](https://github.com/h3poteto/whalebird-desktop/pull/124) Save window state when close
-
-### Changed
-
-- [#113](https://github.com/h3poteto/whalebird-desktop/pull/113) Add electron-log for production logs
-- [#109](https://github.com/h3poteto/whalebird-desktop/pull/109) Get recently timeline in local and public when it is opened
-
-### Fixed
-
-- [#134](https://github.com/h3poteto/whalebird-desktop/pull/134) Clear the domain name in login form after login
-- [#130](https://github.com/h3poteto/whalebird-desktop/pull/130), [#128](https://github.com/h3poteto/whalebird-desktop/pull/128) Set NotoSans as the default font. And remove google-fonts-webpack-plugin because the API has been dead.
-- [#114](https://github.com/h3poteto/whalebird-desktop/pull/114) Allow application to be draggable for Mac
-- [#111](https://github.com/h3poteto/whalebird-desktop/pull/111) Fix text overflow in side menu
-- [#110](https://github.com/h3poteto/whalebird-desktop/pull/110) Clear old status after close new toot modal
-
-
-## [0.1.0] - 2018-03-23
-This is the first release
diff --git a/CODEOWNERS b/CODEOWNERS
deleted file mode 100644
index 5bd9a8ae..00000000
--- a/CODEOWNERS
+++ /dev/null
@@ -1 +0,0 @@
-* @h3poteto
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index f288702d..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
- .
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/Makefile b/Makefile
deleted file mode 100644
index d732f15c..00000000
--- a/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-.PHONY: all install clean
-
-VERSION = 1.0.0
-
-all: build mac linux win32 win64
-
-install: package.json
- yarn install
-
-build: install
- yarn run build
-
-mac:
- yarn run package:mac
- mv build/Whalebird-${VERSION}-mac-x64.dmg build/Whalebird-${VERSION}-darwin-x64.dmg
- mv build/Whalebird-${VERSION}-mac-arm64.dmg build/Whalebird-${VERSION}-darwin-arm64.dmg
- cd build; shasum -a 256 Whalebird-${VERSION}-darwin-x64.dmg | awk '{ print $1 }' > Whalebird-${VERSION}-darwin-x64.dmg.shasum
- cd build; shasum -a 256 Whalebird-${VERSION}-darwin-arm64.dmg | awk '{ print $1 }' > Whalebird-${VERSION}-darwin-arm64.dmg.shasum
-
-mas:
- yarn run build:clean
- yarn run package:mas
-
-linux:
- yarn run package:linux
- mv build/Whalebird-${VERSION}-linux-amd64.deb build/Whalebird-${VERSION}-linux-x64.deb
- mv build/Whalebird-${VERSION}-linux-x86_64.rpm build/Whalebird-${VERSION}-linux-x64.rpm
- mv build/Whalebird-${VERSION}-linux-x86_64.AppImage build/Whalebird-${VERSION}-linux-x64.AppImage
- cd build; sha256sum Whalebird-${VERSION}-linux-arm64.tar.bz2 | awk '{ print $1 }' > Whalebird-${VERSION}-linux-arm64.tar.bz2.shasum
- cd build; sha256sum Whalebird-${VERSION}-linux-x64.AppImage | awk '{ print $1 }' > Whalebird-${VERSION}-linux-x64.AppImage.shasum
- cd build; sha256sum Whalebird-${VERSION}-linux-x64.deb | awk '{ print $1 }' > Whalebird-${VERSION}-linux-x64.deb.shasum
- cd build; sha256sum Whalebird-${VERSION}-linux-x64.rpm | awk '{ print $1 }' > Whalebird-${VERSION}-linux-x64.rpm.shasum
- cd build; sha256sum Whalebird-${VERSION}-linux-x64.tar.bz2 | awk '{ print $1 }' > Whalebird-${VERSION}-linux-x64.tar.bz2.shasum
-
-win32:
- yarn run package:win32
- mv build/Whalebird-${VERSION}-win-ia32.exe build/Whalebird-${VERSION}-windows-ia32.exe
- cd build; sha256sum Whalebird-${VERSION}-windows-ia32.exe | awk '{ print $1 }' > Whalebird-${VERSION}-windows-ia32.exe.shasum
-
-win64:
- yarn run package:win64
- mv build/Whalebird-${VERSION}-win-x64.exe build/Whalebird-${VERSION}-windows-x64.exe
- cd build; sha256sum Whalebird-${VERSION}-windows-x64.exe | awk '{ print $1 }' > Whalebird-${VERSION}-windows-x64.exe.shasum
-
-clean:
- yarn run build:clean
diff --git a/README.md b/README.md
index 2955b4f1..3f8b5348 100644
--- a/README.md
+++ b/README.md
@@ -1,135 +1,38 @@
-# Whalebird
-[![Build](https://github.com/h3poteto/whalebird-desktop/actions/workflows/build.yml/badge.svg)](https://github.com/h3poteto/whalebird-desktop/actions/workflows/build.yml)
-[![GitHub release](http://img.shields.io/github/release/h3poteto/whalebird-desktop.svg)](https://github.com/h3poteto/whalebird-desktop/releases)
-[![Mac App Store](https://img.shields.io/itunes/v/6445864587)](https://apps.apple.com/us/app/whalebird/id6445864587)
-[![AUR version](https://img.shields.io/aur/version/whalebird)](https://aur.archlinux.org/packages/whalebird/)
-[![Dependabot](https://img.shields.io/badge/Dependabot-enabled-blue.svg)](https://dependabot.com)
-[![Crowdin](https://badges.crowdin.net/whalebird/localized.svg)](https://crowdin.com/project/whalebird)
+
+## Usage
-Whalebird is a Fediverse client app for desktop.
-
-![demo](screenshot.png)
-
-## Feature
-
-- An interface like slack
-- Notify to desktop
-- Streaming
-- Many keyboard shortcuts
-- Manage multiple accounts
-- Supporting
- - Mastodon
- - Pleroma
- - Friendica
- - Firefish
-
-### Shortcuts
-
-
-
-Mac Linux, Windows
-
-
- Toot, Reply Cmd + Enter Ctrl + Enter
- Change accounts Cmd + 1, 2, 3... Ctrl + 1, 2, 3...
- Jump to another timeline Cmd + k Ctrl + k
- Reload current timeline Cmd + r Ctrl + r
- Select next post j j
- Select previous post k k
- Reply to the post r r
- Reblog the post b b
- Favourite the post f f
- Open details of the post o o
- Open account profile of the post p p
- Open the images i i
- Show/hide CW and NSFW x x
- Close current page esc esc
- Show shortcut keys ? ?
-
-
-
-## Install
-### Mac
-[![App Store](app-store.svg)](https://itunes.apple.com/us/app/whalebird/id1378283354)
-
-Or you can download `.dmg` from [release page](https://github.com/h3poteto/whalebird-desktop/releases).
-
-So on, you can install from Homebrew:
+### Create an App
```
-$ brew update
-$ brew install --cask whalebird
+# with npx
+$ npx create-nextron-app my-app --example with-tailwindcss
+
+# with yarn
+$ yarn create nextron-app my-app --example with-tailwindcss
+
+# with pnpm
+$ pnpm dlx create-nextron-app my-app --example with-tailwindcss
```
-:sparkles: Thanks to [@singingwolfboy](https://github.com/singingwolfboy) for adding it to [homebrew-cask](https://github.com/Homebrew/homebrew-cask/blob/cf568882b6e012956ca404a16be2db36ca873002/Casks/whalebird.rb).
-
-
-### Linux
-There are some packages in [release page](https://github.com/h3poteto/whalebird-desktop/releases), for example `.deb`, `.rpm` and `.AppImage`.
-If you do not want to use the package manager, please download `.tar.bz2` file and decompress it.
-
-If you are using snap, please install from [snapcraft.io](https://snapcraft.io/whalebird).
+### Install Dependencies
```
-$ sudo snap install whalebird
+$ cd my-app
+
+# using yarn or npm
+$ yarn (or `npm install`)
+
+# using pnpm
+$ pnpm install --shamefully-hoist
```
-If you are using flatpak, please install from
-[flathub.org](https://flathub.org/apps/details/social.whalebird.WhalebirdDesktop).
+### Use it
```
-$ flatpak install social.whalebird.WhalebirdDesktop
+# development mode
+$ yarn dev (or `npm run dev` or `pnpm run dev`)
+
+# production build
+$ yarn build (or `npm run build` or `pnpm run build`)
```
-
-Or you can install from [Arch User Repository](https://aur.archlinux.org/packages/whalebird/).
-
-```
-$ yay -S whalebird
-```
-
-
-### Windows
-
-
-
-We prepared winget package and `.exe` [files](https://github.com/h3poteto/whalebird-desktop/releases), **but we don't recommend these ways**.
-Because these binary is not code signed, so you will get warnings when you launch. Only Windows Store version is signed, so please use it.
-
-```
-$ winget show "Whalebird" --versions
-```
-
-## Translation
-If you can speak multiple languages, could you please help with translation in [Crowdin](https://crowdin.com/project/whalebird)?
-
-Or if you want add new language, please create an issue. I will add it.
-
-## Development
-
-We'd love you to contribute to Whalebird.
-
-### Minimum requirements for development
-
-* Node.js greater than or equal version 15.0.0 (16.x is recommended)
-* npm or yarn
-
-### Getting started
-
-``` bash
-# clone this repository
-$ git clone https://github.com/h3poteto/whalebird-desktop.git
-$ cd whalebird-desktop
-
-# Install font config
-$ sudo apt-get install libfontconfig-dev
-
-# install dependencies
-$ yarn install
-
-# serve with hot reload at localhost:9080
-$ yarn run dev
-```
-
-# License
-The software is available as open source under the terms of the [GPL-3.0 License](https://www.gnu.org/licenses/gpl-3.0.en.html). However, icons do not comply with this license, © Miho Fukuda.
diff --git a/app-store.svg b/app-store.svg
deleted file mode 100755
index c36a76a5..00000000
--- a/app-store.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-
- Download_on_the_Mac_App_Store_Badge_US-UK_RGB_blk_092917
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/notarize.js b/build/notarize.js
deleted file mode 100644
index 0a3ca4f1..00000000
--- a/build/notarize.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const { notarize } = require('@electron/notarize')
-
-exports.default = async function notarizing(context) {
- const { electronPlatformName, appOutDir } = context
- if (electronPlatformName !== 'darwin') {
- return
- }
-
- const appName = context.packager.appInfo.productFilename
-
- return await notarize({
- tool: 'notarytool',
- appBundleId: 'social.whalebird.app',
- ascProvider: process.env.ASC_PROVIDER,
- appPath: `${appOutDir}/${appName}.app`,
- appleId: process.env.APPLE_ID,
- appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
- teamId: process.env.TEAM_ID
- })
-}
diff --git a/build/sounds/operation_sound01.wav b/build/sounds/operation_sound01.wav
deleted file mode 100644
index 3520ea3d..00000000
Binary files a/build/sounds/operation_sound01.wav and /dev/null differ
diff --git a/build/sounds/operation_sound02.wav b/build/sounds/operation_sound02.wav
deleted file mode 100644
index dbbdf8f4..00000000
Binary files a/build/sounds/operation_sound02.wav and /dev/null differ
diff --git a/crowdin.yml b/crowdin.yml
deleted file mode 100644
index 70726419..00000000
--- a/crowdin.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-files:
- - source: /src/config/locales/en/translation.json
- translation: /src/config/locales/%locale%/translation.json
- languages_mapping:
- locale:
- cs: cs
- de: de
- es-ES: es_es
- eu: eu
- fa: fa
- fr: fr
- gd: gd
- hu: hu
- id: id
- is: is
- it: it
- ja: ja
- ko: ko
- 'no': 'no'
- pl: pl
- pt-PT: pt_pt
- ru: ru
- si-LK: si
- sv-SE: sv_se
- tzm: tzm
- zh-CN: zh_cn
- zh-TW: zh_tw
diff --git a/dist/electron/.gitkeep b/dist/electron/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/dist/web/.gitkeep b/dist/web/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/electron-builder.json b/electron-builder.json
deleted file mode 100644
index ee48a601..00000000
--- a/electron-builder.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "productName": "Whalebird",
- "appId": "social.whalebird.app",
- "artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
- "directories": {
- "output": "build"
- },
- "extraResources": [
- "build/sounds/*",
- "build/icons/*"
- ],
- "files": [
- "dist/electron/**/*",
- "build/icons/*"
- ],
- "afterSign": "build/notarize.js",
- "dmg": {
- "sign": false,
- "contents": [
- {
- "x": 410,
- "y": 150,
- "type": "link",
- "path": "/Applications"
- },
- {
- "x": 130,
- "y": 150,
- "type": "file"
- }
- ]
- },
- "mac": {
- "icon": "build/icons/icon.icns",
- "target": [
- {
- "target": "dmg",
- "arch": [
- "x64",
- "arm64"
- ]
- }
- ],
- "category": "public.app-category.social-networking",
- "entitlements": "plist/entitlements.mac.plist",
- "entitlementsInherit": "plist/entitlements.mac.plist",
- "entitlementsLoginHelper": "plist/loginhelper.plist",
- "hardenedRuntime": true,
- "gatekeeperAssess": false,
- "darkModeSupport": true,
- "mergeASARs": false,
- "asarUnpack": "node_modules/**/*.node"
- },
- "win": {
- "icon": "build/icons/icon.ico",
- "target": "nsis"
- },
- "nsis": {
- "oneClick": false,
- "allowToChangeInstallationDirectory": true
- },
- "linux": {
- "icon": "build/icons",
- "target": [
- {
- "target": "AppImage",
- "arch": [
- "x64"
- ]
- },
- {
- "target": "deb",
- "arch": [
- "x64"
- ]
- },
- {
- "target": "rpm",
- "arch": [
- "x64"
- ]
- },
- {
- "target": "tar.bz2",
- "arch": [
- "x64"
- ]
- },
- {
- "target": "snap",
- "arch": [
- "x64"
- ]
- }
- ],
- "category": "Network"
- }
-}
diff --git a/electron-builder.mas.json b/electron-builder.mas.json
deleted file mode 100644
index 4d19c067..00000000
--- a/electron-builder.mas.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "productName": "Whalebird",
- "appId": "social.whalebird.app",
- "artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
- "buildVersion": "168",
- "directories": {
- "output": "build"
- },
- "extraResources": [
- "build/sounds/*",
- "build/icons/*"
- ],
- "files": [
- "dist/electron/**/*",
- "build/icons/*"
- ],
- "mas": {
- "type": "distribution",
- "entitlements": "plist/parent.plist",
- "entitlementsInherit": "plist/child.plist",
- "entitlementsLoginHelper": "plist/loginhelper.plist",
- "hardenedRuntime": false,
- "gatekeeperAssess": false,
- "extendInfo": {
- "ITSAppUsesNonExemptEncryption": "false"
- },
- "provisioningProfile": "./packages/socialwhalebirdapp_MAS.provisionprofile"
- },
- "mac": {
- "icon": "build/icons/icon.icns",
- "target": [
- {
- "target": "mas",
- "arch": [
- "universal"
- ]
- }
- ],
- "category": "public.app-category.social-networking",
- "hardenedRuntime": true,
- "gatekeeperAssess": false,
- "darkModeSupport": true,
- "extendInfo": {
- "ITSAppUsesNonExemptEncryption": "false"
- },
- "mergeASARs": false,
- "asarUnpack": "node_modules/**/*.node"
- }
-}
diff --git a/electron-builder.yml b/electron-builder.yml
new file mode 100644
index 00000000..68ecf68d
--- /dev/null
+++ b/electron-builder.yml
@@ -0,0 +1,15 @@
+appId: social.whalebird.app
+productName: Whalebird
+copyright: Copyright © 2023 Akira Fukushima
+directories:
+ output: dist
+ buildResources: resources
+files:
+ - from: .
+ filter:
+ - package.json
+ - app
+linux:
+ target: AppImage
+ category: Network
+publish: null
diff --git a/flatpak-data/social.whalebird.WhalebirdDesktop.desktop b/flatpak-data/social.whalebird.WhalebirdDesktop.desktop
deleted file mode 100644
index 8506c688..00000000
--- a/flatpak-data/social.whalebird.WhalebirdDesktop.desktop
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Version=1.0
-Type=Application
-Name=Whalebird
-Comment=Electron-based Mastodon/Pleroma/Misskey client
-Exec=start-whalebird.sh %U
-Icon=social.whalebird.WhalebirdDesktop
-Categories=Network;
-Terminal=false
-
diff --git a/flatpak-data/social.whalebird.WhalebirdDesktop.metainfo.xml b/flatpak-data/social.whalebird.WhalebirdDesktop.metainfo.xml
deleted file mode 100644
index 9d17cc7e..00000000
--- a/flatpak-data/social.whalebird.WhalebirdDesktop.metainfo.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
- social.whalebird.WhalebirdDesktop
-
- Whalebird
- Whalebird is a Mastodon, Pleroma, and Misskey client for the desktop
-
- CC0-1.0
- MIT
- https://whalebird.social/en/desktop/contents
-
- intense
- intense
-
-
-
-
- Whalebird is a Mastodon, Pleroma, and Misskey client for the desktop
- Features
-
- An interface like slack
- Notify to desktop
- Streaming
- Many keyboard shortcuts
- Manage multiple accounts
-
-
-
- social.whalebird.WhalebirdDesktop.desktop
-
-
- https://github.com/h3poteto/whalebird-desktop/raw/master/screenshot.png
-
-
-
-
-
- Updated
-
- Whalebird 5.x doesn't migrate your local databases from version 4. So please re-authenticate all servers when you upgrade Whalebird from 4.7.4.
-
-
-
-
-
diff --git a/main/background.ts b/main/background.ts
new file mode 100644
index 00000000..6e82c2d2
--- /dev/null
+++ b/main/background.ts
@@ -0,0 +1,47 @@
+import path from 'path'
+import { app, ipcMain, shell, IpcMainInvokeEvent } from 'electron'
+import serve from 'electron-serve'
+import { createWindow } from './helpers'
+
+const isProd = process.env.NODE_ENV === 'production'
+
+if (isProd) {
+ serve({ directory: 'app' })
+} else {
+ app.setPath('userData', `${app.getPath('userData')} (development)`)
+}
+
+;(async () => {
+ await app.whenReady()
+
+ const mainWindow = createWindow('main', {
+ width: 1000,
+ height: 600,
+ webPreferences: {
+ nodeIntegration: false,
+ contextIsolation: true,
+ webSecurity: false,
+ preload: path.join(__dirname, 'preload.js')
+ }
+ })
+
+ if (isProd) {
+ await mainWindow.loadURL('app://./')
+ } else {
+ const port = process.argv[2]
+ await mainWindow.loadURL(`http://localhost:${port}/`)
+ mainWindow.webContents.openDevTools()
+ }
+})()
+
+app.on('window-all-closed', () => {
+ app.quit()
+})
+
+ipcMain.on('message', async (event, arg) => {
+ event.reply('message', `${arg} World!`)
+})
+
+ipcMain.handle('open-browser', (_event: IpcMainInvokeEvent, url: string) => {
+ shell.openExternal(url)
+})
diff --git a/main/helpers/create-window.ts b/main/helpers/create-window.ts
new file mode 100644
index 00000000..b4deda5f
--- /dev/null
+++ b/main/helpers/create-window.ts
@@ -0,0 +1,86 @@
+import {
+ screen,
+ BrowserWindow,
+ BrowserWindowConstructorOptions,
+ Rectangle,
+} from 'electron'
+import Store from 'electron-store'
+
+export const createWindow = (
+ windowName: string,
+ options: BrowserWindowConstructorOptions
+): BrowserWindow => {
+ const key = 'window-state'
+ const name = `window-state-${windowName}`
+ const store = new Store({ name })
+ const defaultSize = {
+ width: options.width,
+ height: options.height,
+ }
+ let state = {}
+
+ const restore = () => store.get(key, defaultSize)
+
+ const getCurrentPosition = () => {
+ const position = win.getPosition()
+ const size = win.getSize()
+ return {
+ x: position[0],
+ y: position[1],
+ width: size[0],
+ height: size[1],
+ }
+ }
+
+ const windowWithinBounds = (windowState, bounds) => {
+ return (
+ windowState.x >= bounds.x &&
+ windowState.y >= bounds.y &&
+ windowState.x + windowState.width <= bounds.x + bounds.width &&
+ windowState.y + windowState.height <= bounds.y + bounds.height
+ )
+ }
+
+ const resetToDefaults = () => {
+ const bounds = screen.getPrimaryDisplay().bounds
+ return Object.assign({}, defaultSize, {
+ x: (bounds.width - defaultSize.width) / 2,
+ y: (bounds.height - defaultSize.height) / 2,
+ })
+ }
+
+ const ensureVisibleOnSomeDisplay = (windowState) => {
+ const visible = screen.getAllDisplays().some((display) => {
+ return windowWithinBounds(windowState, display.bounds)
+ })
+ if (!visible) {
+ // Window is partially or fully not visible now.
+ // Reset it to safe defaults.
+ return resetToDefaults()
+ }
+ return windowState
+ }
+
+ const saveState = () => {
+ if (!win.isMinimized() && !win.isMaximized()) {
+ Object.assign(state, getCurrentPosition())
+ }
+ store.set(key, state)
+ }
+
+ state = ensureVisibleOnSomeDisplay(restore())
+
+ const win = new BrowserWindow({
+ ...state,
+ ...options,
+ webPreferences: {
+ nodeIntegration: false,
+ contextIsolation: true,
+ ...options.webPreferences,
+ },
+ })
+
+ win.on('close', saveState)
+
+ return win
+}
diff --git a/main/helpers/index.ts b/main/helpers/index.ts
new file mode 100644
index 00000000..e1b9aad0
--- /dev/null
+++ b/main/helpers/index.ts
@@ -0,0 +1 @@
+export * from './create-window'
diff --git a/main/preload.ts b/main/preload.ts
new file mode 100644
index 00000000..4657da4f
--- /dev/null
+++ b/main/preload.ts
@@ -0,0 +1,22 @@
+import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'
+
+const handler = {
+ invoke(channel: string, value: any) {
+ ipcRenderer.invoke(channel, value)
+ },
+ send(channel: string, value: unknown) {
+ ipcRenderer.send(channel, value)
+ },
+ on(channel: string, callback: (...args: unknown[]) => void) {
+ const subscription = (_event: IpcRendererEvent, ...args: unknown[]) => callback(...args)
+ ipcRenderer.on(channel, subscription)
+
+ return () => {
+ ipcRenderer.removeListener(channel, subscription)
+ }
+ }
+}
+
+contextBridge.exposeInMainWorld('ipc', handler)
+
+export type IpcHandler = typeof handler
diff --git a/package.json b/package.json
index d8e567db..5de2a660 100644
--- a/package.json
+++ b/package.json
@@ -1,205 +1,36 @@
{
- "name": "Whalebird",
- "version": "5.1.1",
- "author": "AkiraFukushima ",
- "description": "An Electron based Mastodon client for Windows, Mac and Linux",
- "keywords": [
- "mastodon",
- "client",
- "electron",
- "vue"
- ],
- "repository": {
- "type": "git",
- "url": "https://github.com/h3poteto/whalebird-desktop.git"
- },
- "main": "./dist/electron/main.js",
+ "private": true,
+ "name": "whalebird",
+ "description": "Electron based Fediverse client application",
+ "version": "1.0.0",
+ "author": "Akira Fukushima ",
+ "main": "app/background.js",
"scripts": {
- "dev": "node .electron-vue/dev-runner.js",
- "dev:main": "webpack --node-env=development --mode development --progress --config .electron-vue/webpack.main.config.js",
- "dev:renderer": "webpack --node-env=development --mode development --progress --config .electron-vue/webpack.renderer.config.js",
- "lint:eslint": "eslint -c .eslintrc.js --ext .js,.vue,.ts src spec",
- "lint:stylelint": "stylelint '**/*.vue'",
- "build": "node .electron-vue/build.js",
- "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js",
- "build:web": "cross-env BUILD_TARGET=web node .electron-vue/build.js",
- "package:mas": "electron-builder --mac --publish never --config electron-builder.mas.json",
- "package:mac": "electron-builder --mac --publish never --config electron-builder.json",
- "package:linux": "electron-builder --linux --publish never --config electron-builder.json",
- "package:win32": "electron-builder --win --ia32 --publish never --config electron-builder.json",
- "package:win64": "electron-builder --win --x64 --publish never --config electron-builder.json",
- "package:pacman": "electron-builder --linux pacman --publish never --config electron-builder.json",
- "package:appx2": "electron-builder --win --x64 --config electron-builder.json && electron-windows-store --assets .\\build\\icons --input-directory .\\build\\win-unpacked --output-directory .\\build\\appx --package-name Whalebird --package-display-name Whalebird --package-version 5.1.1.0 --publisher-display-name h3poteto --identity-name 45610h3poteto.Whalebird",
- "pack": "yarn run pack:main && yarn run pack:renderer",
- "pack:main": "webpack --node-env=production --mode production --progress --config .electron-vue/webpack.main.config.js",
- "pack:renderer": "webpack --node-env=production --mode production --progress --config .electron-vue/webpack.renderer.config.js",
- "typecheck": "tsc -p . --noEmit && vue-tsc --noEmit",
- "spec": "NODE_ENV=test jest -u --maxWorkers=3",
- "postinstall": "electron-builder install-app-deps",
- "thirdparty": "license-checker --production --json > thirdparty.json && node scripts/thirdparty.js"
- },
- "jest": {
- "moduleFileExtensions": [
- "ts",
- "js",
- "json"
- ],
- "moduleNameMapper": {
- "@/router": "/spec/mock/router.ts",
- "^@/(.+)": "/src/renderer/$1",
- "^~/(.+)": "/$1",
- "axios": "axios/dist/node/axios.cjs"
- },
- "testMatch": [
- "**/spec/**/*.spec.ts"
- ],
- "preset": "ts-jest/presets/js-with-ts",
- "transform": {
- "^.+\\.(js|jsx)$": "babel-jest",
- "^.+\\.(ts|tsx)$": "ts-jest"
- },
- "transformIgnorePatterns": [
- "/node_modules/(?!axios)"
- ],
- "setupFiles": [
- "core-js",
- "/spec/setupJest.ts"
- ],
- "globals": {
- "ts-jest": {
- "tsconfig": "tsconfig.json"
- }
- }
+ "dev": "nextron",
+ "build": "nextron build",
+ "postinstall": "electron-builder install-app-deps"
},
"dependencies": {
- "@fortawesome/fontawesome-svg-core": "^6.4.0",
- "@fortawesome/free-regular-svg-icons": "^6.4.0",
- "@fortawesome/free-solid-svg-icons": "^6.4.0",
- "@fortawesome/vue-fontawesome": "^3.0.3",
- "@trodi/electron-splashscreen": "^1.0.2",
- "@vueuse/core": "10.4.1",
- "@vueuse/math": "^10.1.2",
- "about-window": "^1.15.2",
- "animate.css": "^4.1.0",
- "auto-launch": "^5.0.5",
- "axios": "1.5.1",
- "better-sqlite3": "8.2.0",
- "electron-context-menu": "^3.6.1",
- "electron-json-storage": "^4.6.0",
- "electron-log": "^4.4.8",
- "electron-window-state": "^5.0.3",
- "element-plus": "^2.3.14",
- "emoji-mart-vue-fast": "^15.0.0",
- "i18next": "^23.0.0",
- "i18next-vue": "^2.1.1",
- "megalodon": "8.1.4",
- "minimist": "^1.2.8",
- "mitt": "^3.0.0",
- "moment": "^2.29.4",
- "mousetrap": "^1.6.5",
- "object-assign-deep": "^0.4.0",
- "parse-link-header": "^2.0.0",
- "sanitize-html": "^2.10.0",
- "simplayer": "0.0.8",
- "system-font-families": "^0.6.0",
- "unicode-emoji-json": "^0.4.0",
- "vue": "^3.3.4",
- "vue-popperjs": "^2.3.0",
- "vue-resize": "^2.0.0-alpha.1",
- "vue-router": "^4.2.2",
- "vue-virtual-scroller": "2.0.0-beta.8",
- "vuex": "^4.1.0",
- "vuex-router-sync": "^6.0.0-rc.1"
+ "dexie": "^3.2.4",
+ "electron-serve": "^1.1.0",
+ "electron-store": "^8.1.0",
+ "flowbite": "^2.0.0",
+ "flowbite-react": "^0.6.4",
+ "megalodon": "^9.1.1"
},
"devDependencies": {
- "@babel/core": "^7.22.1",
- "@babel/eslint-parser": "^7.21.8",
- "@babel/plugin-proposal-class-properties": "^7.18.6",
- "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
- "@babel/plugin-transform-runtime": "^7.21.4",
- "@babel/preset-env": "^7.21.5",
- "@babel/register": "^7.21.0",
- "@babel/runtime": "7.23.1",
- "@electron/notarize": "^2.0.0",
- "@types/auto-launch": "^5.0.2",
- "@types/better-sqlite3": "^7.6.3",
- "@types/electron-json-storage": "^4.5.0",
- "@types/jest": "27.5.2",
- "@types/jsdom": "^21.1.1",
- "@types/node": "^20.2.5",
- "@types/parse-link-header": "^2.0.1",
- "@typescript-eslint/eslint-plugin": "^6.0.0",
- "@typescript-eslint/parser": "^6.0.0",
- "@vue/compiler-sfc": "^3.3.4",
- "@vue/eslint-config-prettier": "^8.0.0",
- "@vue/eslint-config-typescript": "^12.0.0",
- "all-object-keys": "^2.2.0",
- "assert": "^2.0.0",
- "babel-jest": "^29.5.0",
- "babel-loader": "^9.1.2",
- "babel-plugin-istanbul": "^6.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^6.0.3",
- "bufferutil": "^4.0.7",
- "cfonts": "^3.2.0",
- "cli-color": "^2.0.3",
- "copy-webpack-plugin": "^11.0.0",
- "core-js": "^3.30.2",
- "cross-env": "^7.0.3",
- "crypto-browserify": "^3.12.0",
- "css-loader": "^6.7.3",
- "del": "^6.1.1",
- "devtron": "^1.4.0",
- "electron": "22.3.25",
- "electron-builder": "23.6.0",
- "electron-debug": "^3.2.0",
- "electron-devtools-installer": "^3.2.0",
- "electron-mock-ipc": "^0.3.12",
- "electron-windows-store": "^2.1.0",
- "eslint": "^8.49.0",
- "eslint-plugin-vue": "^9.14.1",
- "file-loader": "^6.2.0",
- "html-webpack-plugin": "^5.5.1",
- "https-browserify": "^1.0.0",
- "jest": "^26.6.3",
- "jsdom": "^22.1.0",
- "json-loader": "^0.5.7",
- "listr": "^0.14.3",
- "mini-css-extract-plugin": "^2.7.5",
- "node-loader": "^2.0.0",
- "node-sass": "^9.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "^1.0.1",
- "postcss": "^8.4.23",
- "postcss-html": "^1.5.0",
- "postcss-scss": "^4.0.6",
- "prettier": "^3.0.3",
- "process": "^0.11.10",
- "regenerator-runtime": "^0.14.0",
- "sass-loader": "^13.2.2",
- "stream-browserify": "^3.0.0",
- "stream-http": "^3.2.0",
- "style-loader": "^3.3.2",
- "stylelint": "^14.16.1",
- "stylelint-config-html": "^1.1.0",
- "stylelint-config-prettier": "^9.0.4",
- "stylelint-config-standard": "^34.0.0",
- "stylelint-scss": "^5.2.0",
- "timers-browserify": "^2.0.12",
- "ts-jest": "^26.5.6",
- "ts-loader": "^9.4.2",
- "ttfinfo": "^0.2.0",
- "typescript": "^4.9.5",
- "url": "^0.11.0",
- "url-loader": "^4.1.1",
- "utf-8-validate": "^6.0.3",
- "vue-html-loader": "^1.2.4",
- "vue-loader": "^17.2.2",
- "vue-style-loader": "^4.1.3",
- "vue-tsc": "^1.6.5",
- "webpack": "^5.82.1",
- "webpack-cli": "^5.1.1",
- "webpack-dev-server": "^4.15.0",
- "webpack-hot-middleware": "^2.25.3"
+ "@babel/runtime-corejs3": "^7.23.2",
+ "@types/node": "^18.11.18",
+ "@types/react": "^18.0.26",
+ "autoprefixer": "^10.4.16",
+ "electron": "^26.2.2",
+ "electron-builder": "^24.6.4",
+ "next": "^12.3.4",
+ "nextron": "^8.12.0",
+ "postcss": "^8.4.31",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tailwindcss": "^3.3.3",
+ "typescript": "^5.2.2"
}
}
diff --git a/packages/.gitkeep b/packages/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/plist/child.plist b/plist/child.plist
deleted file mode 100644
index d8dc69e8..00000000
--- a/plist/child.plist
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.inherit
-
-
-
diff --git a/plist/entitlements.mac.plist b/plist/entitlements.mac.plist
deleted file mode 100644
index 55f37a69..00000000
--- a/plist/entitlements.mac.plist
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- com.apple.security.cs.allow-jit
-
- com.apple.security.cs.allow-unsigned-executable-memory
-
-
-
diff --git a/plist/loginhelper.plist b/plist/loginhelper.plist
deleted file mode 100644
index 8e31f755..00000000
--- a/plist/loginhelper.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
-
-
diff --git a/plist/parent.plist b/plist/parent.plist
deleted file mode 100644
index 6bc4d0cd..00000000
--- a/plist/parent.plist
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.files.user-selected.read-only
-
- com.apple.security.network.client
-
-
-
diff --git a/renderer/app.css b/renderer/app.css
new file mode 100644
index 00000000..b5c61c95
--- /dev/null
+++ b/renderer/app.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/build/icons/256x256.png b/renderer/assets/256x256.png
similarity index 100%
rename from build/icons/256x256.png
rename to renderer/assets/256x256.png
diff --git a/renderer/components/accounts/New.tsx b/renderer/components/accounts/New.tsx
new file mode 100644
index 00000000..2840158a
--- /dev/null
+++ b/renderer/components/accounts/New.tsx
@@ -0,0 +1,83 @@
+import { Label, Modal, TextInput, Button } from 'flowbite-react'
+import generator, { MegalodonInterface, detector } from 'megalodon'
+import { useState } from 'react'
+import { db } from '@/db'
+
+type NewProps = {
+ opened: boolean
+ close: () => void
+}
+
+export default function New(props: NewProps) {
+ const [sns, setSNS] = useState<'mastodon' | 'pleroma' | 'firefish' | 'friendica' | null>(null)
+ const [domain, setDomain] = useState('')
+ const [client, setClient] = useState()
+ const [clientId, setClientId] = useState()
+ const [clientSecret, setClientSecret] = useState()
+
+ const checkDomain = async () => {
+ const input = document.getElementById('domain') as HTMLInputElement
+ setDomain(input.value)
+ const url = `https://${input.value}`
+ const sns = await detector(url)
+ setSNS(sns)
+ const client = generator(sns, url)
+ setClient(client)
+ const appData = await client.registerApp('Whalebird', {})
+ setClientId(appData.client_id)
+ setClientSecret(appData.client_secret)
+ global.ipc.invoke('open-browser', appData.url)
+ }
+
+ const authorize = async () => {
+ const input = document.getElementById('authorization') as HTMLInputElement
+ if (!client || !clientId || !clientSecret) return
+ const tokenData = await client.fetchAccessToken(clientId, clientSecret, input.value)
+ if (!sns) return
+ const cli = generator(sns, `https://${domain}`, tokenData.access_token, 'Whalebird')
+ const acct = await cli.verifyAccountCredentials()
+ await db.accounts.add({
+ username: acct.data.username,
+ account_id: acct.data.id,
+ avatar: acct.data.avatar,
+ client_id: clientId,
+ client_secret: clientSecret,
+ access_token: tokenData.access_token,
+ refresh_token: tokenData.refresh_token,
+ url: `https://${domain}`,
+ domain: domain,
+ sns: sns
+ })
+ props.close()
+ }
+
+ return (
+ <>
+ props.close()}>
+ Add account
+
+
+
+
+ >
+ )
+}
diff --git a/renderer/components/layouts/account.tsx b/renderer/components/layouts/account.tsx
new file mode 100644
index 00000000..8a0bfad8
--- /dev/null
+++ b/renderer/components/layouts/account.tsx
@@ -0,0 +1,48 @@
+import { useEffect, useState } from 'react'
+import { FaPlus } from 'react-icons/fa6'
+import { Account, db } from '@/db'
+import NewAccount from '@/components/accounts/New'
+import { Avatar } from 'flowbite-react'
+
+type LayoutProps = {
+ children: React.ReactNode
+}
+
+export default function Layout({ children }: LayoutProps) {
+ const [accounts, setAccounts] = useState>([])
+ const [openNewModal, setOpenNewModal] = useState(false)
+
+ useEffect(() => {
+ const fn = async () => {
+ const acct = await db.accounts.toArray()
+ setAccounts(acct)
+ if (acct.length === 0) {
+ setOpenNewModal(true)
+ }
+ }
+ fn()
+ }, [])
+
+ const closeNewModal = async () => {
+ const acct = await db.accounts.toArray()
+ setAccounts(acct)
+ setOpenNewModal(false)
+ }
+
+ return (
+
+
+
+ {accounts.map(account => (
+
+ ))}
+ setOpenNewModal(true)}>
+
+
+
+
+ {children}
+
+
+ )
+}
diff --git a/renderer/components/layouts/timelines.tsx b/renderer/components/layouts/timelines.tsx
new file mode 100644
index 00000000..28ee4a1c
--- /dev/null
+++ b/renderer/components/layouts/timelines.tsx
@@ -0,0 +1,82 @@
+import { Account, db } from '@/db'
+import { CustomFlowbiteTheme, Flowbite, Sidebar } from 'flowbite-react'
+import { useRouter } from 'next/router'
+import { useEffect, useState } from 'react'
+
+type LayoutProps = {
+ children: React.ReactNode
+}
+
+const customTheme: CustomFlowbiteTheme = {
+ sidebar: {
+ root: {
+ inner: 'h-full overflow-y-auto overflow-x-hidden bg-blue-950 py-4 px-3 dark:bg-blue-950'
+ },
+ item: {
+ base: 'flex items-center justify-center rounded-lg p-2 text-base font-normal text-blue-200 hover:bg-blue-900 dark:text-blue-200 dark:hover:bg-blue-900 cursor-pointer',
+ active: 'bg-blue-400 text-gray-800 hover:bg-blue-300'
+ }
+ }
+}
+
+export default function Layout({ children }: LayoutProps) {
+ const router = useRouter()
+
+ const [account, setAccount] = useState(null)
+ useEffect(() => {
+ if (router.query.id) {
+ const f = async () => {
+ const acct = await db.accounts.get(parseInt(router.query.id as string))
+ if (!acct) return
+ setAccount(acct)
+ }
+ f()
+ }
+ }, [router.query.id])
+
+ const pages = [
+ {
+ id: 'home',
+ title: 'Home',
+ path: `/accounts/${router.query.id}/home`
+ },
+ {
+ id: 'notifications',
+ title: 'Notifications',
+ path: `/accounts/${router.query.id}/notifications`
+ },
+ {
+ id: 'local',
+ title: 'Local',
+ path: `/accounts/${router.query.id}/local`
+ },
+ {
+ id: 'public',
+ title: 'Public',
+ path: `/accounts/${router.query.id}/public`
+ }
+ ]
+
+ return (
+
+
+
+
+
{account?.username}
+
@{account?.domain}
+
+
+
+ {pages.map(page => (
+ router.push(page.path)}>
+ {page.title}
+
+ ))}
+
+
+
+
+ {children}
+
+ )
+}
diff --git a/renderer/db.ts b/renderer/db.ts
new file mode 100644
index 00000000..e5ab2593
--- /dev/null
+++ b/renderer/db.ts
@@ -0,0 +1,30 @@
+import Dexie, { type Table } from 'dexie'
+
+export type Account = {
+ id?: number
+ username: string
+ account_id: string
+ avatar: string
+ client_id: string
+ client_secret: string
+ access_token: string
+ refresh_token: string | null
+ url: string
+ domain: string
+ sns: 'mastodon' | 'pleroma' | 'friendica' | 'firefish'
+}
+
+export class SubClassedDexie extends Dexie {
+ // 'friends' is added by dexie when declaring the stores()
+ // We just tell the typing system this is the case
+ accounts!: Table
+
+ constructor() {
+ super('whalebird')
+ this.version(1).stores({
+ accounts: '++id, username, account_id, avatar, client_id, client_secret, access_token, refresh_token, url, domain, sns'
+ })
+ }
+}
+
+export const db = new SubClassedDexie()
diff --git a/renderer/interfaces/index.ts b/renderer/interfaces/index.ts
new file mode 100644
index 00000000..fc5d69b9
--- /dev/null
+++ b/renderer/interfaces/index.ts
@@ -0,0 +1,16 @@
+// You can include shared interfaces/types in a separate file
+// and then use them in any component by importing them. For
+// example, to import the interface below do:
+//
+// import User from 'path/to/interfaces';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+import { IpcRenderer } from 'electron'
+
+declare global {
+ // eslint-disable-next-line @typescript-eslint/no-namespace
+ namespace NodeJS {
+ interface Global {
+ ipc: IpcRenderer
+ }
+ }
+}
diff --git a/renderer/next-env.d.ts b/renderer/next-env.d.ts
new file mode 100644
index 00000000..4f11a03d
--- /dev/null
+++ b/renderer/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/renderer/next.config.js b/renderer/next.config.js
new file mode 100644
index 00000000..60e1d31c
--- /dev/null
+++ b/renderer/next.config.js
@@ -0,0 +1,10 @@
+/** @type {import('next').NextConfig} */
+module.exports = {
+ trailingSlash: true,
+ images: {
+ unoptimized: true,
+ },
+ webpack: (config) => {
+ return config
+ },
+}
diff --git a/renderer/pages/_app.tsx b/renderer/pages/_app.tsx
new file mode 100644
index 00000000..4225bc18
--- /dev/null
+++ b/renderer/pages/_app.tsx
@@ -0,0 +1,14 @@
+import type { AppProps } from 'next/app'
+import '../app.css'
+import AccountLayout from '@/components/layouts/account'
+import TimelineLayout from '@/components/layouts/timelines'
+
+export default function MyApp({ Component, pageProps }: AppProps) {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/renderer/pages/accounts/[id]/[timeline].tsx b/renderer/pages/accounts/[id]/[timeline].tsx
new file mode 100644
index 00000000..438920e4
--- /dev/null
+++ b/renderer/pages/accounts/[id]/[timeline].tsx
@@ -0,0 +1,6 @@
+import { useRouter } from 'next/router'
+
+export default function Timeline() {
+ const router = useRouter()
+ return {router.query.timeline}
+}
diff --git a/renderer/pages/accounts/[id]/index.tsx b/renderer/pages/accounts/[id]/index.tsx
new file mode 100644
index 00000000..647fc63b
--- /dev/null
+++ b/renderer/pages/accounts/[id]/index.tsx
@@ -0,0 +1,15 @@
+import { useRouter } from 'next/router'
+
+type AccountProps = {}
+
+export default function Account(props: AccountProps) {
+ const router = useRouter()
+ const lastTimeline = localStorage.getItem(`${router.query.id}_lastTimeline`)
+ if (lastTimeline) {
+ router.push(`/accounts/${router.query.id}/${lastTimeline}`)
+ } else {
+ router.push(`/accounts/${router.query.id}/home`)
+ }
+
+ return <>{router.query.id}>
+}
diff --git a/renderer/pages/index.tsx b/renderer/pages/index.tsx
new file mode 100644
index 00000000..5db02c80
--- /dev/null
+++ b/renderer/pages/index.tsx
@@ -0,0 +1,25 @@
+import Image from 'next/image'
+import { useRouter } from 'next/router'
+import { useEffect } from 'react'
+import Icon from '@/assets/256x256.png'
+import { db } from '@/db'
+
+export default function Index() {
+ const router = useRouter()
+
+ useEffect(() => {
+ const f = async () => {
+ const accounts = await db.accounts.toArray()
+ if (accounts.length > 0) {
+ router.push(`/accounts/${accounts[0].id}`)
+ }
+ }
+ f()
+ }, [])
+
+ return (
+
+
+
+ )
+}
diff --git a/renderer/postcss.config.js b/renderer/postcss.config.js
new file mode 100644
index 00000000..af3ba26c
--- /dev/null
+++ b/renderer/postcss.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {
+ config: './renderer/tailwind.config.js',
+ },
+ autoprefixer: {},
+ },
+}
diff --git a/renderer/preload.d.ts b/renderer/preload.d.ts
new file mode 100644
index 00000000..74dce32f
--- /dev/null
+++ b/renderer/preload.d.ts
@@ -0,0 +1,7 @@
+import { IpcHandler } from '../main/preload'
+
+declare global {
+ interface Window {
+ ipc: IpcHandler
+ }
+}
diff --git a/renderer/tailwind.config.js b/renderer/tailwind.config.js
new file mode 100644
index 00000000..2ad94aac
--- /dev/null
+++ b/renderer/tailwind.config.js
@@ -0,0 +1,25 @@
+module.exports = {
+ content: ['./node_modules/flowbite-react/**/*.js', './renderer/pages/**/*.{js,ts,jsx,tsx}', './renderer/components/**/*.{js,ts,jsx,tsx}'],
+ plugins: [require('flowbite/plugin')],
+ darkMode: 'class',
+ theme: {
+ extend: {
+ colors: {
+ // flowbite-svelte
+ // Refs: https://github.com/themesberg/flowbite-svelte/blob/main/tailwind.config.cjs
+ primary: {
+ 50: '#eff6ff',
+ 100: '#dbeafe',
+ 200: '#bfdbfe',
+ 300: '#93c5fd',
+ 400: '#60a5fa',
+ 500: '#3b82f6',
+ 600: '#2563eb',
+ 700: '#1d4ed8',
+ 800: '#1e40af',
+ 900: '#1e3a8a'
+ }
+ }
+ }
+ }
+}
diff --git a/renderer/tsconfig.json b/renderer/tsconfig.json
new file mode 100644
index 00000000..ddc2c4f2
--- /dev/null
+++ b/renderer/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"],
+ "compilerOptions": {
+ "baseUrl": "./",
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ }
+ }
+}
diff --git a/renovate.json b/renovate.json
deleted file mode 100644
index a66c83d4..00000000
--- a/renovate.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
- "extends": [
- "config:base"
- ],
- "prConcurrentLimit": 20,
- "prHourlyLimit": 20,
- "packageRules": [
- {
- "matchPackageNames": ["better-sqlite3"],
- "allowedVersions": "< 8.3.0"
- },{
- "matchPackageNames": ["electron"],
- "matchUpdateTypes": ["minor", "patch", "pin", "pinDigest"],
- "enabled": false
- }
- ]
-}
diff --git a/static/images/icon.png b/resources/icons/256x256.png
similarity index 100%
rename from static/images/icon.png
rename to resources/icons/256x256.png
diff --git a/build/icons/SampleAppx.150x150.png b/resources/icons/SampleAppx.150x150.png
similarity index 100%
rename from build/icons/SampleAppx.150x150.png
rename to resources/icons/SampleAppx.150x150.png
diff --git a/build/icons/SampleAppx.310x150.png b/resources/icons/SampleAppx.310x150.png
similarity index 100%
rename from build/icons/SampleAppx.310x150.png
rename to resources/icons/SampleAppx.310x150.png
diff --git a/build/icons/SampleAppx.44x44.png b/resources/icons/SampleAppx.44x44.png
similarity index 100%
rename from build/icons/SampleAppx.44x44.png
rename to resources/icons/SampleAppx.44x44.png
diff --git a/build/icons/SampleAppx.50x50.png b/resources/icons/SampleAppx.50x50.png
similarity index 100%
rename from build/icons/SampleAppx.50x50.png
rename to resources/icons/SampleAppx.50x50.png
diff --git a/build/icons/icon.icns b/resources/icons/icon.icns
similarity index 100%
rename from build/icons/icon.icns
rename to resources/icons/icon.icns
diff --git a/build/icons/icon.ico b/resources/icons/icon.ico
similarity index 100%
rename from build/icons/icon.ico
rename to resources/icons/icon.ico
diff --git a/build/icons/icon.iconset/icon_128x128.png b/resources/icons/icon.iconset/icon_128x128.png
similarity index 100%
rename from build/icons/icon.iconset/icon_128x128.png
rename to resources/icons/icon.iconset/icon_128x128.png
diff --git a/build/icons/icon.iconset/icon_128x128@2x.png b/resources/icons/icon.iconset/icon_128x128@2x.png
similarity index 100%
rename from build/icons/icon.iconset/icon_128x128@2x.png
rename to resources/icons/icon.iconset/icon_128x128@2x.png
diff --git a/build/icons/icon.iconset/icon_16x16.png b/resources/icons/icon.iconset/icon_16x16.png
similarity index 100%
rename from build/icons/icon.iconset/icon_16x16.png
rename to resources/icons/icon.iconset/icon_16x16.png
diff --git a/build/icons/icon.iconset/icon_16x16@2x.png b/resources/icons/icon.iconset/icon_16x16@2x.png
similarity index 100%
rename from build/icons/icon.iconset/icon_16x16@2x.png
rename to resources/icons/icon.iconset/icon_16x16@2x.png
diff --git a/build/icons/icon.iconset/icon_256x256.png b/resources/icons/icon.iconset/icon_256x256.png
similarity index 100%
rename from build/icons/icon.iconset/icon_256x256.png
rename to resources/icons/icon.iconset/icon_256x256.png
diff --git a/build/icons/icon.iconset/icon_256x256@2x.png b/resources/icons/icon.iconset/icon_256x256@2x.png
similarity index 100%
rename from build/icons/icon.iconset/icon_256x256@2x.png
rename to resources/icons/icon.iconset/icon_256x256@2x.png
diff --git a/build/icons/icon.iconset/icon_32x32.png b/resources/icons/icon.iconset/icon_32x32.png
similarity index 100%
rename from build/icons/icon.iconset/icon_32x32.png
rename to resources/icons/icon.iconset/icon_32x32.png
diff --git a/build/icons/icon.iconset/icon_32x32@2x.png b/resources/icons/icon.iconset/icon_32x32@2x.png
similarity index 100%
rename from build/icons/icon.iconset/icon_32x32@2x.png
rename to resources/icons/icon.iconset/icon_32x32@2x.png
diff --git a/build/icons/icon.iconset/icon_512x512.png b/resources/icons/icon.iconset/icon_512x512.png
similarity index 100%
rename from build/icons/icon.iconset/icon_512x512.png
rename to resources/icons/icon.iconset/icon_512x512.png
diff --git a/build/icons/icon.iconset/icon_512x512@2x.png b/resources/icons/icon.iconset/icon_512x512@2x.png
similarity index 100%
rename from build/icons/icon.iconset/icon_512x512@2x.png
rename to resources/icons/icon.iconset/icon_512x512@2x.png
diff --git a/build/icons/tray_icon.png b/resources/icons/tray_icon.png
similarity index 100%
rename from build/icons/tray_icon.png
rename to resources/icons/tray_icon.png
diff --git a/screenshot.png b/screenshot.png
deleted file mode 100644
index ea0a6bba..00000000
Binary files a/screenshot.png and /dev/null differ
diff --git a/scripts/thirdparty.js b/scripts/thirdparty.js
deleted file mode 100644
index be42b78a..00000000
--- a/scripts/thirdparty.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const path = require('path')
-const fs = require('fs')
-
-const npmPath = path.join(__dirname, '../thirdparty.json')
-const outPath = path.join(__dirname, '../', 'src', 'config', 'thirdparty.json')
-
-const npmData = JSON.parse(fs.readFileSync(npmPath))
-
-let npm = Object.keys(npmData).map(k => {
- let r = {
- package_name: k,
- license: npmData[k].licenses
- }
- if (npmData[k].publisher) {
- r = Object.assign(r, {
- publisher: npmData[k].publisher
- })
- }
- if (npmData[k].repository) {
- r = Object.assign(r, {
- repository: npmData[k].repository
- })
- }
- return r
-})
-
-fs.writeFileSync(outPath, JSON.stringify(npm))
diff --git a/spec/.eslintrc b/spec/.eslintrc
deleted file mode 100644
index 7bc296da..00000000
--- a/spec/.eslintrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "env": {
- "jest": true
- }
-}
\ No newline at end of file
diff --git a/spec/config/i18n.spec.ts b/spec/config/i18n.spec.ts
deleted file mode 100644
index d8340289..00000000
--- a/spec/config/i18n.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import * as path from 'path'
-import fs from 'fs'
-import keys from 'all-object-keys'
-
-const locales = [
- 'de',
- 'fr',
- 'gd',
- 'it',
- 'ja',
- 'ko',
- 'pl',
- 'is',
- 'it',
- 'zh_cn',
- 'zh_tw',
- 'cs',
- 'es_es',
- 'no',
- 'pt_pt',
- 'ru',
- 'si',
- 'sv_se',
- 'tzm',
- 'fa'
-]
-
-describe('i18n', () => {
- describe('should not define duplicate keys', () => {
- locales.forEach(locale => {
- it(`${locale} translation`, () => {
- const targetJson = JSON.parse(
- fs.readFileSync(path.resolve(__dirname, `../../src/config/locales/${locale}/translation.json`), 'utf8')
- )
- const allKeys = keys(targetJson)
- const duplicates: Array = allKeys.filter(
- (x: string, _: number, self: Array) => self.indexOf(x) !== self.lastIndexOf(x)
- )
- expect(duplicates).toEqual([])
- })
- })
- })
-})
diff --git a/spec/main/unit/proxy.spec.ts b/spec/main/unit/proxy.spec.ts
deleted file mode 100644
index db179717..00000000
--- a/spec/main/unit/proxy.spec.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import path from 'path'
-import ProxyConfiguration from '~/src/main/proxy'
-import { ManualProxy, ProxyProtocol } from '~/src/types/proxy'
-
-const preferencesDBPath = path.resolve(__dirname, '../../preferences.json')
-const proxyConfiguration = new ProxyConfiguration(preferencesDBPath)
-
-jest.mock('electron', () => ({
- app: {
- // getVersion is used by electron-log
- getVersion: jest.fn(),
- // getName is used by electron-json-storage
- getName: jest.fn()
- }
-}))
-
-describe('Parser', () => {
- it('do not use proxy', () => {
- proxyConfiguration.setSystemProxy('DIRECT')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).toEqual(false)
- })
-
- it('HTTP and HTTPS proxy', () => {
- proxyConfiguration.setSystemProxy('PROXY hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.http)
- expect(manualProxy.host).toEqual('hoge.example.com')
- expect(manualProxy.port).toEqual('8080')
- })
-
- it('SOCKS4 proxy', () => {
- proxyConfiguration.setSystemProxy('SOCKS4 hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.socks4)
- })
- it('SOCKS4A proxy', () => {
- proxyConfiguration.setSystemProxy('SOCKS4A hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.socks4a)
- })
- it('SOCKS5 proxy', () => {
- proxyConfiguration.setSystemProxy('SOCKS5 hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.socks5)
- })
- it('SOCKS5H proxy', () => {
- proxyConfiguration.setSystemProxy('SOCKS5H hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.socks5h)
- })
- it('SOCKS proxy', () => {
- proxyConfiguration.setSystemProxy('SOCKS hoge.example.com:8080')
- const proxy = proxyConfiguration.parseSystemProxy()
- expect(proxy).not.toBe(false)
- const manualProxy = proxy as ManualProxy
- expect(manualProxy.protocol).toEqual(ProxyProtocol.socks5)
- })
-})
diff --git a/spec/mock/electron.ts b/spec/mock/electron.ts
deleted file mode 100644
index 5e3846fb..00000000
--- a/spec/mock/electron.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import createIPCMock from 'electron-mock-ipc'
-import { IpcRenderer, IpcMain } from 'electron'
-
-const mocked = createIPCMock()
-const ipcMain = mocked.ipcMain as IpcMain
-const ipcRenderer = mocked.ipcRenderer as IpcRenderer
-
-export { ipcMain, ipcRenderer }
diff --git a/spec/mock/router.ts b/spec/mock/router.ts
deleted file mode 100644
index 23cdcf5a..00000000
--- a/spec/mock/router.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export default {
- push: jest.fn()
-}
diff --git a/spec/preferences.json b/spec/preferences.json
deleted file mode 100644
index 0967ef42..00000000
--- a/spec/preferences.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/spec/renderer/integration/store/App.spec.ts b/spec/renderer/integration/store/App.spec.ts
deleted file mode 100644
index e63d27cc..00000000
--- a/spec/renderer/integration/store/App.spec.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { createStore, Store } from 'vuex'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import App from '@/store/App'
-import DisplayStyle from '~/src/constants/displayStyle'
-import { LightTheme, DarkTheme } from '~/src/constants/themeColor'
-import Theme from '~/src/constants/theme'
-import TimeFormat from '~/src/constants/timeFormat'
-import Language from '~/src/constants/language'
-import DefaultFonts from '@/utils/fonts'
-import { MyWindow } from '~/src/types/global'
-import { RootState } from '@/store'
-;(window as any as MyWindow).ipcRenderer = ipcRenderer
-
-const state = () => {
- return {
- theme: LightTheme,
- fontSize: 14,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- notify: {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true
- },
- timeFormat: TimeFormat.Absolute.value,
- language: Language.en.key,
- defaultFonts: DefaultFonts,
- ignoreCW: false,
- ignoreNSFW: false,
- hideAllAttachments: false
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: App.actions,
- mutations: App.mutations
- }
-}
-
-describe('App', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- App: initStore()
- }
- })
- })
-
- describe('loadPreferences', () => {
- describe('error', () => {
- it('should not change', async () => {
- ipcMain.handle('get-preferences', async () => {
- throw new Error()
- })
- await store.dispatch('App/loadPreferences').catch(err => {
- expect(err instanceof Error).toEqual(true)
- expect(store.state.App.theme).toEqual(LightTheme)
- })
- ipcMain.removeHandler('get-preferences')
- })
- })
- describe('success', () => {
- it('should be changed', async () => {
- ipcMain.handle('get-preferences', () => {
- return {
- general: {
- timeline: {
- cw: true,
- nsfw: true
- }
- },
- language: {
- language: Language.en.key
- },
- notification: {
- notify: {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true
- }
- },
- appearance: {
- theme: Theme.Dark.key,
- fontSize: 13,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- timeFormat: TimeFormat.Absolute.value,
- customThemeColor: LightTheme,
- font: DefaultFonts[0]
- }
- }
- })
- await store.dispatch('App/loadPreferences')
- expect(store.state.App.fontSize).toEqual(13)
- expect(store.state.App.theme).toEqual(DarkTheme)
- expect(store.state.App.ignoreCW).toEqual(true)
- expect(store.state.App.ignoreNSFW).toEqual(true)
- ipcMain.removeHandler('get-preferences')
- })
- })
- })
-})
diff --git a/spec/renderer/integration/store/GlobalHeader.spec.ts b/spec/renderer/integration/store/GlobalHeader.spec.ts
deleted file mode 100644
index a7e64b5b..00000000
--- a/spec/renderer/integration/store/GlobalHeader.spec.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-import { RootState } from '@/store'
-import { createStore, Store } from 'vuex'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import GlobalHeader, { GlobalHeaderState } from '~/src/renderer/store/GlobalHeader'
-import { MyWindow } from '~/src/types/global'
-;((window as any) as MyWindow).ipcRenderer = ipcRenderer
-
-const state = (): GlobalHeaderState => {
- return {
- accounts: [],
- changing: false,
- hide: false
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: GlobalHeader.actions,
- mutations: GlobalHeader.mutations
- }
-}
-
-const routerState = {
- namespaced: true,
- state: {
- params: {
- id: 'account_id'
- }
- }
-}
-
-describe('GlobalHeader', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- GlobalHeader: initStore(),
- route: routerState
- }
- })
- })
-
- describe('listAccounts', () => {
- beforeEach(() => {
- ipcMain.handle('list-accounts', () => {
- return ['account']
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('list-accounts')
- })
- it('should be updated', async () => {
- await store.dispatch('GlobalHeader/listAccounts')
- expect(store.state.GlobalHeader.accounts).toEqual(['account'])
- })
- })
-
- describe('removeShortcutEvents', () => {
- it('should be removed', async () => {
- const removed = await store.dispatch('GlobalHeader/removeShortcutEvents')
- expect(removed).toEqual(true)
- })
- })
-
- describe('loadHide', () => {
- beforeEach(() => {
- ipcMain.handle('get-global-header', () => {
- return true
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('get-global-header')
- })
- it('should be changed', async () => {
- await store.dispatch('GlobalHeader/loadHide')
- expect(store.state.GlobalHeader.hide).toEqual(true)
- })
- })
-
- describe('switchHide', () => {
- beforeEach(() => {
- ipcMain.handle('change-global-header', (_, value) => {
- return value
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('change-global-header')
- })
- it('should be switched', async () => {
- const hide = await store.dispatch('GlobalHeader/switchHide', true)
- expect(hide).toEqual(true)
- })
- })
-})
diff --git a/spec/renderer/integration/store/Preferences/Appearance.spec.ts b/spec/renderer/integration/store/Preferences/Appearance.spec.ts
deleted file mode 100644
index aa0efa15..00000000
--- a/spec/renderer/integration/store/Preferences/Appearance.spec.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-import { IpcMainInvokeEvent } from 'electron'
-import { createStore, Store } from 'vuex'
-import Theme from '~/src/constants/theme'
-import DisplayStyle from '~/src/constants/displayStyle'
-import TimeFormat from '~/src/constants/timeFormat'
-import { LightTheme, DarkTheme } from '~/src/constants/themeColor'
-import DefaultFonts from '@/utils/fonts'
-import Appearance, { AppearanceState } from '@/store/Preferences/Appearance'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import { MyWindow } from '~/src/types/global'
-import { RootState } from '@/store'
-;(window as any as MyWindow).ipcRenderer = ipcRenderer
-
-const state = (): AppearanceState => {
- return {
- appearance: {
- theme: Theme.Light.key,
- fontSize: 14,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- timeFormat: TimeFormat.Absolute.value,
- customThemeColor: LightTheme,
- font: DefaultFonts[0],
- tootPadding: 8
- },
- fonts: []
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: Appearance.actions,
- mutations: Appearance.mutations
- }
-}
-
-const preferencesStore = () => ({
- namespaced: true,
- modules: {
- Appearance: initStore()
- }
-})
-
-const App = {
- namespaced: true,
- actions: {
- loadPreferences: jest.fn()
- }
-}
-
-describe('Preferences/Appearance', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- Preferences: preferencesStore(),
- App: App
- }
- })
- })
-
- describe('load', () => {
- describe('loadAppearance', () => {
- beforeEach(() => {
- ipcMain.handle('get-preferences', () => {
- return {
- appearance: {
- theme: Theme.Dark.key,
- fontSize: 15
- }
- }
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('get-preferences')
- })
- it('should be loaded', async () => {
- await store.dispatch('Preferences/Appearance/loadAppearance')
- expect(store.state.Preferences.Appearance.appearance.theme).toEqual(Theme.Dark.key)
- expect(store.state.Preferences.Appearance.appearance.fontSize).toEqual(15)
- })
- })
- describe('loadFonts', () => {
- beforeEach(() => {
- ipcMain.handle('list-fonts', () => {
- return ['my-font']
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('list-fonts')
- })
- it('should be loaded', async () => {
- await store.dispatch('Preferences/Appearance/loadFonts')
- expect(store.state.Preferences.Appearance.fonts).toEqual([DefaultFonts[0], 'my-font'])
- })
- })
- })
-
- describe('update', () => {
- beforeEach(() => {
- ipcMain.handle('update-preferences', (_: IpcMainInvokeEvent, config: any) => {
- return config
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('update-preferences')
- })
- it('updateTheme', async () => {
- await store.dispatch('Preferences/Appearance/updateTheme', Theme.Dark.key)
- expect(store.state.Preferences.Appearance.appearance.theme).toEqual(Theme.Dark.key)
- expect(App.actions.loadPreferences).toBeCalled()
- })
-
- it('updateFontSize', async () => {
- await store.dispatch('Preferences/Appearance/updateFontSize', 15)
- expect(store.state.Preferences.Appearance.appearance.fontSize).toEqual(15)
- expect(App.actions.loadPreferences).toBeCalled()
- })
-
- it('updateDisplayNameStyle', async () => {
- await store.dispatch('Preferences/Appearance/updateDisplayNameStyle', DisplayStyle.DisplayName.value)
- expect(store.state.Preferences.Appearance.appearance.displayNameStyle).toEqual(DisplayStyle.DisplayName.value)
- expect(App.actions.loadPreferences).toBeCalled()
- })
-
- it('updateTimeFormat', async () => {
- await store.dispatch('Preferences/Appearance/updateTimeFormat', TimeFormat.Relative.value)
- expect(store.state.Preferences.Appearance.appearance.timeFormat).toEqual(TimeFormat.Relative.value)
- expect(App.actions.loadPreferences).toBeCalled()
- })
-
- it('updateCustomThemeColor', async () => {
- await store.dispatch('Preferences/Appearance/updateCustomThemeColor', DarkTheme)
- expect(store.state.Preferences.Appearance.appearance.customThemeColor).toEqual(DarkTheme)
- expect(App.actions.loadPreferences).toBeCalled()
- })
-
- it('updateFont', async () => {
- await store.dispatch('Preferences/Appearance/updateFont', DefaultFonts[1])
- expect(store.state.Preferences.Appearance.appearance.font).toEqual(DefaultFonts[1])
- expect(App.actions.loadPreferences).toBeCalled()
- })
- })
-})
diff --git a/spec/renderer/integration/store/Preferences/General.spec.ts b/spec/renderer/integration/store/Preferences/General.spec.ts
deleted file mode 100644
index aebee162..00000000
--- a/spec/renderer/integration/store/Preferences/General.spec.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-import { createStore, Store } from 'vuex'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import General, { GeneralState } from '@/store/Preferences/General'
-import { MyWindow } from '~/src/types/global'
-import { IpcMainInvokeEvent } from 'electron'
-import { RootState } from '@/store'
-;(window as any as MyWindow).ipcRenderer = ipcRenderer
-
-const state = (): GeneralState => {
- return {
- general: {
- sound: {
- fav_rb: true,
- toot: true
- },
- timeline: {
- cw: false,
- nsfw: false,
- hideAllAttachments: false
- },
- other: {
- launch: false,
- hideOnLaunch: false
- }
- },
- loading: false
- }
-}
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: General.actions,
- mutations: General.mutations
- }
-}
-
-const preferencesStore = () => ({
- namespaced: true,
- modules: {
- General: initStore()
- }
-})
-
-const app = {
- namespaced: true,
- actions: {
- loadPreferences(_) {
- return true
- }
- }
-}
-
-describe('Preferences/General', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- Preferences: preferencesStore(),
- App: app
- }
- })
- })
-
- describe('loadGeneral', () => {
- beforeEach(() => {
- ipcMain.handle('get-preferences', () => {
- return {
- general: {
- sound: {
- fav_rb: false,
- toot: false
- }
- }
- }
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('get-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/General/loadGeneral')
- expect(store.state.Preferences.General.general.sound.fav_rb).toEqual(false)
- expect(store.state.Preferences.General.general.sound.toot).toEqual(false)
- expect(store.state.Preferences.General.loading).toEqual(false)
- })
- })
-
- describe('updateSound', () => {
- beforeEach(() => {
- ipcMain.handle('update-preferences', (_: IpcMainInvokeEvent, config: any) => {
- return config
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('update-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/General/updateSound', {
- fav_rb: false,
- toot: false
- })
- expect(store.state.Preferences.General.general.sound.fav_rb).toEqual(false)
- expect(store.state.Preferences.General.general.sound.toot).toEqual(false)
- expect(store.state.Preferences.General.loading).toEqual(false)
- })
- })
-
- describe('updateTimeline', () => {
- beforeEach(() => {
- ipcMain.handle('update-preferences', (_: IpcMainInvokeEvent, config: any) => {
- return config
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('update-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/General/updateTimeline', {
- cw: true,
- nsfw: true,
- hideAllAttachments: true
- })
- expect(store.state.Preferences.General.general.timeline.cw).toEqual(true)
- expect(store.state.Preferences.General.general.timeline.nsfw).toEqual(true)
- expect(store.state.Preferences.General.general.timeline.hideAllAttachments).toEqual(true)
- expect(store.state.Preferences.General.loading).toEqual(false)
- })
- })
-})
diff --git a/spec/renderer/integration/store/Preferences/Language.spec.ts b/spec/renderer/integration/store/Preferences/Language.spec.ts
deleted file mode 100644
index 0fb432f9..00000000
--- a/spec/renderer/integration/store/Preferences/Language.spec.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { createStore, Store } from 'vuex'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import Language, { LanguageState } from '@/store/Preferences/Language'
-import DefaultLanguage from '~/src/constants/language'
-import { MyWindow } from '~/src/types/global'
-import { RootState } from '@/store'
-;(window as any as MyWindow).ipcRenderer = ipcRenderer
-
-const state = (): LanguageState => {
- return {
- language: {
- language: DefaultLanguage.en.key,
- spellchecker: {
- enabled: true,
- languages: []
- }
- }
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state,
- actions: Language.actions,
- mutations: Language.mutations
- }
-}
-
-const preferencesStore = () => ({
- namespaced: true,
- modules: {
- Language: initStore()
- }
-})
-
-describe('Preferences/Language', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- Preferences: preferencesStore()
- }
- })
- })
-
- describe('loadLanguage', () => {
- beforeEach(() => {
- ipcMain.handle('get-preferences', () => {
- return {
- language: {
- language: DefaultLanguage.ja.key,
- spellchecker: {
- enabled: true,
- languages: []
- }
- }
- }
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('get-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/Language/loadLanguage')
- expect(store.state.Preferences.Language.language.language).toEqual(DefaultLanguage.ja.key)
- })
- })
-
- describe('changeLanguage', () => {
- beforeEach(() => {
- ipcMain.handle('change-language', (_, key: string) => {
- return key
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('change-language')
- })
- it('should be changed', async () => {
- await store.dispatch('Preferences/Language/changeLanguage', DefaultLanguage.ja.key)
- expect(store.state.Preferences.Language.language.language).toEqual(DefaultLanguage.ja.key)
- })
- })
-})
diff --git a/spec/renderer/integration/store/Preferences/Notification.spec.ts b/spec/renderer/integration/store/Preferences/Notification.spec.ts
deleted file mode 100644
index cdb52c4d..00000000
--- a/spec/renderer/integration/store/Preferences/Notification.spec.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-import { createStore, Store } from 'vuex'
-import { ipcMain, ipcRenderer } from '~/spec/mock/electron'
-import Notification, { NotificationState } from '@/store/Preferences/Notification'
-import { MyWindow } from '~/src/types/global'
-import { RootState } from '@/store'
-;(window as any as MyWindow).ipcRenderer = ipcRenderer
-
-const state = (): NotificationState => {
- return {
- notification: {
- notify: {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true,
- follow_request: true,
- reaction: true,
- status: true,
- poll_vote: true,
- poll_expired: true
- }
- }
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: Notification.actions,
- mutations: Notification.mutations
- }
-}
-
-const preferencesStore = () => ({
- namespaced: true,
- modules: {
- Notification: initStore()
- }
-})
-
-const App = {
- namespaced: true,
- actions: {
- loadPreferences: jest.fn()
- }
-}
-
-describe('Preferences/Notification', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- Preferences: preferencesStore(),
- App: App
- }
- })
- })
-
- describe('loadNotification', () => {
- beforeEach(() => {
- ipcMain.handle('get-preferences', () => {
- return {
- notification: {
- notify: {
- reply: false,
- reblog: false,
- favourite: false,
- follow: false,
- follow_request: false,
- reaction: false,
- status: false,
- poll_vote: false,
- poll_expired: false
- }
- }
- }
- })
- afterEach(() => {
- ipcMain.removeHandler('get-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/Notification/loadNotification')
- expect(store.state.Preferences.Notification.notification).toEqual({
- notify: {
- reply: false,
- reblog: false,
- favourite: false,
- follow: false,
- follow_request: false,
- reaction: false,
- status: false,
- poll_vote: false,
- poll_expired: false
- }
- })
- })
- })
- })
-
- describe('updateNotify', () => {
- beforeEach(() => {
- ipcMain.handle('update-preferences', (_, conf: object) => {
- return conf
- })
- })
- afterEach(() => {
- ipcMain.removeHandler('update-preferences')
- })
- it('should be updated', async () => {
- await store.dispatch('Preferences/Notification/updateNotify', {
- reply: false,
- reblog: false
- })
- expect(store.state.Preferences.Notification.notification).toEqual({
- notify: {
- reply: false,
- reblog: false,
- favourite: true,
- follow: true,
- follow_request: true,
- reaction: true,
- status: true,
- poll_vote: true,
- poll_expired: true
- }
- })
- expect(App.actions.loadPreferences).toBeCalled()
- })
- })
-})
diff --git a/spec/renderer/integration/store/TimelineSpace/HeaderMenu.spec.ts b/spec/renderer/integration/store/TimelineSpace/HeaderMenu.spec.ts
deleted file mode 100644
index d94bedb1..00000000
--- a/spec/renderer/integration/store/TimelineSpace/HeaderMenu.spec.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { RootState } from '@/store'
-import { Response, Entity } from 'megalodon'
-import { createStore, Store } from 'vuex'
-import HeaderMenu, { HeaderMenuState } from '~/src/renderer/store/TimelineSpace/HeaderMenu'
-
-const list: Entity.List = {
- id: '1',
- title: 'example',
- replies_policy: null
-}
-
-const mockClient = {
- getList: (_listID: string) => {
- return new Promise>(resolve => {
- const res: Response = {
- data: list,
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- }
-}
-
-jest.mock('megalodon', () => ({
- ...jest.requireActual('megalodon'),
- default: jest.fn(() => mockClient),
- __esModule: true
-}))
-
-const state = (): HeaderMenuState => {
- return {
- title: 'Home',
- reload: false,
- loading: false
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: HeaderMenu.actions,
- mutations: HeaderMenu.mutations
- }
-}
-
-const timelineStore = () => ({
- namespaced: true,
- state: {
- account: {
- accessToken: 'token'
- },
- server: {
- sns: 'mastodon',
- baseURL: 'http://localhost'
- }
- },
- modules: {
- HeaderMenu: initStore()
- }
-})
-
-const appState = {
- namespaced: true,
- state: {
- proxyConfiguration: false
- }
-}
-
-describe('HeaderMenu', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- TimelineSpace: timelineStore(),
- App: appState
- }
- })
- })
-
- describe('fetchLists', () => {
- it('should be updated', async () => {
- const l = await store.dispatch('TimelineSpace/HeaderMenu/fetchList', list.id)
- expect(l).toEqual(list)
- expect(store.state.TimelineSpace.HeaderMenu.title).toEqual(`#${list.title}`)
- })
- })
-})
diff --git a/spec/renderer/integration/store/TimelineSpace/Modals/AddListMember.spec.ts b/spec/renderer/integration/store/TimelineSpace/Modals/AddListMember.spec.ts
deleted file mode 100644
index ebaf9a81..00000000
--- a/spec/renderer/integration/store/TimelineSpace/Modals/AddListMember.spec.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import { Response, Entity } from 'megalodon'
-import { createStore, Store } from 'vuex'
-import AddListMember, { AddListMemberState } from '@/store/TimelineSpace/Modals/AddListMember'
-import { RootState } from '@/store'
-
-const mockClient = {
- searchAccount: () => {
- return new Promise>(resolve => {
- const res: Response = {
- data: [account],
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- },
- addAccountsToList: () => {
- return new Promise(resolve => {
- const res: Response = {
- data: {},
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- }
-}
-
-jest.mock('megalodon', () => ({
- ...jest.requireActual('megalodon'),
- default: jest.fn(() => mockClient),
- __esModule: true
-}))
-
-const account: Entity.Account = {
- id: '1',
- username: 'h3poteto',
- acct: 'h3poteto@pleroma.io',
- display_name: 'h3poteto',
- locked: false,
- group: false,
- created_at: '2019-03-26T21:30:32',
- followers_count: 10,
- following_count: 10,
- statuses_count: 100,
- note: 'engineer',
- url: 'https://pleroma.io',
- avatar: '',
- avatar_static: '',
- header: '',
- header_static: '',
- emojis: [],
- moved: null,
- fields: [],
- bot: false,
- noindex: null,
- suspended: null,
- limited: null
-}
-
-const state = (): AddListMemberState => {
- return {
- modalOpen: false,
- accounts: [],
- targetListId: null
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: AddListMember.actions,
- mutations: AddListMember.mutations
- }
-}
-
-const modalsStore = () => ({
- namespaced: true,
- modules: {
- AddListMember: initStore()
- }
-})
-
-const timelineStore = () => ({
- namespaced: true,
- state: {
- account: {
- id: 0,
- accessToken: 'token'
- },
- server: {
- sns: 'mastodon'
- }
- },
- modules: {
- Modals: modalsStore()
- }
-})
-
-const appState = {
- namespaced: true,
- state: {
- proxyConfiguration: false
- }
-}
-
-describe('AddListMember', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- AddListMember: initStore(),
- TimelineSpace: timelineStore(),
- App: appState
- }
- })
- })
-
- describe('changeModal', () => {
- it('should change modal', () => {
- store.dispatch('TimelineSpace/Modals/AddListMember/changeModal', true)
- expect(store.state.TimelineSpace.Modals.AddListMember.modalOpen).toEqual(true)
- })
- })
-
- describe('search', () => {
- it('should be searched', async () => {
- await store.dispatch('TimelineSpace/Modals/AddListMember/search', 'akira')
- expect(store.state.TimelineSpace.Modals.AddListMember.accounts).toEqual([account])
- })
- })
-
- describe('add', () => {
- it('should be added a member to the list', async () => {
- const result = await store.dispatch('TimelineSpace/Modals/AddListMember/add', 'akira')
- expect(result).toEqual({})
- })
- })
-})
diff --git a/spec/renderer/integration/store/TimelineSpace/Modals/ImageViewer.spec.ts b/spec/renderer/integration/store/TimelineSpace/Modals/ImageViewer.spec.ts
deleted file mode 100644
index c15dfe8b..00000000
--- a/spec/renderer/integration/store/TimelineSpace/Modals/ImageViewer.spec.ts
+++ /dev/null
@@ -1,219 +0,0 @@
-import { RootState } from '@/store'
-import { createStore, Store } from 'vuex'
-import ImageViewer, { ImageViewerState } from '~/src/renderer/store/TimelineSpace/Modals/ImageViewer'
-
-const state = (): ImageViewerState => {
- return {
- modalOpen: false,
- currentIndex: -1,
- mediaList: [],
- loading: false
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: ImageViewer.actions,
- mutations: ImageViewer.mutations,
- getters: ImageViewer.getters
- }
-}
-
-const modalsStore = () => ({
- namespaced: true,
- modules: {
- ImageViewer: initStore()
- }
-})
-
-const timelineStore = () => ({
- namespaced: true,
- modules: {
- Modals: modalsStore()
- }
-})
-
-describe('ImageViewer', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- TimelineSpace: timelineStore()
- }
- })
- })
-
- // Actions
- describe('openModal', () => {
- it('should be changed', () => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 1,
- mediaList: ['media1', 'media2']
- })
- expect(store.state.TimelineSpace.Modals.ImageViewer.modalOpen).toEqual(true)
- expect(store.state.TimelineSpace.Modals.ImageViewer.currentIndex).toEqual(1)
- expect(store.state.TimelineSpace.Modals.ImageViewer.mediaList).toEqual(['media1', 'media2'])
- expect(store.state.TimelineSpace.Modals.ImageViewer.loading).toEqual(true)
- })
- })
-
- describe('closeModal', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 1,
- mediaList: ['media1', 'media2']
- })
- })
- it('should be changed', () => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/closeModal')
- expect(store.state.TimelineSpace.Modals.ImageViewer.modalOpen).toEqual(false)
- expect(store.state.TimelineSpace.Modals.ImageViewer.currentIndex).toEqual(-1)
- expect(store.state.TimelineSpace.Modals.ImageViewer.mediaList).toEqual([])
- expect(store.state.TimelineSpace.Modals.ImageViewer.loading).toEqual(false)
- })
- })
-
- describe('incrementIndex', () => {
- it('should be changed', () => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/incrementIndex')
- expect(store.state.TimelineSpace.Modals.ImageViewer.currentIndex).toEqual(0)
- expect(store.state.TimelineSpace.Modals.ImageViewer.loading).toEqual(true)
- })
- })
-
- describe('decrementIndex', () => {
- it('should be changed', () => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/decrementIndex')
- expect(store.state.TimelineSpace.Modals.ImageViewer.currentIndex).toEqual(-2)
- expect(store.state.TimelineSpace.Modals.ImageViewer.loading).toEqual(true)
- })
- })
-
- // Getters
- describe('imageURL', () => {
- describe('currentIndex exists', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 0,
- mediaList: [
- {
- url: 'http://joinmastodon.org'
- },
- {
- url: 'https://docs-develop.pleroma.social'
- }
- ]
- })
- })
- it('should return url', () => {
- const url = store.getters['TimelineSpace/Modals/ImageViewer/imageURL']
- expect(url).toEqual('http://joinmastodon.org')
- })
- })
- })
-
- describe('imageType', () => {
- describe('currentIndex exists', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 0,
- mediaList: [
- {
- type: 'image/png'
- },
- {
- type: 'image/jpg'
- }
- ]
- })
- })
- it('should return type', () => {
- const type = store.getters['TimelineSpace/Modals/ImageViewer/imageType']
- expect(type).toEqual('image/png')
- })
- })
- })
-
- describe('showLeft', () => {
- describe('currentIndex > 0', () => {
- describe('mediaList > 1', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 1,
- mediaList: [
- {
- type: 'image/png'
- },
- {
- type: 'image/jpg'
- }
- ]
- })
- })
- it('should return true', () => {
- const left = store.getters['TimelineSpace/Modals/ImageViewer/showLeft']
- expect(left).toEqual(true)
- })
- })
- describe('mediaList < 1', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 0,
- mediaList: [
- {
- type: 'image/png'
- }
- ]
- })
- })
- it('should not return true', () => {
- const left = store.getters['TimelineSpace/Modals/ImageViewer/showLeft']
- expect(left).toEqual(false)
- })
- })
- })
- })
-
- describe('showRight', () => {
- describe('current index is lower than media list length', () => {
- describe('media list length > 1', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 0,
- mediaList: [
- {
- type: 'image/png'
- },
- {
- type: 'image/jpeg'
- }
- ]
- })
- })
- it('should return true', () => {
- const right = store.getters['TimelineSpace/Modals/ImageViewer/showRight']
- expect(right).toEqual(true)
- })
- })
- describe('media list length <= 1', () => {
- beforeEach(() => {
- store.dispatch('TimelineSpace/Modals/ImageViewer/openModal', {
- currentIndex: 0,
- mediaList: [
- {
- type: 'image/png'
- }
- ]
- })
- })
- it('should not return true', () => {
- const right = store.getters['TimelineSpace/Modals/ImageViewer/showRight']
- expect(right).toEqual(false)
- })
- })
- })
- })
-})
diff --git a/spec/renderer/integration/store/TimelineSpace/Modals/Jump.spec.ts b/spec/renderer/integration/store/TimelineSpace/Modals/Jump.spec.ts
deleted file mode 100644
index 6f4aa9ae..00000000
--- a/spec/renderer/integration/store/TimelineSpace/Modals/Jump.spec.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { createStore, Store } from 'vuex'
-import i18n from '~/src/config/i18n'
-import router from '@/router'
-import Jump, { JumpState, Channel } from '~/src/renderer/store/TimelineSpace/Modals/Jump'
-import { RootState } from '@/store'
-
-const state = (): JumpState => {
- return {
- modalOpen: true,
- channel: '',
- defaultChannelList: [
- {
- name: i18n.t('side_menu.home'),
- path: 'home'
- },
- {
- name: i18n.t('side_menu.notification'),
- path: 'notifications'
- },
- {
- name: i18n.t('side_menu.favourite'),
- path: 'favourites'
- },
- {
- name: i18n.t('side_menu.local'),
- path: 'local'
- },
- {
- name: i18n.t('side_menu.public'),
- path: 'public'
- },
- {
- name: i18n.t('side_menu.hashtag'),
- path: 'hashtag'
- },
- {
- name: i18n.t('side_menu.search'),
- path: 'search'
- },
- {
- name: i18n.t('side_menu.direct'),
- path: 'direct-messages'
- }
- ],
- selectedChannel: {
- name: i18n.t('side_menu.home'),
- path: 'home'
- }
- }
-}
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: Jump.actions,
- mutations: Jump.mutations
- }
-}
-
-const modalsStore = () => ({
- namespaced: true,
- modules: {
- Jump: initStore()
- }
-})
-
-const timelineStore = () => ({
- namespaced: true,
- state: {
- account: {
- id: 0
- }
- },
- modules: {
- Modals: modalsStore()
- }
-})
-
-describe('Jump', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- TimelineSpace: timelineStore()
- }
- })
- })
-
- describe('jumpCurrentSelected', () => {
- it('should be changed', () => {
- store.dispatch('TimelineSpace/Modals/Jump/jumpCurrentSelected')
- expect(store.state.TimelineSpace.Modals.Jump.modalOpen).toEqual(false)
- expect(router.push).toHaveBeenCalledWith({ path: '/0/home' })
- })
- })
-
- describe('jump', () => {
- it('should be changed', () => {
- const channel: Channel = {
- name: 'public',
- path: 'public'
- }
- store.dispatch('TimelineSpace/Modals/Jump/jump', channel)
- expect(store.state.TimelineSpace.Modals.Jump.modalOpen).toEqual(false)
- expect(router.push).toHaveBeenCalledWith({ path: '/0/public' })
- })
- })
-})
diff --git a/spec/renderer/integration/store/TimelineSpace/Modals/ListMembership.spec.ts b/spec/renderer/integration/store/TimelineSpace/Modals/ListMembership.spec.ts
deleted file mode 100644
index 43477346..00000000
--- a/spec/renderer/integration/store/TimelineSpace/Modals/ListMembership.spec.ts
+++ /dev/null
@@ -1,204 +0,0 @@
-import { Response, Entity } from 'megalodon'
-import { createStore, Store } from 'vuex'
-import ListMembership, { ListMembershipState } from '@/store/TimelineSpace/Modals/ListMembership'
-import { RootState } from '@/store'
-
-const mockClient = {
- getAccountLists: () => {
- return new Promise>(resolve => {
- const res: Response = {
- data: [list1, list2],
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- },
- getLists: () => {
- return new Promise>(resolve => {
- const res: Response = {
- data: [list1, list2],
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- },
- deleteAccountsFromList: (id: string, account_ids: Array) => {
- if (id === list3.id && account_ids[0]) {
- return new Promise(resolve => {
- const res: Response = {
- data: {},
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- } else {
- return Promise.reject(new Error('list id or account id is not match'))
- }
- },
- addAccountsToList: (id: string, account_ids: Array) => {
- if (id === list1.id && account_ids[0] === account.id) {
- return new Promise(resolve => {
- const res: Response = {
- data: {},
- status: 200,
- statusText: 'OK',
- headers: {}
- }
- resolve(res)
- })
- } else {
- return Promise.reject(new Error('list id or account id is not match'))
- }
- }
-}
-
-jest.mock('megalodon', () => ({
- ...jest.requireActual('megalodon'),
- default: jest.fn(() => mockClient),
- __esModule: true
-}))
-
-const account: Entity.Account = {
- id: '1',
- username: 'h3poteto',
- acct: 'h3poteto@pleroma.io',
- display_name: 'h3poteto',
- locked: false,
- group: false,
- created_at: '2019-03-26T21:30:32',
- followers_count: 10,
- following_count: 10,
- statuses_count: 100,
- note: 'engineer',
- url: 'https://pleroma.io',
- avatar: '',
- avatar_static: '',
- header: '',
- header_static: '',
- emojis: [],
- moved: null,
- fields: [],
- bot: false,
- noindex: null,
- suspended: null,
- limited: null
-}
-
-const list1: Entity.List = {
- id: '1',
- title: 'list1',
- replies_policy: null
-}
-
-const list2: Entity.List = {
- id: '2',
- title: 'list2',
- replies_policy: null
-}
-
-const list3: Entity.List = {
- id: '3',
- title: 'list3',
- replies_policy: null
-}
-
-let state = (): ListMembershipState => {
- return {
- modalOpen: false,
- account: null,
- lists: [],
- belongToLists: []
- }
-}
-
-const initStore = () => {
- return {
- namespaced: true,
- state: state(),
- actions: ListMembership.actions,
- mutations: ListMembership.mutations
- }
-}
-
-const modalsStore = () => ({
- namespaced: true,
- modules: {
- ListMembership: initStore()
- }
-})
-
-const timelineStore = () => ({
- namespaced: true,
- state: {
- account: {
- id: 0,
- accessToken: 'token'
- },
- server: {
- sns: 'mastodon',
- baseURL: 'http://localhost'
- }
- },
- modules: {
- Modals: modalsStore()
- }
-})
-
-const appState = {
- namespaced: true,
- state: {
- proxyConfiguration: false
- }
-}
-
-describe('ListMembership', () => {
- let store: Store
-
- beforeEach(() => {
- store = createStore({
- modules: {
- TimelineSpace: timelineStore(),
- App: appState
- }
- })
- })
-
- describe('fetchListMembership', () => {
- it('should get', async () => {
- await store.dispatch('TimelineSpace/Modals/ListMembership/fetchListMembership', {
- id: '5'
- })
- expect(store.state.TimelineSpace.Modals.ListMembership.belongToLists).toEqual([list1, list2])
- })
- })
-
- describe('fetchLists', () => {
- it('should be changed', async () => {
- await store.dispatch('TimelineSpace/Modals/ListMembership/fetchLists')
- expect(store.state.TimelineSpace.Modals.ListMembership.lists).toEqual([list1, list2])
- })
- })
-
- describe('changeBelongToLists', () => {
- beforeAll(() => {
- state = () => {
- return {
- modalOpen: false,
- account: account,
- lists: [],
- belongToLists: [list2, list3]
- }
- }
- })
- it('should be changed', async () => {
- await store.dispatch('TimelineSpace/Modals/ListMembership/changeBelongToLists', [list1.id, list2.id])
- expect(store.state.TimelineSpace.Modals.ListMembership.belongToLists).toEqual([list1, list2])
- })
- })
-})
diff --git a/spec/renderer/unit/store/TimelineSpace.spec.ts b/spec/renderer/unit/store/TimelineSpace.spec.ts
deleted file mode 100644
index f73ce71f..00000000
--- a/spec/renderer/unit/store/TimelineSpace.spec.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import TimelineSpace, { TimelineSpaceState, MUTATION_TYPES } from '~/src/renderer/store/TimelineSpace'
-import { DefaultSetting } from '~/src/constants/initializer/setting'
-
-describe('TimelineSpace', () => {
- describe('mutations', () => {
- let state: TimelineSpaceState
- beforeEach(() => {
- state = {
- account: null,
- server: null,
- loading: false,
- emojis: [],
- tootMax: 500,
- setting: DefaultSetting,
- filters: []
- }
- })
-
- describe('updateTootMax', () => {
- describe('value is null', () => {
- it('should be updated with 500', () => {
- TimelineSpace.mutations![MUTATION_TYPES.UPDATE_TOOT_MAX](state, null)
- expect(state.tootMax).toEqual(500)
- })
- })
- describe('value is not null', () => {
- it('should be updated', () => {
- TimelineSpace.mutations![MUTATION_TYPES.UPDATE_TOOT_MAX](state, 1200)
- expect(state.tootMax).toEqual(1200)
- })
- })
- })
- })
-})
diff --git a/spec/renderer/unit/store/TimelineSpace/HeaderMenu.spec.ts b/spec/renderer/unit/store/TimelineSpace/HeaderMenu.spec.ts
deleted file mode 100644
index caed8457..00000000
--- a/spec/renderer/unit/store/TimelineSpace/HeaderMenu.spec.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import HeaderMenu, { HeaderMenuState, MUTATION_TYPES } from '@/store/TimelineSpace/HeaderMenu'
-
-describe('TimelineSpace/HeaderMenu', () => {
- describe('mutations', () => {
- let state: HeaderMenuState
- beforeEach(() => {
- state = {
- title: 'Home',
- reload: false,
- loading: false
- }
- })
- describe('changeReload', () => {
- it('should be changed', () => {
- HeaderMenu.mutations![MUTATION_TYPES.CHANGE_RELOAD](state, true)
- expect(state.reload).toEqual(true)
- })
- })
- })
-})
diff --git a/spec/renderer/unit/utils/emojify.spec.ts b/spec/renderer/unit/utils/emojify.spec.ts
deleted file mode 100644
index 96da3591..00000000
--- a/spec/renderer/unit/utils/emojify.spec.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import emojify from '@/utils/emojify'
-
-describe('emojify', () => {
- const emoji = [
- {
- shortcode: 'python',
- static_url: 'https://example.com/python',
- url: 'https://example.com/python',
- visible_in_picker: true,
- category: ''
- },
- {
- shortcode: 'nodejs',
- static_url: 'https://example.com/nodejs',
- url: 'https://example.com/nodejs',
- visible_in_picker: true,
- category: ''
- },
- {
- shortcode: 'slack',
- static_url: 'https://example.com/slack',
- url: 'https://example.com/slack',
- visible_in_picker: true,
- category: ''
- }
- ]
- describe('Does not contain shortcode', () => {
- const str = 'I have a pen.'
- it('should not change', () => {
- const result = emojify(str, emoji)
- expect(result).toEqual(str)
- })
- })
- describe('Contain a shortcode', () => {
- const str = 'I like :python:'
- it('should replace', () => {
- const result = emojify(str, emoji)
- expect(result).toEqual(
- 'I like '
- )
- })
- })
- describe('Contain some shortcodes', () => {
- const str = 'I like :python: , :nodejs: and :slack:'
- it('should replace', () => {
- const result = emojify(str, emoji)
- expect(result).toEqual(
- 'I like , and '
- )
- })
- })
- describe('Contain same shortcodes', () => {
- const str = 'I like :python: , I love :python:'
- it('should replace', () => {
- const result = emojify(str, emoji)
- expect(result).toEqual(
- 'I like , I love '
- )
- })
- })
-})
diff --git a/spec/renderer/unit/utils/filter.spec.ts b/spec/renderer/unit/utils/filter.spec.ts
deleted file mode 100644
index defdc326..00000000
--- a/spec/renderer/unit/utils/filter.spec.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import filtered from '@/utils/filter'
-import { Entity } from 'megalodon'
-
-describe('filter', () => {
- describe('whole word is enabled', () => {
- describe('Only asci', () => {
- const filters = [
- {
- id: '1',
- phrase: 'Fedi',
- context: ['home'],
- expires_at: null,
- irreversible: false,
- whole_word: true
- } as Entity.Filter
- ]
- it('should not be matched', () => {
- const status =
- 'Pleroma is social networking software compatible with other Fediverse software such as Mastodon, Misskey, Pixelfed and many others.'
- const res = filtered(status, filters)
- expect(res).toBeFalsy()
- })
- it('should be matched', () => {
- const status =
- 'Pleroma is social networking software compatible with other Fedi software such as Mastodon, Misskey, Pixelfed and many others.'
- const res = filtered(status, filters)
- expect(res).toBeTruthy()
- })
- })
- describe('With Japanese', () => {
- const filters = [
- {
- id: '1',
- phrase: 'ミニブログ',
- context: ['home'],
- expires_at: null,
- irreversible: false,
- whole_word: true
- } as Entity.Filter
- ]
- it('should be matched', () => {
- const status =
- 'マストドン (Mastodon) はミニブログサービスを提供するためのフリーソフトウェア、またはこれが提供する連合型のソーシャルネットワークサービスである'
- const res = filtered(status, filters)
- expect(res).toBeTruthy()
- })
- it('should not be matched', () => {
- const status =
- '「脱中央集権型」 (decentralized) のマストドンのサーバーはだれでも自由に運用する事が可能であり、利用者は通常このサーバーの一つを選んで所属するが、異なるサーバーに属する利用者間のコミュニケーションも容易である'
- const res = filtered(status, filters)
- expect(res).toBeFalsy()
- })
- })
- })
-
- describe('whole word is disabled', () => {
- describe('Only asci', () => {
- const filters = [
- {
- id: '1',
- phrase: 'Fedi',
- context: ['home'],
- expires_at: null,
- irreversible: false,
- whole_word: false
- } as Entity.Filter
- ]
- it('should be matched', () => {
- const status =
- 'Pleroma is social networking software compatible with other Fediverse software such as Mastodon, Misskey, Pixelfed and many others.'
- const res = filtered(status, filters)
- expect(res).toBeTruthy()
- })
- it('should be matched', () => {
- const status =
- 'Pleroma is social networking software compatible with other Fedi software such as Mastodon, Misskey, Pixelfed and many others.'
- const res = filtered(status, filters)
- expect(res).toBeTruthy()
- })
- })
- describe('With Japanese', () => {
- const filters = [
- {
- id: '1',
- phrase: 'ミニブログ',
- context: ['home'],
- expires_at: null,
- irreversible: false,
- whole_word: true
- } as Entity.Filter
- ]
- it('should be matched', () => {
- const status =
- 'マストドン (Mastodon) はミニブログサービスを提供するためのフリーソフトウェア、またはこれが提供する連合型のソーシャルネットワークサービスである'
- const res = filtered(status, filters)
- expect(res).toBeTruthy()
- })
- it('should not be matched', () => {
- const status =
- '「脱中央集権型」 (decentralized) のマストドンのサーバーはだれでも自由に運用する事が可能であり、利用者は通常このサーバーの一つを選んで所属するが、異なるサーバーに属する利用者間のコミュニケーションも容易である'
- const res = filtered(status, filters)
- expect(res).toBeFalsy()
- })
- })
- })
-})
diff --git a/spec/renderer/unit/utils/suggestText.spec.ts b/spec/renderer/unit/utils/suggestText.spec.ts
deleted file mode 100644
index 0918c174..00000000
--- a/spec/renderer/unit/utils/suggestText.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import suggestText from '@/utils/suggestText'
-
-describe('account', () => {
- describe('Only account name', () => {
- const str = '@h3pote'
- it('should match', () => {
- const [start, word] = suggestText(str, 7)
- expect(str).toEqual(word)
- expect(start).toEqual(1)
- })
- })
- describe('Beginning of the sentence', () => {
- const str = '@h3pote toot body'
- it('should match', () => {
- const [start, word] = suggestText(str, 7)
- expect(word).toEqual('@h3pote')
- expect(start).toEqual(1)
- })
- })
- describe('Halfway of the sentence', () => {
- const str = 'toot body @h3pote toot'
- it('should match', () => {
- const [start, word] = suggestText(str, 17)
- expect(word).toEqual('@h3pote')
- expect(start).toEqual(11)
- })
- })
- describe('End of the sentence', () => {
- const str = 'toot body @h3pote'
- it('should match', () => {
- const [start, word] = suggestText(str, 17)
- expect(word).toEqual('@h3pote')
- expect(start).toEqual(11)
- })
- })
- describe('No space', () => {
- const str = 'tootbody@h3pote'
- it('should not match', () => {
- const [start, word] = suggestText(str, 15)
- expect(word).toEqual(null)
- expect(start).toEqual(null)
- })
- })
-})
diff --git a/spec/renderer/unit/utils/tootParser.spec.ts b/spec/renderer/unit/utils/tootParser.spec.ts
deleted file mode 100644
index 5e6e49ee..00000000
--- a/spec/renderer/unit/utils/tootParser.spec.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { JSDOM } from 'jsdom'
-import { findLink, findTag, findAccount } from '@/utils/tootParser'
-
-describe('findLink', () => {
- describe('Pleroma', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
-
- const target = doc.getElementById('link')
- it('should find', () => {
- const res = findLink(target)
- expect(res).toEqual('https://github.com/h3poteto/whalebird-desktop/releases/tag/2.4.1')
- })
- })
-})
-
-describe('findTag', () => {
- describe('Pleroma', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('tag')
- it('should find', () => {
- expect(target).not.toBeNull()
- const res = findTag(target!)
- expect(res).toEqual('whalebird')
- })
- })
-
- describe('Mastodon', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('tag')
- it('should find', () => {
- expect(target).not.toBeNull()
- const res = findTag(target!)
- expect(res).toEqual('whalebird')
- })
- })
-})
-
-describe('findAccount', () => {
- describe('in Pleroma', () => {
- describe('from Mastodon', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('user')
- it('should find', () => {
- expect(target).not.toBeNull()
- const res = findAccount(target!)
- expect(res).not.toBeNull()
- expect(res!.username).toEqual('@h3_poteto')
- expect(res!.acct).toEqual('@h3_poteto@social.mikutter.hachune.net')
- })
- })
-
- describe('from Pleroma', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('user')
- it('should find', () => {
- expect(target).not.toBeNull()
- const res = findAccount(target!)
- expect(res).not.toBeNull()
- expect(res!.username).toEqual('@h3poteto')
- expect(res!.acct).toEqual('@h3poteto@pleroma.io')
- })
- })
-
- describe('toot link in Mastodon', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('status')
- it('should not find', () => {
- expect(target).not.toBeNull()
- const res = findAccount(target!)
- expect(res).toBeNull()
- })
- })
-
- describe('toot link in Pleroma', () => {
- const doc = new JSDOM(`
-
-
-`).window.document
- const target = doc.getElementById('status')
- it('should not find', () => {
- expect(target).not.toBeNull()
- const res = findAccount(target!)
- expect(res).toBeNull()
- })
- })
- })
-})
diff --git a/spec/renderer/unit/utils/validator.spec.ts b/spec/renderer/unit/utils/validator.spec.ts
deleted file mode 100644
index b01214f0..00000000
--- a/spec/renderer/unit/utils/validator.spec.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { domainFormat } from '@/utils/validator'
-
-describe('validator', () => {
- describe('domainFormat', () => {
- describe('single character domain name', () => {
- const domain = 'c.im'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string contains protocol', () => {
- const domain = 'https://mastodon.social'
- it('should not match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(-1)
- })
- })
- describe('string contains account name', () => {
- const domain = 'h3_poteto@mastodon.social'
- it('should not match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(-1)
- })
- })
- describe('string is gTLD domain', () => {
- const domain = 'mastodon.social'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string is subdomain', () => {
- const domain = 'music.mastodon.social'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string is subdomain', () => {
- const domain = 'social.tchncs.de'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string is jp domain', () => {
- const domain = 'mstdn.co.jp'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string contains hyphen', () => {
- const domain = 'music-mastodon.social'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- describe('string is short domain', () => {
- const domain = 'id.cc'
- it('should match', () => {
- const res = domain.search(domainFormat)
- expect(res).toEqual(0)
- })
- })
- })
-})
diff --git a/spec/setupJest.ts b/spec/setupJest.ts
deleted file mode 100644
index 53aeb4ed..00000000
--- a/spec/setupJest.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// This code is to resolve errors on tootParser.spec.
-// TextEncoder and TextDecoder are used in jsdom, but these object is defined in Browser js.
-import { TextEncoder, TextDecoder } from 'util'
-if (typeof global.TextEncoder === 'undefined') {
- global.TextEncoder = TextEncoder
-}
-
-if (typeof global.TextDecoder === 'undefined') {
- ;(global.TextDecoder as any) = TextDecoder
-}
diff --git a/src/config/i18n.ts b/src/config/i18n.ts
deleted file mode 100644
index c2b33301..00000000
--- a/src/config/i18n.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import i18next, { InitOptions } from 'i18next'
-import cs from '~/src/config/locales/cs/translation.json'
-import de from '~/src/config/locales/de/translation.json'
-import en from '~/src/config/locales/en/translation.json'
-import eu from '~/src/config/locales/eu/translation.json'
-import es_es from '~/src/config/locales/es_es/translation.json'
-import fa from '~/src/config/locales/fa/translation.json'
-import fr from '~/src/config/locales/fr/translation.json'
-import gd from '~/src/config/locales/gd/translation.json'
-import id from '~/src/config/locales/id/translation.json'
-import hu from '~/src/config/locales/hu/translation.json'
-import it from '~/src/config/locales/it/translation.json'
-import is from '~/src/config/locales/is/translation.json'
-import ja from '~/src/config/locales/ja/translation.json'
-import ko from '~/src/config/locales/ko/translation.json'
-import no from '~/src/config/locales/no/translation.json'
-import pl from '~/src/config/locales/pl/translation.json'
-import pt_pt from '~/src/config/locales/pt_pt/translation.json'
-import ru from '~/src/config/locales/ru/translation.json'
-import sv_se from '~/src/config/locales/sv_se/translation.json'
-import si from '~/src/config/locales/si/translation.json'
-import tzm from '~/src/config/locales/tzm/translation.json'
-import zh_cn from '~/src/config/locales/zh_cn/translation.json'
-import zh_tw from '~/src/config/locales/zh_tw/translation.json'
-
-const options: InitOptions = {
- initImmediate: false,
- lng: 'en',
- fallbackLng: 'en',
- saveMissing: true,
- resources: {
- cs: {
- translation: cs
- },
- de: {
- translation: de
- },
- en: {
- translation: en
- },
- eu: {
- translation: eu
- },
- es_es: {
- translation: es_es
- },
- fa: {
- translation: fa
- },
- fr: {
- translation: fr
- },
- gd: {
- translation: gd
- },
- hu: {
- translation: hu
- },
- id: {
- translation: id
- },
- it: {
- translation: it
- },
- is: {
- translation: is
- },
- ja: {
- translation: ja
- },
- ko: {
- translation: ko
- },
- no: {
- translation: no
- },
- pl: {
- translation: pl
- },
- pt_pt: {
- translation: pt_pt
- },
- ru: {
- translation: ru
- },
- si: {
- translation: si
- },
- sv_se: {
- translation: sv_se
- },
- tzm: {
- translation: tzm
- },
- zh_cn: {
- translation: zh_cn
- },
- zh_tw: {
- translation: zh_tw
- }
- }
-}
-
-i18next.init(options)
-
-export default i18next
diff --git a/src/config/locales/cs/translation.json b/src/config/locales/cs/translation.json
deleted file mode 100644
index 143cc8ba..00000000
--- a/src/config/locales/cs/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Ukončit"
- },
- "edit": {
- "name": "Upravit",
- "undo": "Vrátit zpět",
- "redo": "Vykonat znovu",
- "cut": "Vyjmout",
- "copy": "Kopírovat",
- "paste": "Vložit",
- "select_all": "Vybrat vše"
- },
- "view": {
- "name": "Zobrazit",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Okno",
- "close": "Zavřít okno",
- "open": "Otevřít okno",
- "minimize": "Minimalizovat",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Zobrazit profil",
- "edit_profile": "Upravit profil",
- "settings": "Account settings",
- "collapse": "Sbalit",
- "expand": "Rozbalit",
- "home": "Domů",
- "notification": "Notifications",
- "direct": "Soukromé zprávy",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Místní časová osa",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Vyhledat",
- "lists": "Seznamy"
- },
- "header_menu": {
- "home": "Domů",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Nikdy",
- "30_minutes": "30 minut",
- "1_hour": "1 hodina",
- "6_hours": "6 hodin",
- "12_hours": "12 hodin",
- "1_day": "1 den",
- "1_week": "1 týden"
- },
- "new": {
- "title": "Nový"
- },
- "edit": {
- "title": "Upravit"
- },
- "delete": {
- "title": "Vymazat",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Vymazat",
- "confirm_cancel": "Zrušit"
- }
- }
- },
- "preferences": {
- "title": "Předvolby",
- "general": {
- "title": "Všeobecné",
- "sounds": {
- "title": "Zvuky",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Časová osa",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Ostatní možnosti",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Obnovit výchozí nastavení"
- }
- },
- "appearance": {
- "title": "Vzhled",
- "theme_color": "Colour themes",
- "theme": {
- "system": "Systémový",
- "light": "Světlý",
- "dark": "Tmavý",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Okraj",
- "header_menu_color": "Záhlavní menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Velikost písma",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Potvrdit",
- "cancel": "Zrušit",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Síť",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protokol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Kontrola pravopisu",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Přejít na..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Název účtu"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Zrušit",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Ukázat více",
- "hide": "Skrýt",
- "sensitive": "Zobrazit citlivý obsah",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Ignorovat",
- "block": "Blokovat",
- "report": "Nahlásit",
- "delete": "Smazat",
- "via": "přes {{application}}",
- "reply": "Odpovědět",
- "reblog": "Boost",
- "fav": "Oblíbit",
- "detail": "Post details",
- "bookmark": "Záložka",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Hlasovat",
- "votes_count": "hlasů",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Obnovit"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Následuje vás",
- "doesnt_follow_you": "Nesleduje vás",
- "detail": "Podrobnosti",
- "follow": "Sledujte tohoto uživatele",
- "unfollow": "Přestat sledovat tohoto uživatele",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Ignorovat",
- "unmute": "Unmute",
- "unblock": "Odblokovat",
- "block": "Blokovat",
- "toots": "Posts",
- "follows": "Sledovaní",
- "followers": "Sledující"
- }
- },
- "follow_requests": {
- "accept": "Přijmout",
- "reject": "Odmítnout"
- },
- "hashtag": {
- "tag_name": "Název štítku",
- "delete_tag": "Smazat štítek",
- "save_tag": "Uložit štítek"
- },
- "search": {
- "search": "Vyhledat",
- "account": "Účet",
- "tag": "Štítek",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Nový seznam",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/de/translation.json b/src/config/locales/de/translation.json
deleted file mode 100644
index f5d3ffef..00000000
--- a/src/config/locales/de/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Über Whalebird",
- "preferences": "Einstellungen",
- "shortcuts": "Tastenkürzel",
- "services": "Dienste",
- "hide": "Whalebird ausblenden",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Beenden"
- },
- "edit": {
- "name": "Bearbeiten",
- "undo": "Rückgängig",
- "redo": "Wiederholen",
- "cut": "Ausschneiden",
- "copy": "Kopieren",
- "paste": "Einfügen",
- "select_all": "Alles Auswählen"
- },
- "view": {
- "name": "Ansicht",
- "toggle_full_screen": "Vollbildmodus umschalten"
- },
- "window": {
- "always_show_menu_bar": "Menüleiste immer anzeigen",
- "name": "Fenster",
- "close": "Fenster schließen",
- "open": "Fenster öffnen",
- "minimize": "Minimieren",
- "jump_to": "Gehe zu"
- },
- "help": {
- "name": "Hilfe",
- "thirdparty": "Drittanbieter-Lizenzen"
- }
- },
- "global_header": {
- "add_new_account": "Neues Konto hinzufügen"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Profil ansehen",
- "edit_profile": "Profil bearbeiten",
- "settings": "Kontoeinstellungen",
- "collapse": "Einklappen",
- "expand": "Ausklappen",
- "home": "Start",
- "notification": "Mitteilungen",
- "direct": "Direktnachrichten",
- "follow_requests": "Follower-Anfragen",
- "favourite": "Favoriten",
- "bookmark": "Lesezeichen",
- "local": "Lokale Timeline",
- "public": "Föderierte Timeline",
- "hashtag": "Hashtags",
- "search": "Suche",
- "lists": "Listen"
- },
- "header_menu": {
- "home": "Start",
- "notification": "Mitteilungen",
- "favourite": "Favoriten",
- "bookmark": "Lesezeichen",
- "follow_requests": "Follow-Anfragen",
- "direct_messages": "Direktnachrichten",
- "local": "Lokale Timeline",
- "public": "Föderierte Timeline",
- "hashtag": "Hashtags",
- "search": "Suche",
- "lists": "Listen",
- "members": "Mitglieder",
- "reload": "Neu laden"
- },
- "settings": {
- "title": "Einstellungen",
- "general": {
- "title": "Allgemein",
- "toot": {
- "title": "Beiträge",
- "visibility": {
- "description": "Standard Post-Sichtbarkeit",
- "notice": "Diese Einstellung gilt nur für neue Beiträge; für Antworten gelten die Sichtbarkeitseinstellungen des übergeordneten Beitrags.",
- "public": "Öffenlich",
- "unlisted": "Nicht gelistet",
- "private": "Privat",
- "direct": "Direkt"
- },
- "sensitive": {
- "description": "Medien standardmäßig als sensibel markieren"
- }
- }
- },
- "timeline": {
- "title": "Zeitleiste",
- "use_marker": {
- "title": "Lade die Zeitleiste von der letzten Lese-Position",
- "home": "Start",
- "notifications": "Benachrichtigungen"
- }
- },
- "filters": {
- "title": "Filter",
- "form": {
- "phrase": "Schlagwort oder Phrase",
- "expire": "Verfällt nach",
- "context": "Kontext filtern",
- "irreversible": "Entfernen anstatt zu verstecken",
- "whole_word": "Ganzes Wort",
- "submit": "Absenden",
- "cancel": "Abbrechen"
- },
- "expires": {
- "never": "Niemals",
- "30_minutes": "30 Minuten",
- "1_hour": "1 Stunde",
- "6_hours": "6 Stunde",
- "12_hours": "12 Stunde",
- "1_day": "1 Tag",
- "1_week": "1 Woche"
- },
- "new": {
- "title": "Neu"
- },
- "edit": {
- "title": "Bearbeiten"
- },
- "delete": {
- "title": "Löschen",
- "confirm": "Sind Sie sicher, dass Sie diesen Filter löschen möchten?",
- "confirm_ok": "Löschen",
- "confirm_cancel": "Abbrechen"
- }
- }
- },
- "preferences": {
- "title": "Einstellungen",
- "general": {
- "title": "Allgemein",
- "sounds": {
- "title": "Klänge",
- "description": "Klänge abspielen, wenn",
- "fav_rb": "Du einen Beitrag favorisierst oder boostest",
- "toot": "Du einen Beitrag postest"
- },
- "timeline": {
- "title": "Zeitleiste",
- "description": "Passe an, wie Deine Timelines angezeigt werden",
- "cw": "Beiträge mit Inhaltswarnungen immer ausklappen.",
- "nsfw": "Medien immer anzeigen.",
- "hideAllAttachments": "Medien immer verstecken."
- },
- "other": {
- "title": "Andere Optionen",
- "launch": "Whalebird beim Systemstart ausführen",
- "hideOnLaunch": "Whalebird-Fenster beim Start verstecken"
- },
- "reset": {
- "button": "Einstellungen zurücksetzen"
- }
- },
- "appearance": {
- "title": "Anzeige",
- "theme_color": "Farbschemata",
- "theme": {
- "system": "System",
- "light": "Hell",
- "dark": "Dunkel",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDunkel",
- "kimbie_dark": "KimbieDark",
- "custom": "Angepasst"
- },
- "custom_theme": {
- "background_color": "Basis-Hintergrund",
- "selected_background_color": "Fokussierter Hintergrund",
- "global_header_color": "Konto-Menü",
- "side_menu_color": "Seitenmenü",
- "primary_color": "Primäre Schriftart",
- "regular_color": "Normale Schriftart",
- "secondary_color": "Sekundäre Schriftart",
- "border_color": "Rand",
- "header_menu_color": "Kopfzeilen-Menü",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Schriftgröße",
- "font_family": "Schriftfamilie",
- "toot_padding": "Abstand zwischen den Posts",
- "display_style": {
- "title": "Benutzernamen Darstellung",
- "display_name_and_username": "Anzeige- und Benutzername",
- "display_name": "Angezeigter Name",
- "username": "Benutzername"
- },
- "time_format": {
- "title": "Zeitformat",
- "absolute": "Absolut",
- "relative": "Relativ"
- }
- },
- "notification": {
- "title": "Mitteilungen",
- "enable": {
- "description": "Benachrichtigen bei…",
- "reply": "Antworten",
- "reblog": "Boosts",
- "favourite": "Favoriten",
- "follow": "neuen Followern",
- "reaction": "Emoji-Reaktionen",
- "follow_request": "Follower-Anfragen",
- "status": "Statusmeldungen",
- "poll_vote": "Umfrage-Stimmen",
- "poll_expired": "wenn eine Umfrage abläuft"
- }
- },
- "account": {
- "title": "Benutzerkonto",
- "connected": "Verknüpfte Konten",
- "username": "Benutzername",
- "domain": "Domain",
- "association": "Verbindung",
- "order": "Reihenfolge",
- "remove_association": "Verbindung trennen",
- "remove_all_associations": "Alle Verbindungen trennen",
- "confirm": "Bestätigen",
- "cancel": "Abbrechen",
- "confirm_message": "Möchtest du wirklich alle Verbindungen trennen?"
- },
- "network": {
- "title": "Netzwerk",
- "proxy": {
- "title": "Proxy-Konfiguration",
- "no": "Kein Proxy",
- "system": "Systemproxy verwenden",
- "manual": "Manuelle Proxy-Konfiguration",
- "protocol": "Protokoll",
- "host": "Proxy-Server",
- "port": "Proxy-Port",
- "username": "Proxy-Benutzername",
- "password": "Proxy-Passwort",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "Socks4a",
- "socks5": "Socks5",
- "socks5h": "Socks5h"
- }
- },
- "save": "Speichern"
- },
- "language": {
- "title": "Sprache",
- "language": {
- "title": "Sprache",
- "description": "Wählen Sie die Sprache, die Sie mit Whalebird verwenden möchten."
- },
- "spellchecker": {
- "title": "Rechtschreibprüfung",
- "enabled": "Rechtschreibprüfung aktivieren"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Springe zu..."
- },
- "add_list_member": {
- "title": "Mitglied zur Liste hinzufügen",
- "account_name": "Kontoname"
- },
- "list_membership": {
- "title": "Mitgliedschaften auflisten"
- },
- "mute_confirm": {
- "title": "Nutzer stummschalten",
- "body": "Bist du sicher, dass du die Benachrichtigungen dieses Benutzers stummschalten möchtest?",
- "cancel": "Abbrechen",
- "ok": "Stummschalten"
- },
- "shortcut": {
- "title": "Tastenkürzel",
- "ctrl_number": "Wechsel zu einem anderen Konto",
- "ctrl_k": "Zu anderen Zeitleisten springen",
- "ctrl_enter": "Post absenden",
- "ctrl_r": "aktuelle Timeline aktualisieren",
- "j": "Nächsten Beitrag auswählen",
- "k": "Vorherigen Beitrag auswählen",
- "r": "Auf den ausgewählten Beitrag antworten",
- "b": "Den ausgewählten Beitrag teilen",
- "f": "Ausgewählten Beitrag favorisieren",
- "o": "Details des ausgewählten Beitrags anzeigen",
- "p": "Profil des Autors des ausgewählten Beitrages anzeigen",
- "i": "Die Bilder des ausgewählten Beitrags öffnen",
- "x": "Ein-/Ausblenden eines Beitrags mit Inhaltswarnung",
- "?": "Diesen Dialog anzeigen",
- "esc": "Aktuelle Seite schließen"
- },
- "report": {
- "title": "Benutzer melden",
- "comment": "Warum soll geblockt werden?",
- "cancel": "Abbrechen",
- "ok": "Senden"
- },
- "thirdparty": {
- "title": "Drittanbieter-Lizenzen"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Mehr anzeigen",
- "hide": "Verbergen",
- "sensitive": "Sensible inhalte anzeigen",
- "view_toot_detail": "Post-Details anzeigen",
- "open_in_browser": "Im Browser öffnen",
- "copy_link_to_toot": "Link zum Post kopieren",
- "mute": "Stummschalten",
- "block": "Blockieren",
- "report": "Melden",
- "delete": "Löschen",
- "via": "über {{application}}",
- "reply": "Antworten",
- "reblog": "Boost",
- "fav": "Favorit",
- "detail": "Mehr",
- "bookmark": "Lesezeichen",
- "pinned": "Angehefteter Beitrag",
- "poll": {
- "vote": "Abstimmen",
- "votes_count": "Abstimmungen",
- "until": "bis {{datetime}}",
- "left": "{{datetime}} verstrichen",
- "refresh": "Aktualisieren"
- },
- "open_account": {
- "title": "Account nicht gefunden",
- "text": "{{account}} konnte nicht auf dem Server gefunden werden. Möchten Sie das Konto stattdessen in einem Browser öffnen?",
- "ok": "Öffnen",
- "cancel": "Abbrechen"
- }
- },
- "status_loading": {
- "message": "Mehr Status laden"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Folgt dir",
- "doesnt_follow_you": "Folgt dir nicht",
- "detail": "Details",
- "follow": "Diesem Benutzer folgen",
- "unfollow": "Diesem Benutzer nicht mehr folgen",
- "subscribe": "Diesen Benutzer abonnieren",
- "unsubscribe": "Diesen Benutzer abbestellen",
- "follow_requested": "Follower Anfrage gestellt",
- "open_in_browser": "Im Browser öffnen",
- "manage_list_memberships": "Listenmitgliedschaften verwalten",
- "mute": "Stummschalten",
- "unmute": "Stummschaltung aufheben",
- "unblock": "Freigeben",
- "block": "Blocken",
- "toots": "Posts",
- "follows": "Folgt",
- "followers": "Folgende"
- }
- },
- "follow_requests": {
- "accept": "Annehmen",
- "reject": "Ablehnen"
- },
- "hashtag": {
- "tag_name": "Tag-Name",
- "delete_tag": "Tag löschen",
- "save_tag": "Tag speichern"
- },
- "search": {
- "search": "Suchen",
- "account": "Benutzerkonto",
- "tag": "Hashtag",
- "keyword": "Schlüsselwort",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Neue Liste",
- "edit": "Bearbeiten",
- "delete": {
- "confirm": {
- "title": "Bestätigen",
- "message": "Diese Liste wird dauerhaft gelöscht. Sind Sie sicher, dass Sie fortfahren möchten?",
- "ok": "Löschen",
- "cancel": "Abbrechen"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Willkommen bei Whalebird! Geben Sie einen Server-Domain-Namen ein, um sich bei einem Konto einzuloggen.",
- "proxy_info": "Wenn Sie einen Proxy-Server verwenden möchten, richten Sie ihn bitte ein",
- "proxy_here": " hier",
- "search": "Suche",
- "login": "Anmelden"
- },
- "authorize": {
- "manually_1": "Jetzt wird die Zugriffsseite in deinem Browser geöffnet.",
- "manually_2": "Falls nicht, öffne bitte die folgende URL von Hand:",
- "code_label": "Gib den Autorisierungscode ein:",
- "misskey_label": "Bitte senden Sie das Formular ab, nachdem Sie sich in Ihrem Browser autorisiert haben.",
- "submit": "Absenden"
- },
- "receive_drop": {
- "drop_message": "Hierher ziehen, um eine Datei anzuhängen"
- },
- "message": {
- "account_load_error": "Konten konnten nicht geladen werden",
- "account_remove_error": "Das Konto konnte nicht entfernt werden.",
- "preferences_load_error": "Einstellungen konnten nicht geladen werden",
- "timeline_fetch_error": "Timeline konnte nicht abgerufen werden",
- "notification_fetch_error": "Benachrichtigung konnte nicht abgerufen werden",
- "favourite_fetch_error": "Favorit konnte nicht abgerufen werden",
- "bookmark_fetch_error": "Lesezeichen konnten nicht abgerufen werden",
- "follow_request_accept_error": "Anfrage konnte nicht angenommen werden",
- "follow_request_reject_error": "Ablehnung der geteilten Anfrage fehlgeschlagen",
- "attach_error": "Kontte Datei nicht anhängen",
- "authorize_duplicate_error": "Kann nicht das gleiche Konto der gleichen Domain einloggen",
- "authorize_error": "Autorisierung fehlgeschlagen",
- "followers_fetch_error": "Follower konnten nicht abgerufen werden",
- "follows_fetch_error": "Follows konnten nicht abgerufen werden",
- "toot_fetch_error": "Laden der Beitragsdetails fehlgeschlagen",
- "follow_error": "Konnte dem Benutzer nicht folgen",
- "unfollow_error": "Konnte das Folgen des Benutzer nicht beenden",
- "subscribe_error": "Abonnierung von %s fehlgeschlagen",
- "unsubscribe_error": "Abmeldung von %s fehlgeschlagen",
- "lists_fetch_error": "Konte Listen nicht abrufen",
- "list_create_error": "Konnte keine Liste erstellen",
- "members_fetch_error": "Konnte Mitglieder nicht abrufen",
- "remove_user_error": "Entfernen des Benutzers fehlgeschlagen",
- "find_account_error": "Konto nicht gefunden",
- "reblog_error": "Boost fehlgeschlagen",
- "unreblog_error": "Ent-Boosten fehlgeschlagen",
- "favourite_error": "Favorisieren fehlgeschlagen",
- "unfavourite_error": "Widerruf des Favorisierens fehlgeschlagen",
- "bookmark_error": "Hinzufügen des Lesezeichens fehlgeschlagen",
- "unbookmark_error": "Löschen des Lesezeichens fehlgeschlagen",
- "delete_error": "Löschen des Beitrags fehlgeschlagen",
- "search_error": "Suche fehlgeschlagen",
- "toot_error": "Erstellen des Beitrags fehlgeschlagen",
- "update_list_memberships_error": "Konnte Listen-Mitgliedschaften nicht aktualisieren",
- "add_user_error": "Benutzer konnte nicht hinzugefügt werden",
- "authorize_url_error": "Fehler beim Abrufen der Autorisierungs-URL",
- "domain_confirmed": "{{domain}} wurde bestätigt, bitte melde dich an",
- "domain_doesnt_exist": "Fehler beim Verbinden mit {{domain}}. Stelle sicher, dass die Server-URL gültig oder korrekt ist.",
- "loading": "Laden...",
- "language_not_support_spellchecker_error": "Diese Sprache wird von der Rechtschreibprüfung nicht unterstützt",
- "update_filter_error": "Aktualisierung des Filters fehlgeschlagen",
- "create_filter_error": "Fehler beim Erstellen des Filters"
- },
- "validation": {
- "login": {
- "require_domain_name": "Domainname wird benötigt",
- "domain_format": "Bitte gib nur den Domainnamen an"
- },
- "compose": {
- "toot_length": "Die Beitragslänge sollte zwischen {{min}} und {{max}} liegen",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "Du kannst maximal {{max}} Bilder anhängen",
- "attach_image": "Du kannst nur Bilder oder Videos anhängen",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} hat deinen Beitrag favorisiert"
- },
- "follow": {
- "title": "Neue Follower",
- "body": "{{username}} folgt dir jetzt"
- },
- "follow_request": {
- "title": "Neue Follower-Anfrage",
- "body": "Follower-Anfrage von {{username}} erhalten"
- },
- "reblog": {
- "title": "Neuer Boost",
- "body": "{{username}} hat deinen Beitrag geteilt"
- },
- "quote": {
- "title": "Neues Zitat",
- "body": "{{username}} hat deinen Beitrag zitiert"
- },
- "reaction": {
- "title": "Neue Reaktion",
- "body": "{{username}} hat auf deinen Beitrag reagiert"
- },
- "status": {
- "title": "Neuer Post",
- "body": "{{username}} hat einen neuen Beitrag gepostet"
- },
- "poll_vote": {
- "title": "Neue Umfrage-Abstimmung",
- "body": "{{username}} hat in deiner Umfrage abgestimmt"
- },
- "poll_expired": {
- "title": "Umfrage abgelaufen",
- "body": "Die Umfrage von {{username}} ist abgelaufen"
- }
- },
- "compose": {
- "title": "Neuer Post",
- "cw": "Trage hier deine Warnung ein",
- "status": "Was gibt's Neues?",
- "cancel": "Abbrechen",
- "toot": "Posten",
- "description": "Alternativtext für diese Mediendatei hinzufügen",
- "footer": {
- "add_image": "Bilder hinzufügen",
- "poll": "Umfrage erstellen",
- "change_visibility": "Sichtbarkeit ändern",
- "change_sensitive": "Medien als heikel markieren",
- "add_cw": "Inhaltswarnung bzw. Triggerwarnung hinzufügen",
- "pined_hashtag": "angepinntes Hashtag"
- },
- "poll": {
- "add_choice": "Neue Option hinzufügen",
- "expires": {
- "5_minutes": "5 Minuten",
- "30_minutes": "30 Minuten",
- "1_hour": "1 Stunde",
- "6_hours": "6 Stunden",
- "1_day": "1 Tag",
- "3_days": "3 Tage",
- "7_days": "7 Tage"
- }
- }
- }
-}
diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json
deleted file mode 100644
index 28818446..00000000
--- a/src/config/locales/en/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Quit"
- },
- "edit": {
- "name": "Edit",
- "undo": "Undo",
- "redo": "Redo",
- "cut": "Cut",
- "copy": "Copy",
- "paste": "Paste",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Window",
- "close": "Close Window",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profile",
- "show_profile": "Show profile",
- "edit_profile": "Edit profile",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "Home",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "Home",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/es_es/translation.json b/src/config/locales/es_es/translation.json
deleted file mode 100644
index e5327551..00000000
--- a/src/config/locales/es_es/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Acerca de Whalebird",
- "preferences": "Preferencias",
- "shortcuts": "Atajos de teclado",
- "services": "Servicios",
- "hide": "Ocultar Whalebird",
- "hide_others": "Ocultar otros",
- "show_all": "Mostrar todos",
- "open": "Abrir ventana",
- "quit": "Salir"
- },
- "edit": {
- "name": "Editar",
- "undo": "Deshacer",
- "redo": "Rehacer",
- "cut": "Cortar",
- "copy": "Copiar",
- "paste": "Pegar",
- "select_all": "Seleccionar todo"
- },
- "view": {
- "name": "Ver",
- "toggle_full_screen": "Conmutar pantalla completa"
- },
- "window": {
- "always_show_menu_bar": "Mostrar siempre la barra de menú",
- "name": "Ventana",
- "close": "Cerrar ventana",
- "open": "Abrir ventana",
- "minimize": "Minimizar",
- "jump_to": "Ir a"
- },
- "help": {
- "name": "Ayuda",
- "thirdparty": "Licencias de terceros"
- }
- },
- "global_header": {
- "add_new_account": "Añadir nueva cuenta"
- },
- "side_menu": {
- "profile": "Perfil",
- "show_profile": "Mostrar perfil",
- "edit_profile": "Editar perfil",
- "settings": "Opciones de cuenta",
- "collapse": "Ocultar",
- "expand": "Expandir",
- "home": "Inicio",
- "notification": "Notificaciones",
- "direct": "Mensajes directos",
- "follow_requests": "Siguiendo",
- "favourite": "Favoritos",
- "bookmark": "Marcadores",
- "local": "Línea de tiempo local",
- "public": "Línea de tiempo federal",
- "hashtag": "Hashtags",
- "search": "Buscar",
- "lists": "Listas"
- },
- "header_menu": {
- "home": "Inicio",
- "notification": "Notificaciones",
- "favourite": "Favoritos",
- "bookmark": "Marcadores",
- "follow_requests": "Solicitudes de seguimiento",
- "direct_messages": "Mensajes directos",
- "local": "Línea de tiempo local",
- "public": "Línea de tiempo federada",
- "hashtag": "Hashtags",
- "search": "Buscar",
- "lists": "Listas",
- "members": "Miembros",
- "reload": "Recargar"
- },
- "settings": {
- "title": "Configuración",
- "general": {
- "title": "General",
- "toot": {
- "title": "Publicación",
- "visibility": {
- "description": "Visibilidad de publicación por defecto",
- "notice": "Esta configuración sólo se aplica a las publicaciones nuevas; Las respuestas seguirán la configuración de visibilidad de la publicación principal.",
- "public": "Público",
- "unlisted": "Sin listar",
- "private": "Privado",
- "direct": "Directo"
- },
- "sensitive": {
- "description": "Marcar medio como sensible por defecto"
- }
- }
- },
- "timeline": {
- "title": "Línea de tiempo",
- "use_marker": {
- "title": "Cargar la línea de tiempo desde la última posición de lectura",
- "home": "Principal",
- "notifications": "Notificaciones"
- }
- },
- "filters": {
- "title": "Filtros",
- "form": {
- "phrase": "Palabra clave o frase",
- "expire": "Expirar después de",
- "context": "Filtrar contextos",
- "irreversible": "Soltar en lugar de ocultar",
- "whole_word": "Palabra entera",
- "submit": "Enviar",
- "cancel": "Cancelar"
- },
- "expires": {
- "never": "Nunca",
- "30_minutes": "30 minutos",
- "1_hour": "1 hora",
- "6_hours": "6 horas",
- "12_hours": "12 horas",
- "1_day": "1 día",
- "1_week": "1 semana"
- },
- "new": {
- "title": "Nuevo"
- },
- "edit": {
- "title": "Editar"
- },
- "delete": {
- "title": "Suprimir",
- "confirm": "¿Está seguro de que desea suprimir este filtro?",
- "confirm_ok": "Suprimir",
- "confirm_cancel": "Cancelar"
- }
- }
- },
- "preferences": {
- "title": "Preferencias",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sonidos",
- "description": "Reproducir sonidos cuando",
- "fav_rb": "Marca como favorito o impulsa una publicación",
- "toot": "Haces una publicación"
- },
- "timeline": {
- "title": "Línea de tiempo",
- "description": "Personaliza cómo se muestran tus líneas de tiempo",
- "cw": "Expandir siempre los mensajes etiquetados con advertencias de contenido.",
- "nsfw": "Mostrar siempre los medios.",
- "hideAllAttachments": "Ocultar siempre los medios."
- },
- "other": {
- "title": "Otras opciones",
- "launch": "Iniciar Whalebird al arrancar",
- "hideOnLaunch": "Ocultar la ventana de Whalebird en el lanzamiento"
- },
- "reset": {
- "button": "Restaurar preferencias"
- }
- },
- "appearance": {
- "title": "Apariencia",
- "theme_color": "Temas de color",
- "theme": {
- "system": "Sistema",
- "light": "Claro",
- "dark": "Oscuro",
- "solarized_light": "Soleado Claro",
- "solarized_dark": "Soleado oscuro",
- "kimbie_dark": "KimbieDark",
- "custom": "Personalizado"
- },
- "custom_theme": {
- "background_color": "Color de fondo",
- "selected_background_color": "Color de fondo de selección",
- "global_header_color": "Menú de cuenta",
- "side_menu_color": "Menú lateral",
- "primary_color": "Fuente primaria",
- "regular_color": "Fuente habitual",
- "secondary_color": "Fuente secundaria",
- "border_color": "Borde",
- "header_menu_color": "Menú de encabezamiento",
- "wrapper_mask_color": "Envoltorio de diálogo"
- },
- "font_size": "Tamaño de letra",
- "font_family": "Tipo de letra",
- "toot_padding": "Relleno alrededor de las publicaciones",
- "display_style": {
- "title": "Estilo de visualización del nombre de usuario",
- "display_name_and_username": "Nombre y nombre de usuario",
- "display_name": "Mostrar nombre",
- "username": "Nombre de usuario"
- },
- "time_format": {
- "title": "Formato de hora",
- "absolute": "Absoluta",
- "relative": "Relativa"
- }
- },
- "notification": {
- "title": "Notificaciones",
- "enable": {
- "description": "Notificarme cuando reciba...",
- "reply": "Respuestas",
- "reblog": "Impulsos",
- "favourite": "Favoritos",
- "follow": "Nuevos seguidores",
- "reaction": "Reacciones de emoji",
- "follow_request": "Solicitudes de seguimiento",
- "status": "Notificaciones de estado",
- "poll_vote": "Votos de encuesta",
- "poll_expired": "Cuando una encuesta expira"
- }
- },
- "account": {
- "title": "Cuenta",
- "connected": "Cuentas conectadas",
- "username": "Nombre de usuario",
- "domain": "Dominio",
- "association": "Asociación",
- "order": "Orden",
- "remove_association": "Eliminar asociación",
- "remove_all_associations": "Eliminar todas las asociaciones",
- "confirm": "Confirmar",
- "cancel": "Cancelar",
- "confirm_message": "¿Estás seguro de que quieres eliminar todas las asociaciones?"
- },
- "network": {
- "title": "Red",
- "proxy": {
- "title": "Configuración del proxy",
- "no": "Sin proxy",
- "system": "Usar proxy del sistema",
- "manual": "Configuración manual del proxy",
- "protocol": "Protocolo",
- "host": "Servidor proxy",
- "port": "Puerto del proxy",
- "username": "Nombre de usuario del Proxy",
- "password": "Contraseña del proxy",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Guardar"
- },
- "language": {
- "title": "Idioma",
- "language": {
- "title": "Lengua",
- "description": "Elija el idioma que desea utilizar con Whalebird."
- },
- "spellchecker": {
- "title": "Corrector ortográfico",
- "enabled": "Activar el corrector ortográfico"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Ir a..."
- },
- "add_list_member": {
- "title": "Añadir miembro a la lista",
- "account_name": "Nombre de cuenta"
- },
- "list_membership": {
- "title": "Listar membresías"
- },
- "mute_confirm": {
- "title": "Silenciar usuario",
- "body": "¿Estás seguro de que quieres silenciar las notificaciones de este usuario?",
- "cancel": "Cancelar",
- "ok": "Silenciar"
- },
- "shortcut": {
- "title": "Atajos del teclado",
- "ctrl_number": "Cambiar de cuenta",
- "ctrl_k": "Ir a otras líneas de tiempo",
- "ctrl_enter": "Enviar la publicación",
- "ctrl_r": "Actualizar la línea de tiempo actual",
- "j": "Seleccionar publicación siguiente",
- "k": "Seleccionar publicación anterior",
- "r": "Responder a la publicación seleccionada",
- "b": "Impulsar la publicación seleccionada",
- "f": "Calificar la publicación seleccionada como favorito",
- "o": "Ver detalles de la publicación seleccionada",
- "p": "Mostrar el perfil del autor de la publicación seleccionada",
- "i": "Abrir las imágenes de la publicación seleccionada",
- "x": "Mostrar/ocultar una publicación avisada de contenido",
- "?": "Mostrar este diálogo",
- "esc": "Cerrar página actual"
- },
- "report": {
- "title": "Denunciar a este usuario",
- "comment": "Comentarios adicionales",
- "cancel": "Cancelar",
- "ok": "Denunciar"
- },
- "thirdparty": {
- "title": "Licencias de terceros"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Mostrar más",
- "hide": "Ocultar",
- "sensitive": "Mostrar contenido sensible",
- "view_toot_detail": "Ver detalles de publicación",
- "open_in_browser": "Abrir en navegador",
- "copy_link_to_toot": "Copiar enlace de publicación",
- "mute": "Silenciar",
- "block": "Bloquear",
- "report": "Denunciar",
- "delete": "Borrar",
- "via": "vía {{application}}",
- "reply": "Responder",
- "reblog": "Impulsar",
- "fav": "Favorito",
- "detail": "Detalles de publicación",
- "bookmark": "Favorito",
- "pinned": "Publicación anclada",
- "poll": {
- "vote": "Voto",
- "votes_count": "votos",
- "until": "hasta {{datetime}}",
- "left": "Quedan {{datetime}}",
- "refresh": "Actualizar"
- },
- "open_account": {
- "title": "Cuenta no encontrada",
- "text": "No se pudo encontrar {{account}} en el servidor. ¿Desea abrir la cuenta en un navegador?",
- "ok": "Abrir",
- "cancel": "Cancelar"
- }
- },
- "status_loading": {
- "message": "Cargar más estado"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Te sigue",
- "doesnt_follow_you": "No te sigue",
- "detail": "Detalle",
- "follow": "Seguir a este usuario",
- "unfollow": "Dejar de seguir este usuario",
- "subscribe": "Suscribirse a este usuario",
- "unsubscribe": "Desuscribir de este usuario",
- "follow_requested": "Seguimiento solicitado",
- "open_in_browser": "Abrir en el navegador",
- "manage_list_memberships": "Gestionar lista de membresías",
- "mute": "Silenciar",
- "unmute": "Desactivar Silencio",
- "unblock": "Desbloquear",
- "block": "Bloquear",
- "toots": "Publicaciones",
- "follows": "Seguimientos",
- "followers": "Seguidores"
- }
- },
- "follow_requests": {
- "accept": "Aceptar",
- "reject": "Rechazar"
- },
- "hashtag": {
- "tag_name": "Nombre de etiqueta",
- "delete_tag": "Borrar etiqueta",
- "save_tag": "Guardar etiqueta"
- },
- "search": {
- "search": "Buscar",
- "account": "Cuenta",
- "tag": "Etiqueta",
- "keyword": "Palabra clabe",
- "toot": "Publicación"
- },
- "lists": {
- "index": {
- "new_list": "Nueva lista",
- "edit": "Editar",
- "delete": {
- "confirm": {
- "title": "Confirmar",
- "message": "Esta lista se borrará permanentemente. ¿Seguro que quieres continuar?",
- "ok": "Eliminar",
- "cancel": "Cancelar"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "¡Bienvenido a Whalebird! Introduzca un nombre de dominio de servidor para acceder a una cuenta.",
- "proxy_info": "Si necesita utilizar un servidor proxy, configúrelo",
- "proxy_here": " aquí",
- "search": "Buscar",
- "login": "Ingresar"
- },
- "authorize": {
- "manually_1": "Se ha abierto una página de autorización en su navegador.",
- "manually_2": "Si aún no se ha abierto, diríjase manualmente a la siguiente URL:",
- "code_label": "Introduzca su código de autorización:",
- "misskey_label": "Por favor, enviar después de autorizarlo en su navegador.",
- "submit": "Enviar"
- },
- "receive_drop": {
- "drop_message": "Suelte aquí para adjuntar un archivo"
- },
- "message": {
- "account_load_error": "Error al cargar las cuentas",
- "account_remove_error": "Error al eliminar la cuenta",
- "preferences_load_error": "Error al cargar las preferencias",
- "timeline_fetch_error": "Error al obtener la línea de tiempo",
- "notification_fetch_error": "Error al obtener la notificación",
- "favourite_fetch_error": "Error al buscar favorito",
- "bookmark_fetch_error": "Error al recuperar marcadores",
- "follow_request_accept_error": "Error al aceptar la solicitud",
- "follow_request_reject_error": "No se ha podido rechazar la solicitud",
- "attach_error": "No se pudo adjuntar el archivo",
- "authorize_duplicate_error": "No se puede iniciar sesión en la misma cuenta del mismo dominio",
- "authorize_error": "Error al autorizar",
- "followers_fetch_error": "No se pudo obtener seguidores",
- "follows_fetch_error": "No se pudo obtener seguidos",
- "toot_fetch_error": "Error al obtener los detalles del puesto",
- "follow_error": "Error al seguir el usuario",
- "unfollow_error": "Error al dejar de seguir al usuario",
- "subscribe_error": "Error al suscribir el usuario",
- "unsubscribe_error": "Error al darse de baja el usuario",
- "lists_fetch_error": "No se pudo obtener listas",
- "list_create_error": "Error al crear una lista",
- "members_fetch_error": "No se pudo obtener miembros",
- "remove_user_error": "Error al eliminar el usuario",
- "find_account_error": "Cuenta no encontrada",
- "reblog_error": "No se ha impulsado",
- "unreblog_error": "No se ha dejado de impulsar",
- "favourite_error": "Error al favorecer",
- "unfavourite_error": "Error al no favorecer",
- "bookmark_error": "Error al añadir el marcador",
- "unbookmark_error": "Error al eliminar el marcador",
- "delete_error": "Error al borrar la publicación",
- "search_error": "Error al buscar",
- "toot_error": "Error al crear publicación",
- "update_list_memberships_error": "Error al actualizar la lista de miembros",
- "add_user_error": "Error al agregar usuario",
- "authorize_url_error": "Error al obtener la url autorizada",
- "domain_confirmed": "{{dominio}} está confirmado, por favor conéctese",
- "domain_doesnt_exist": "Error al conectar con {{domain}}, asegúrese de que la URL del servidor es válida o correcta.",
- "loading": "Cargando...",
- "language_not_support_spellchecker_error": "Este idioma no es compatible con el corrector ortográfico",
- "update_filter_error": "Error al actualizar el filtro",
- "create_filter_error": "Error al crear el filtro"
- },
- "validation": {
- "login": {
- "require_domain_name": "Se requiere un nombre de dominio",
- "domain_format": "Por favor, introduzca sólo el nombre de dominio"
- },
- "compose": {
- "toot_length": "Su publicación debe tener entre {{min}} y {{max}} caracteres",
- "attach_length": "Solo puedes adjuntar {{max}} imagen",
- "attach_length_plural": "Solo puedes adjuntar hasta {{max}} imágenes",
- "attach_image": "Solo puedes adjuntar imágenes o videos",
- "poll_invalid": "Elección de voto inválidas"
- }
- },
- "notification": {
- "favourite": {
- "title": "Nuevo favorito",
- "body": "{{username}} calificó tu publicación como favorito"
- },
- "follow": {
- "title": "Nuevo seguidor",
- "body": "{{username}} ahora te está siguiendo"
- },
- "follow_request": {
- "title": "Nueva solicitud de seguimiento",
- "body": "Se recibió una solicitud de seguimiento desde {{username}}"
- },
- "reblog": {
- "title": "Nuevo impulso",
- "body": "{{username}} impulsó tu publicación"
- },
- "quote": {
- "title": "Nueva cita",
- "body": "{{username}} citó tu publicación"
- },
- "reaction": {
- "title": "Nueva reacción",
- "body": "{{username}} reaccionó a tu publicación"
- },
- "status": {
- "title": "Nueva publicación",
- "body": "{{username}} hizo una publicación"
- },
- "poll_vote": {
- "title": "Nuevo voto de encuesta",
- "body": "{{username}} votó en tu encuesta"
- },
- "poll_expired": {
- "title": "Encuesta expirada",
- "body": "La encuesta de {{username}} finalizó"
- }
- },
- "compose": {
- "title": "Nueva publicación",
- "cw": "Escriba su alerta aquí",
- "status": "¿En qué piensas?",
- "cancel": "Cancelar",
- "toot": "Publicar",
- "description": "Añadir texto alterno para este medio",
- "footer": {
- "add_image": "Añadir imagen",
- "poll": "Añadir encuesta",
- "change_visibility": "Cambiar visibilidad",
- "change_sensitive": "Marcar medio como sensible",
- "add_cw": "Agregar alerta de contenido",
- "pined_hashtag": "Hashtag anclado"
- },
- "poll": {
- "add_choice": "Agregar una opción",
- "expires": {
- "5_minutes": "5 minutos",
- "30_minutes": "30 minutos",
- "1_hour": "1 hora",
- "6_hours": "6 horas",
- "1_day": "1 día",
- "3_days": "3 días",
- "7_days": "7 días"
- }
- }
- }
-}
diff --git a/src/config/locales/eu/translation.json b/src/config/locales/eu/translation.json
deleted file mode 100644
index d7541bb6..00000000
--- a/src/config/locales/eu/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Whalebirdi buruz",
- "preferences": "Hobespenak",
- "shortcuts": "Teklatuaren lasterbideak",
- "services": "Zerbitzuak",
- "hide": "Ezkutatu Whalebird",
- "hide_others": "Ezkutatu besteak",
- "show_all": "Erakutsi guztia",
- "open": "Ireki leihoa",
- "quit": "Itxi"
- },
- "edit": {
- "name": "Editatu",
- "undo": "Desegin",
- "redo": "Berregin",
- "cut": "Ebaki",
- "copy": "Kopiatu",
- "paste": "Itsatsi",
- "select_all": "Hautatu guztia"
- },
- "view": {
- "name": "Ikusi",
- "toggle_full_screen": "Pantaila osoa bai/ez"
- },
- "window": {
- "always_show_menu_bar": "Erakutsi beti menu barra",
- "name": "Leihoa",
- "close": "Itxi leihoa",
- "open": "Ireki leihoa",
- "minimize": "Minimizatu",
- "jump_to": "Joan hona"
- },
- "help": {
- "name": "Laguntza",
- "thirdparty": "Hirugarrenen lizentziak"
- }
- },
- "global_header": {
- "add_new_account": "Gehitu kontu berria"
- },
- "side_menu": {
- "profile": "Profila",
- "show_profile": "Erakutsi profila",
- "edit_profile": "Editatu profila",
- "settings": "Kontuaren ezarpenak",
- "collapse": "Tolestu",
- "expand": "Hedatu",
- "home": "Hasiera",
- "notification": "Jakinarazpenak",
- "direct": "Mezu zuzenak",
- "follow_requests": "Jarraipen-eskaerak",
- "favourite": "Gogokoak",
- "bookmark": "Laster-markak",
- "local": "Lokala",
- "public": "Federatutakoa",
- "hashtag": "Traolak",
- "search": "Bilaketa",
- "lists": "Zerrendak"
- },
- "header_menu": {
- "home": "Hasiera",
- "notification": "Jakinarazpenak",
- "favourite": "Gogokoak",
- "bookmark": "Laster-markak",
- "follow_requests": "Jarraipen-eskaerak",
- "direct_messages": "Mezu zuzenak",
- "local": "Denbora-lerro lokala",
- "public": "Federatutako denbora-lerroa",
- "hashtag": "Traolak",
- "search": "Bilaketa",
- "lists": "Zerrendak",
- "members": "Kideak",
- "reload": "Birkargatu"
- },
- "settings": {
- "title": "Ezarpenak",
- "general": {
- "title": "Orokorra",
- "toot": {
- "title": "Bidalketak",
- "visibility": {
- "description": "Ikusgaitasuna, defektuz",
- "notice": "Ezarpen honek bidalketa berriei bakarrik eragiten die; erantzunek bidalketa nagusiaren ikusgaitasun ezarpenak jarraituko ditu.",
- "public": "Publikoa",
- "unlisted": "Zerrendatu gabea",
- "private": "Jarraitzaileak soilik",
- "direct": "Aipatutako jendea soilik"
- },
- "sensitive": {
- "description": "Markatu edukia hunkigarri gisa, defektuz"
- }
- }
- },
- "timeline": {
- "title": "Denbora-lerroa",
- "use_marker": {
- "title": "Kargatu denbora-lerroa irakurritako azken kokapenetik",
- "home": "Hasiera",
- "notifications": "Jakinarazpenak"
- }
- },
- "filters": {
- "title": "Iragazkiak",
- "form": {
- "phrase": "Hitz-gakoa edo esaldia",
- "expire": "Iraungitze-data",
- "context": "Iragazkien testuinguruak",
- "irreversible": "Desagerrarazi ezkutatu beharrean",
- "whole_word": "Hitz osoa",
- "submit": "Bidali",
- "cancel": "Utzi"
- },
- "expires": {
- "never": "Inoiz ez",
- "30_minutes": "30 minutu",
- "1_hour": "Ordubete",
- "6_hours": "6 ordu",
- "12_hours": "12 ordu",
- "1_day": "Egun 1",
- "1_week": "Astebete"
- },
- "new": {
- "title": "Berria"
- },
- "edit": {
- "title": "Editatu"
- },
- "delete": {
- "title": "Ezabatu",
- "confirm": "Ziur zaude iragazki hau ezabatu nahi duzula?",
- "confirm_ok": "Bai, ezabatu",
- "confirm_cancel": "Ez, utzi"
- }
- }
- },
- "preferences": {
- "title": "Hobespenak",
- "general": {
- "title": "Orokorra",
- "sounds": {
- "title": "Soinuak",
- "description": "Jo soinuak",
- "fav_rb": "Bidalketa bat gogoko egin edo bultzatzerakoan",
- "toot": "Bidalketa bat argitaratzerakoan"
- },
- "timeline": {
- "title": "Denbora-lerroa",
- "description": "Erabaki nola erakutsiko diren denbora-lerroak",
- "cw": "Hedatu beti edukiari buruzko oharra duten bidalketak.",
- "nsfw": "Erakutsi beti multimedia.",
- "hideAllAttachments": "Ezkutatu beti multimedia."
- },
- "other": {
- "title": "Beste aukera batzuk",
- "launch": "Abiarazi Whalebird ordenagailua pizterakoan",
- "hideOnLaunch": "Ezkutatu Whalebird-en leihoa abiarazterakoan"
- },
- "reset": {
- "button": "Berrezarri hobespenak"
- }
- },
- "appearance": {
- "title": "Itxura",
- "theme_color": "Kolorea",
- "theme": {
- "system": "Sistemak darabilena",
- "light": "Argia",
- "dark": "Iluna",
- "solarized_light": "Horixka",
- "solarized_dark": "Urdinxka",
- "kimbie_dark": "Marroixka",
- "custom": "Pertsonalizatua"
- },
- "custom_theme": {
- "background_color": "Hondoa",
- "selected_background_color": "Fokatuta dagoen hondoa",
- "global_header_color": "Kontuaren menua",
- "side_menu_color": "Alboko menua",
- "primary_color": "Letra-tipo nagusia",
- "regular_color": "Letra-tipo arrunta",
- "secondary_color": "Bigarren mailako letra-tipoa",
- "border_color": "Ertza",
- "header_menu_color": "Goiburuko menua",
- "wrapper_mask_color": "Goiburuko hondoa"
- },
- "font_size": "Letraren tamaina",
- "font_family": "Letra-tipoaren familia",
- "toot_padding": "Bidalketen arteko espazioa",
- "display_style": {
- "title": "Erabiltzaileen izenaren itxura",
- "display_name_and_username": "Izena eta erabiltzaile-izena",
- "display_name": "Izena soilik",
- "username": "Erabiltzaile-izena soilik"
- },
- "time_format": {
- "title": "Orduaren formatua",
- "absolute": "Absolutua",
- "relative": "Erlatiboa"
- }
- },
- "notification": {
- "title": "Jakinarazpenak",
- "enable": {
- "description": "Jakinarazi honakoak jasotzerakoan:",
- "reply": "Erantzunak",
- "reblog": "Bultzadak",
- "favourite": "Gogokoak",
- "follow": "Jarraitzaile berriak",
- "reaction": "Emoji erreakzioak",
- "follow_request": "Jarraipen-eskaerak",
- "status": "Egoera jakinarazpenak",
- "poll_vote": "Inkestaren botoak",
- "poll_expired": "Bozketen amaiera"
- }
- },
- "account": {
- "title": "Kontua",
- "connected": "Konektatutako kontuak",
- "username": "Erabiltzaile-izena",
- "domain": "Domeinua",
- "association": "Asoziazioa",
- "order": "Ordena",
- "remove_association": "Kendu asoziazioa",
- "remove_all_associations": "Kendu asoziazio guztiak",
- "confirm": "Baieztatu",
- "cancel": "Utzi",
- "confirm_message": "Ziur zaude asoziazio guztiak kendu nahi dituzula?"
- },
- "network": {
- "title": "Sarea",
- "proxy": {
- "title": "Proxy ezarpenak",
- "no": "Proxyrik ez",
- "system": "Erabili sistemaren proxya",
- "manual": "Eskuzko proxy konfigurazioa",
- "protocol": "Protokoloa",
- "host": "Proxy ostalaria",
- "port": "Proxy ataka",
- "username": "Proxy erabiltzaile-izena",
- "password": "Proxy pasahitza",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Gorde"
- },
- "language": {
- "title": "Hizkuntza",
- "language": {
- "title": "Hizkuntza",
- "description": "Aukeratu Whalebirdek erabiltzea nahi duzun hizkuntza."
- },
- "spellchecker": {
- "title": "Ortografia-egiaztatzea",
- "enabled": "Gaitu ortografia-egiaztatzailea"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Joan hona…"
- },
- "add_list_member": {
- "title": "Gehitu kidea zerrendara",
- "account_name": "Kontuaren izena"
- },
- "list_membership": {
- "title": "Zerrendaren kideak"
- },
- "mute_confirm": {
- "title": "Mututu erabiltzailea",
- "body": "Ziur zaude erabiltzaile honen jakinarazpenak mututu nahi dituzula?",
- "cancel": "Ez, utzi",
- "ok": "Bai, mututu"
- },
- "shortcut": {
- "title": "Teklatuaren lasterbideak",
- "ctrl_number": "Aldatu kontuak",
- "ctrl_k": "Egin jauzi beste denbora-lerro batzuetara",
- "ctrl_enter": "Argitaratu",
- "ctrl_r": "Freskatu oraingo denbora-lerroa",
- "j": "Hautatu hurrengo bidalketa",
- "k": "Hautatu aurreko bidalketa",
- "r": "Erantzun hautatutako bidalketari",
- "b": "Bultzatu hautatutako bidalketa",
- "f": "Egin gogoko hautatutako bidalketa",
- "o": "Ikusi hautatutako bidalketaren xehetasunak",
- "p": "Erakutsi hautatutako bidalketaren autorearen profila",
- "i": "Ikusi hautatutako bidalketaren irudiak",
- "x": "Erakutsi/Ezkutatu edukiari buruzko abisua duen bidalketa",
- "?": "Erakutsi leiho hau",
- "esc": "Itxi oraingo orria"
- },
- "report": {
- "title": "Salatu erabiltzailea",
- "comment": "Iruzkin gehigarriak",
- "cancel": "Utzi",
- "ok": "Salatu"
- },
- "thirdparty": {
- "title": "Hirugarrenen lizentziak"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Erakutsi gehiago",
- "hide": "Ezkutatu",
- "sensitive": "Erakutsi eduki hunkigarria",
- "view_toot_detail": "Ikusi bidalketaren xehetasunak",
- "open_in_browser": "Ireki nabigatzailean",
- "copy_link_to_toot": "Kopiatu bidalketaren esteka",
- "mute": "Mututu",
- "block": "Blokeatu",
- "report": "Salatu",
- "delete": "Ezabatu",
- "via": "{{application}}(e)n bidez",
- "reply": "Erantzun",
- "reblog": "Bultzatu",
- "fav": "Egin gogoko",
- "detail": "Bidalketaren xehetasunak",
- "bookmark": "Jarri laster-marka",
- "pinned": "Finkatutako bidalketa",
- "poll": {
- "vote": "Bozkatu",
- "votes_count": "boto",
- "until": "{{datetime}} arte",
- "left": "epemuga: {{datetime}}",
- "refresh": "Freskatu"
- },
- "open_account": {
- "title": "Ez da kontua aurkitu",
- "text": "Ezin izan da {{account}} kontua zerbitzarian aurkitu. Nabigatzailean ireki nahi al duzu kontu hori?",
- "ok": "Bai, ireki",
- "cancel": "Ez, utzi"
- }
- },
- "status_loading": {
- "message": "Kargatu egoera gehiago"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Jarraitzen zaitu",
- "doesnt_follow_you": "Ez zaitu jarraitzen",
- "detail": "Xehetasunak",
- "follow": "Jarraitu",
- "unfollow": "Utzi jarraitzeari",
- "subscribe": "Harpidetu",
- "unsubscribe": "Utzi harpidetza",
- "follow_requested": "Eskaera bidalita",
- "open_in_browser": "Ireki nabigatzailean",
- "manage_list_memberships": "Kudeatu zerrendaren kideak",
- "mute": "Mututu",
- "unmute": "Utzi mututzeari",
- "unblock": "Utzi blokeatzeari",
- "block": "Blokeatu",
- "toots": "Bidalketak",
- "follows": "Jarraitzen",
- "followers": "Jarraitzaile"
- }
- },
- "follow_requests": {
- "accept": "Onartu",
- "reject": "Baztertu"
- },
- "hashtag": {
- "tag_name": "Bilatu traola",
- "delete_tag": "Ezabatu traola",
- "save_tag": "Gorde traola"
- },
- "search": {
- "search": "Bilatu",
- "account": "Kontua",
- "tag": "Traola",
- "keyword": "Hitz-gakoa",
- "toot": "Bidalketa"
- },
- "lists": {
- "index": {
- "new_list": "Zerrenda berria",
- "edit": "Editatu",
- "delete": {
- "confirm": {
- "title": "Baieztatu",
- "message": "Zerrenda betiko ezabatuko da. Ziur al zaude jarraitu nahi duzula?",
- "ok": "Bai, ezabatu",
- "cancel": "Ez, utzi"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Ongi etorri Whalebird-era! Saioa hasteko idatzi zerbitzariaren domeinua.",
- "proxy_info": "Proxy zerbitzaria behar baduzu, konfiguratu",
- "proxy_here": " hemen",
- "search": "Bilatu",
- "login": "Hasi saioa"
- },
- "authorize": {
- "manually_1": "Baimena emateko leiho berri bat ireki da nabigatzailean.",
- "manually_2": "Automatikoki ireki ez bada, joan ondorengo helbidera:",
- "code_label": "Sartu baimen-kodea:",
- "misskey_label": "Bidali nabigatzailean baimena eman ondoren.",
- "submit": "Bidali"
- },
- "receive_drop": {
- "drop_message": "Ekarri hona fitxategia eransteko"
- },
- "message": {
- "account_load_error": "Kontuak kargatzeak huts egin du",
- "account_remove_error": "Kontua ezabatzeak huts egin du",
- "preferences_load_error": "Hobespenak kargatzeak huts egin du",
- "timeline_fetch_error": "Denbora-lerroa eskuratzeak huts egin du",
- "notification_fetch_error": "Jakinarazpenak eskuratzeak huts egin du",
- "favourite_fetch_error": "Gogokoak eskuratzeak huts egin du",
- "bookmark_fetch_error": "Laster-markak eskuratzeak huts egin du",
- "follow_request_accept_error": "Eskaera onartzeak huts egin du",
- "follow_request_reject_error": "Eskaera baztertzeak huts egin du",
- "attach_error": "Ezin izan da fitxategia erantsi",
- "authorize_duplicate_error": "Ezin da kontu bera birritan gehitu",
- "authorize_error": "Baimentzeak huts egin du",
- "followers_fetch_error": "Jarraitzaileak eskuratzeak huts egin du",
- "follows_fetch_error": "Jarraitzen dituenak eskuratzeak huts egin du",
- "toot_fetch_error": "Bidalketaren xehetasunak eskuratzeak huts egin du",
- "follow_error": "Erabiltzailea jarraitzeak huts egin du",
- "unfollow_error": "Erabiltzailea jarraitzeari uzteak huts egin du",
- "subscribe_error": "Erabiltzailera harpidetzeak huts egin du",
- "unsubscribe_error": "Erabiltzailearen harpidetza uzteak huts egin du",
- "lists_fetch_error": "Zerrendak eskuratzeak huts egin du",
- "list_create_error": "Zerrenda sortzeak huts egin du",
- "members_fetch_error": "Kideak eskuratzeak huts egin du",
- "remove_user_error": "Erabiltzailea kentzeak huts egin du",
- "find_account_error": "Ez da kontua aurkitu",
- "reblog_error": "Bidalketaren bultzadak huts egin du",
- "unreblog_error": "Bultzada kentzeak huts egin du",
- "favourite_error": "Gogoko egiteak huts egin du",
- "unfavourite_error": "Gogokoetatik kentzeak huts egin du",
- "bookmark_error": "Laster-marka jartzeak huts egin du",
- "unbookmark_error": "Laster-marka kentzeak huts egin du",
- "delete_error": "Bidalketa ezabatzeak huts egin du",
- "search_error": "Bilaketak huts egin du",
- "toot_error": "Bidalketa sortzeak huts egin du",
- "update_list_memberships_error": "Zerrendaren kideen eguneratzeak huts egin du",
- "add_user_error": "Erabiltzailea gehitzeak huts egin du",
- "authorize_url_error": "Baimentzeko URLa eskuratzeak huts egin du",
- "domain_confirmed": "{{domain}} domeinua baieztatu da; hasi saioa",
- "domain_doesnt_exist": "{{domain}} domeinuarekin konextioak huts egin du; egiaztatu zerbitzariaren URLa zuzena dela.",
- "loading": "Kargatzen…",
- "language_not_support_spellchecker_error": "Ortografia-egiaztatzailea ezin da hizkuntza honekin erabili",
- "update_filter_error": "Iragazkiaren eguneraketak huts egin du",
- "create_filter_error": "Iragazkiaren sorrerak huts egin du"
- },
- "validation": {
- "login": {
- "require_domain_name": "Domeinuaren izena ezinbestekoa da",
- "domain_format": "Sartu domeinuaren izena soilik"
- },
- "compose": {
- "toot_length": "Bidalketaren luzera {{min}} eta {{max}} artekoa izan behar da",
- "attach_length": "Irudi bakar {{max}} erantsi dezakezu",
- "attach_length_plural": "{{max}} irudi soilik erantsi ditzakezu",
- "attach_image": "Irudiak edo bideoak soilik erantsi ditzakezu",
- "poll_invalid": "Inkestaren aukerek ez dute balio"
- }
- },
- "notification": {
- "favourite": {
- "title": "Gogoko berria",
- "body": "{{username}}(e)k gogoko du zure bidalketa"
- },
- "follow": {
- "title": "Jarraitzaile berria",
- "body": "{{username}} jarraitzen hasi zaizu"
- },
- "follow_request": {
- "title": "Jarraipen-eskaera berria",
- "body": "{{username}}(e)k jarraitzeko eskaera egin dizu"
- },
- "reblog": {
- "title": "Bultzada berria",
- "body": "{{username}}(e)k zure bidalketa bultzatu du"
- },
- "quote": {
- "title": "Aipamen berria",
- "body": "{{username}}(e)k zure bidalketa aipatu du"
- },
- "reaction": {
- "title": "Erreakzio berria",
- "body": "{{username}}(e)k erreakzionatu du"
- },
- "status": {
- "title": "Bidalketa berria",
- "body": "{{username}}(e)k ibidalketa berria egin du"
- },
- "poll_vote": {
- "title": "Boto berria",
- "body": "{{username}}(e)k botoa eman du zure inkestan"
- },
- "poll_expired": {
- "title": "Inkesta amaitu da",
- "body": "{{username}}(r)en inkesta amaitu da"
- }
- },
- "compose": {
- "title": "Bidalketa berria",
- "cw": "Idatzi ohartarazpena hemen",
- "status": "Zer duzu buruan?",
- "cancel": "Utzi",
- "toot": "Argitaratu",
- "description": "Gehitu multimedia honen deskribapena",
- "footer": {
- "add_image": "Gehitu irudiak",
- "poll": "Gehitu inkesta",
- "change_visibility": "Aldatu ikusgaitasuna",
- "change_sensitive": "Markatu multimedia hunkigarri gisa",
- "add_cw": "Gehitu edukiari buruzko oharra",
- "pined_hashtag": "Finkatutako traola"
- },
- "poll": {
- "add_choice": "Gehitu aukera bat",
- "expires": {
- "5_minutes": "5 minutu",
- "30_minutes": "30 minutu",
- "1_hour": "Ordubete",
- "6_hours": "6 ordu",
- "1_day": "Egun 1",
- "3_days": "3 egun",
- "7_days": "7 egun"
- }
- }
- }
-}
diff --git a/src/config/locales/fa/translation.json b/src/config/locales/fa/translation.json
deleted file mode 100644
index 28818446..00000000
--- a/src/config/locales/fa/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Quit"
- },
- "edit": {
- "name": "Edit",
- "undo": "Undo",
- "redo": "Redo",
- "cut": "Cut",
- "copy": "Copy",
- "paste": "Paste",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Window",
- "close": "Close Window",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profile",
- "show_profile": "Show profile",
- "edit_profile": "Edit profile",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "Home",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "Home",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/fr/translation.json b/src/config/locales/fr/translation.json
deleted file mode 100644
index be56954f..00000000
--- a/src/config/locales/fr/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "À propos de Whalebird",
- "preferences": "Préférences",
- "shortcuts": "Raccourcis clavier",
- "services": "Services",
- "hide": "Cacher Whalebird",
- "hide_others": "Masquer les autres",
- "show_all": "Tout afficher",
- "open": "Ouvrir la fenêtre",
- "quit": "Quitter"
- },
- "edit": {
- "name": "Modifier",
- "undo": "Défaire",
- "redo": "Refaire",
- "cut": "Couper",
- "copy": "Copier",
- "paste": "Coller",
- "select_all": "Tout sélectionner"
- },
- "view": {
- "name": "Afficher",
- "toggle_full_screen": "Basculer en mode plein écran"
- },
- "window": {
- "always_show_menu_bar": "Toujours afficher la barre de menu",
- "name": "Fenêtre",
- "close": "Fermer la fenêtre",
- "open": "Ouvrir la fenêtre",
- "minimize": "Minimiser",
- "jump_to": "Aller à"
- },
- "help": {
- "name": "Aide",
- "thirdparty": "Licences tierces"
- }
- },
- "global_header": {
- "add_new_account": "Ajouter un nouveau compte"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Voir le profil",
- "edit_profile": "Éditer mon profil",
- "settings": "Paramètres du compte",
- "collapse": "Réduire",
- "expand": "Développer",
- "home": "Accueil",
- "notification": "Notifications",
- "direct": "Messages directs",
- "follow_requests": "Demandes d’abonnement",
- "favourite": "Favourited",
- "bookmark": "Signets",
- "local": "Fil public local",
- "public": "Fil fédéré",
- "hashtag": "Hashtags",
- "search": "Rechercher",
- "lists": "Listes"
- },
- "header_menu": {
- "home": "Accueil",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Signets",
- "follow_requests": "Demandes d’abonnement",
- "direct_messages": "Messages directs",
- "local": "Fil public local",
- "public": "Fil fédéré",
- "hashtag": "Hashtags",
- "search": "Rechercher",
- "lists": "Listes",
- "members": "Membres",
- "reload": "Recharger"
- },
- "settings": {
- "title": "Paramètres",
- "general": {
- "title": "Général",
- "toot": {
- "title": "Publications",
- "visibility": {
- "description": "Visibilité par défaut des publications",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Public sans être affiché sur le fil public",
- "private": "Abonné⋅e⋅s uniquement",
- "direct": "Message direct"
- },
- "sensitive": {
- "description": "Marquer vos médias comme sensibles par défaut"
- }
- }
- },
- "timeline": {
- "title": "Fil d'actualité",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Accueil",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filtres",
- "form": {
- "phrase": "Mot-clé ou expression",
- "expire": "Expire après",
- "context": "Filtrer les contextes",
- "irreversible": "Supprimer plutôt que cacher",
- "whole_word": "Mot entier",
- "submit": "Envoyer",
- "cancel": "Annuler"
- },
- "expires": {
- "never": "Jamais",
- "30_minutes": "30 minutes",
- "1_hour": "1 heure",
- "6_hours": "6 heures",
- "12_hours": "12 heures",
- "1_day": "1 jour",
- "1_week": "1 semaine"
- },
- "new": {
- "title": "Nouveau"
- },
- "edit": {
- "title": "Modifier"
- },
- "delete": {
- "title": "Supprimer",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Supprimer",
- "confirm_cancel": "Annuler"
- }
- }
- },
- "preferences": {
- "title": "Préférences",
- "general": {
- "title": "Général",
- "sounds": {
- "title": "Sons",
- "description": "Jouer un son lorsque",
- "fav_rb": "You favourite or boost a post",
- "toot": "Vous publiez un message"
- },
- "timeline": {
- "title": "Fil d'actualité",
- "description": "Personnaliser l’affichage de vos fils",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Toujours afficher les médias.",
- "hideAllAttachments": "Toujours masquer les médias."
- },
- "other": {
- "title": "Autres options",
- "launch": "Lancer Whalebird au démarrage",
- "hideOnLaunch": "Masquer la fenêtre Whalebird au lancement"
- },
- "reset": {
- "button": "Réinitialiser les préférences"
- }
- },
- "appearance": {
- "title": "Apparence",
- "theme_color": "Couleurs du thème",
- "theme": {
- "system": "Système",
- "light": "Clair",
- "dark": "Foncé",
- "solarized_light": "Lumière solaire",
- "solarized_dark": "Solarisé Sombre",
- "kimbie_dark": "KimbieDark",
- "custom": "Personalisé"
- },
- "custom_theme": {
- "background_color": "Arrière plan de base",
- "selected_background_color": "Arrière plan en focus",
- "global_header_color": "Menu Compte",
- "side_menu_color": "Menu latéral",
- "primary_color": "Couleur du texte primaire",
- "regular_color": "Couleur du texte normal",
- "secondary_color": "Couleur du texte secondaire",
- "border_color": "Bordures",
- "header_menu_color": "Menu en tête",
- "wrapper_mask_color": "Fenêtre de dialogue"
- },
- "font_size": "Taille des caractères",
- "font_family": "Famille de polices",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Style d'affichage du nom d'utilisateur",
- "display_name_and_username": "Nom et utilisateur⋅trice",
- "display_name": "Nom affiché",
- "username": "Utilisateur⋅trice"
- },
- "time_format": {
- "title": "Format de dates",
- "absolute": "Absolu",
- "relative": "Relatif"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Réponses",
- "reblog": "Partages",
- "favourite": "Favoris",
- "follow": "Nouveaux⋅elles abonné⋅e⋅s",
- "reaction": "Emoji reactions",
- "follow_request": "Demandes d’abonnement",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "Lorsqu’un sondage expire"
- }
- },
- "account": {
- "title": "Compte",
- "connected": "Comptes associés",
- "username": "Utilisateur⋅trice",
- "domain": "Domaine",
- "association": "Association",
- "order": "Ordre",
- "remove_association": "Supprimer l'association",
- "remove_all_associations": "Supprimer toutes les associations",
- "confirm": "Confirmer",
- "cancel": "Annuler",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Réseau",
- "proxy": {
- "title": "Configuration du proxy",
- "no": "Aucun proxy",
- "system": "Utiliser le proxy du système",
- "manual": "Configuration manuelle du proxy",
- "protocol": "Protocole",
- "host": "Hôte du proxy",
- "port": "Port du proxy",
- "username": "Nom d'utilisateur du proxy",
- "password": "Mot de passe du proxy",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Sauvegarder"
- },
- "language": {
- "title": "Langue",
- "language": {
- "title": "Langue",
- "description": "Choisissez la langue que vous souhaitez utiliser sur Whalebird."
- },
- "spellchecker": {
- "title": "Vérification orthographique",
- "enabled": "Activer le correcteur orthographique"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Aller à..."
- },
- "add_list_member": {
- "title": "Ajouter un membre à la liste",
- "account_name": "Nom du compte"
- },
- "list_membership": {
- "title": "Liste des membres"
- },
- "mute_confirm": {
- "title": "Masquer l’utilisateur·rice",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Annuler",
- "ok": "Muter"
- },
- "shortcut": {
- "title": "Raccourcis clavier",
- "ctrl_number": "Changer de compte",
- "ctrl_k": "Aller aux autres fils",
- "ctrl_enter": "Envoyer un message",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Afficher cette boîte de dialogue",
- "esc": "Fermer la page en cours"
- },
- "report": {
- "title": "Signaler cet·te utilisateur·rice",
- "comment": "Observations supplémentaires",
- "cancel": "Annuler",
- "ok": "Signaler"
- },
- "thirdparty": {
- "title": "Licences tierces"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Voir plus",
- "hide": "Cacher",
- "sensitive": "Afficher le contenu sensible",
- "view_toot_detail": "Voir les détails de la publication",
- "open_in_browser": "Ouvrir dans le navigateur",
- "copy_link_to_toot": "Copier le lien de la publication",
- "mute": "Muter",
- "block": "Bloquer",
- "report": "Signaler",
- "delete": "Supprimer",
- "via": "via {{application}}",
- "reply": "Répondre",
- "reblog": "Partager",
- "fav": "Préféré",
- "detail": "Détails de la publication",
- "bookmark": "Favori",
- "pinned": "Publication épinglée",
- "poll": {
- "vote": "Vote",
- "votes_count": "voix",
- "until": "jusqu'à {{datetime}}",
- "left": "{{datetime}} restant",
- "refresh": "Actualiser"
- },
- "open_account": {
- "title": "Compte non trouvé",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Ouvrir",
- "cancel": "Annuler"
- }
- },
- "status_loading": {
- "message": "Charger plus de publications"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Abonné⋅e",
- "doesnt_follow_you": "Pas abonné⋅e",
- "detail": "Détail",
- "follow": "S’abonner",
- "unfollow": "Se désabonner",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Suivre demande",
- "open_in_browser": "Ouvrir dans le navigateur",
- "manage_list_memberships": "Gérer la liste des membres",
- "mute": "Muter",
- "unmute": "Dé-muter",
- "unblock": "Dé-Bloquer",
- "block": "Bloquer",
- "toots": "Publications",
- "follows": "Abonnements",
- "followers": "Abonné⋅e⋅s"
- }
- },
- "follow_requests": {
- "accept": "Accepter",
- "reject": "Refuser"
- },
- "hashtag": {
- "tag_name": "Nom du hashtag",
- "delete_tag": "Supprimer tag",
- "save_tag": "Sauver tag"
- },
- "search": {
- "search": "Rechercher",
- "account": "Compte",
- "tag": "Hashtag",
- "keyword": "Mot-clé",
- "toot": "Publication"
- },
- "lists": {
- "index": {
- "new_list": "Nouvelle liste",
- "edit": "Éditer",
- "delete": {
- "confirm": {
- "title": "Confirmer",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Supprimer",
- "cancel": "Annuler"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Bienvenue sur Whalebird ! Entrez un nom de domaine pour vous connecter à un compte.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " ici",
- "search": "Rechercher",
- "login": "Connexion"
- },
- "authorize": {
- "manually_1": "La page d'autorisation est à présent affichée dans votre navigateur.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Entrez votre code d’autorisation :",
- "misskey_label": "Veuillez soumettre une fois que vous avez autorisé dans votre navigateur.",
- "submit": "Envoyer"
- },
- "receive_drop": {
- "drop_message": "Déposez ici pour joindre un fichier"
- },
- "message": {
- "account_load_error": "Erreur au chargement des comptes",
- "account_remove_error": "Erreur à la suppression du compte",
- "preferences_load_error": "Erreur au chargement des préférences",
- "timeline_fetch_error": "Erreur au chargement du fil public",
- "notification_fetch_error": "Erreur au chargement des notifications",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Impossible d'accepter la demande",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Impossible de joindre le fichier",
- "authorize_duplicate_error": "Vous êtes déjà connecté avec le même compte sur le même domaine.",
- "authorize_error": "Erreur à l'autoristation",
- "followers_fetch_error": "Erreur à la récupération des abonné⋅e⋅s",
- "follows_fetch_error": "Erreur à la récupération des abonnements",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Impossible de s'abonner à l'utilisateur⋅trice",
- "unfollow_error": "Impossible de supprimer l'abonnement à l'utilisateur⋅trice",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Erreur à la récupération des listes",
- "list_create_error": "Erreur à la création de la liste",
- "members_fetch_error": "Erreur à la récupération des membres de la liste",
- "remove_user_error": "Erreur à la suppression d'un utilisateur⋅trice",
- "find_account_error": "Compte non trouvé",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Erreur à la création d'un favori",
- "unfavourite_error": "Erreur à la suprression d'un favori",
- "bookmark_error": "Échec de l'ajout du favoris",
- "unbookmark_error": "Échec de la suppression du favoris",
- "delete_error": "Failed to delete the post",
- "search_error": "Erreur lors de la recherche",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Erreur lors de la mise à jour de la liste",
- "add_user_error": "Erreur lors de l'ajout d'un utilisateur⋅trice",
- "authorize_url_error": "Erreur à la récupération de l'URL d'autorisation",
- "domain_confirmed": "{{domain}} est confirmé, veuillez vous connecter",
- "domain_doesnt_exist": "Impossible de se connecter à {{domain}}, assurez-vous que l’URL du serveur est valide ou correcte.",
- "loading": "Chargement...",
- "language_not_support_spellchecker_error": "Cette langue n’est pas prise en charge par le correcteur orthographique",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "Un nom de domaine est requis",
- "domain_format": "Veuillez uniquement indiquer le nom de domaine"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "Nouveau favori",
- "body": "{{username}} a mis votre message en favori"
- },
- "follow": {
- "title": "Nouveau⋅elle abonné⋅e",
- "body": "{{username}} vous suit"
- },
- "follow_request": {
- "title": "Nouvelle demande d’abonnement",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "Nouveau partage",
- "body": "{{username}} a partagé votre publication"
- },
- "quote": {
- "title": "Nouvelle citation",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "Nouvelle réaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "Nouvelle publication",
- "body": "{{username}} a publié un nouveau message"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Sondage expiré",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "Nouvelle publication",
- "cw": "Rédigez votre avertissement ici",
- "status": "Qu’avez-vous en tête ?",
- "cancel": "Annuler",
- "toot": "Publier",
- "description": "Ajouter un texte alternatif pour ce média",
- "footer": {
- "add_image": "Ajouter des images",
- "poll": "Créer un sondage",
- "change_visibility": "Modifier la visibilité",
- "change_sensitive": "Marquer le média comme sensible",
- "add_cw": "Ajouter un avertissement de contenu",
- "pined_hashtag": "Hashtag épinglé"
- },
- "poll": {
- "add_choice": "Ajouter une option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 heure",
- "6_hours": "6 heures",
- "1_day": "1 jour",
- "3_days": "3 jours",
- "7_days": "7 jours"
- }
- }
- }
-}
diff --git a/src/config/locales/gd/translation.json b/src/config/locales/gd/translation.json
deleted file mode 100644
index 3648b5e1..00000000
--- a/src/config/locales/gd/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Mu Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Seirbheisean",
- "hide": "Cuir Whalebird am falach",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Fàg an-seo"
- },
- "edit": {
- "name": "Deasaich",
- "undo": "Neo-dhèan",
- "redo": "Ath-dhèan",
- "cut": "Geàrr às",
- "copy": "Dèan lethbhreac",
- "paste": "Cuir ann",
- "select_all": "Tagh na h-uile"
- },
- "view": {
- "name": "Seall",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Uinneag",
- "close": "Dùin an uinneag",
- "open": "Fosgail ann an uinneag",
- "minimize": "Fìor-lùghdaich",
- "jump_to": "Leum gu"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Cuir cunntas ùr ris"
- },
- "side_menu": {
- "profile": "Pròifil",
- "show_profile": "Seall a’ phròifil",
- "edit_profile": "Deasaich a’ phròifil",
- "settings": "Account settings",
- "collapse": "Co-theannaich",
- "expand": "Leudaich",
- "home": "Dachaigh",
- "notification": "Notifications",
- "direct": "Teachdaireachdan dìreach",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Loidhne-ama ionadail",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Lorg",
- "lists": "Liostaichean"
- },
- "header_menu": {
- "home": "Dachaigh",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Loidhne-ama ionadail",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Lorg",
- "lists": "Liostaichean",
- "members": "Buill",
- "reload": "Ath-luchdaich"
- },
- "settings": {
- "title": "Roghainnean",
- "general": {
- "title": "Coitcheann",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Poblach",
- "unlisted": "Falaichte o liostaichean",
- "private": "Prìobhaideach",
- "direct": "Dìreach"
- },
- "sensitive": {
- "description": "Cuir comharra gu bheil meadhanan frionasach mar bhun-roghainn"
- }
- }
- },
- "timeline": {
- "title": "Loidhne-ama",
- "use_marker": {
- "title": "Luchdaich an loidhne-ama on ionad-leughaidh mu dheireadh",
- "home": "Dachaigh",
- "notifications": "Brathan"
- }
- },
- "filters": {
- "title": "Criathragan",
- "form": {
- "phrase": "Facal no abairt-luirg",
- "expire": "Thig e gu crìoch às dèidh",
- "context": "Co-theacsaichean na criathraige",
- "irreversible": "Leig seachad seach falach",
- "whole_word": "Facal slàn",
- "submit": "Cuir a-null",
- "cancel": "Sguir dheth"
- },
- "expires": {
- "never": "Buan",
- "30_minutes": "Leth-uair a thìde",
- "1_hour": "Uair a thìde",
- "6_hours": "6 uairean a thìde",
- "12_hours": "12 uair a thìde",
- "1_day": "Latha",
- "1_week": "Seachdain"
- },
- "new": {
- "title": "Ùr"
- },
- "edit": {
- "title": "Deasaich"
- },
- "delete": {
- "title": "Sguab às",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Sguab às",
- "confirm_cancel": "Sguir dheth"
- }
- }
- },
- "preferences": {
- "title": "Roghainnean",
- "general": {
- "title": "Coitcheann",
- "sounds": {
- "title": "Fuaimean",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Loidhne-ama",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Roghainnean eile",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Ath-shuidhich na roghainnean"
- }
- },
- "appearance": {
- "title": "Coltas",
- "theme_color": "Colour themes",
- "theme": {
- "system": "An siostam",
- "light": "Soilleir",
- "dark": "Dorcha",
- "solarized_light": "Grianach soilleir",
- "solarized_dark": "Grianach dorcha",
- "kimbie_dark": "Kimbie Dorcha",
- "custom": "Gnàthaichte"
- },
- "custom_theme": {
- "background_color": "An cùlaibh bunaiteach",
- "selected_background_color": "An cùlaibh fòcasaichte",
- "global_header_color": "Clàr-taice a’ chunntais",
- "side_menu_color": "Clàr-taice an taoibh",
- "primary_color": "Am prìomh chruth-chlò",
- "regular_color": "An cruth-clò àbhaisteach",
- "secondary_color": "An cruth-clò dàrnach",
- "border_color": "Iomallan",
- "header_menu_color": "Clàr-taice a’ bhanna-chinn",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Meud a’ chrutha-chlò",
- "font_family": "Teaghlach a’ chrutha-chlò",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Ainm-taisbeanaidh ’s ainm-cleachdaiche",
- "display_name": "Ainm-taisbeanaidh",
- "username": "Ainm-cleachdaiche"
- },
- "time_format": {
- "title": "Fòrmat an ama",
- "absolute": "Absaloideach",
- "relative": "Dàimheach"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Cunntas",
- "connected": "Connected accounts",
- "username": "Ainm-cleachdaiche",
- "domain": "Àrainn",
- "association": "Co-cheangal",
- "order": "Òrdugh",
- "remove_association": "Thoir air falbh an co-cheangal",
- "remove_all_associations": "Thoir air falbh a h-uile co-cheangal",
- "confirm": "Dearbh",
- "cancel": "Sguir dheth",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Lìonra",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Gun phrosgsaidh",
- "system": "Cleachd progsaidh an t-siostaim",
- "manual": "Rèiteachadh progsaidh a làimh",
- "protocol": "Pròtacal",
- "host": "Òstair a’ phrogsaidh",
- "port": "Port a’ phrogsaidh",
- "username": "Ainm-cleachdaiche a’ phrogsaidh",
- "password": "Facal-faire a’ phrogsaidh",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Sàbhail"
- },
- "language": {
- "title": "Cànan",
- "language": {
- "title": "Cànan",
- "description": "Tagh an cànan a bu toigh leat cleachdadh le Whalebird."
- },
- "spellchecker": {
- "title": "Dearbhair-litreachaidh",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Leum gu…"
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Ainm a’ chunntais"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Sguir dheth",
- "ok": "Mùch"
- },
- "shortcut": {
- "title": "Ath-ghoiridean a’ mheur-chlàir",
- "ctrl_number": "Thoir leum gu cunntas eile",
- "ctrl_k": "Thoir leum gu loidhne-ama eile",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Dùin an duilleag làithreach"
- },
- "report": {
- "title": "Report this user",
- "comment": "Beachdan a bharrachd",
- "cancel": "Sguir dheth",
- "ok": "Dèan gearan"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Seall barrachd dheth",
- "hide": "Cuir am falach",
- "sensitive": "Seall an t-susbaint fhrionasach",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mùch",
- "block": "Bac",
- "report": "Dèan gearan",
- "delete": "Sguab às",
- "via": "le {{application}}",
- "reply": "Freagair",
- "reblog": "Boost",
- "fav": "Cuir ris na h-annsachdan",
- "detail": "Post details",
- "bookmark": "Cuir ris na comharran-lìn",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Cuir bhòt",
- "votes_count": "bhòt(aichean)",
- "until": "gu ruige {{datetime}}",
- "left": "Tha {{datetime}} air fhàgail",
- "refresh": "Ath-nuadhaich"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Luchdaich barrachd phostaichean"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "’Gad leantainn",
- "doesnt_follow_you": "Nach eil ’gad leantainn",
- "detail": "Mion-fhiosrachadh",
- "follow": "Lean an cleachdaiche seo",
- "unfollow": "Na lean an cleachdaiche seo tuilleadh",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Iarrar leantainn",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mùch",
- "unmute": "Dì-mhùch",
- "unblock": "Dì-bhac",
- "block": "Bac",
- "toots": "Posts",
- "follows": "A’ leantainn",
- "followers": "Luchd-leantainn"
- }
- },
- "follow_requests": {
- "accept": "Gabh ris",
- "reject": "Diùlt"
- },
- "hashtag": {
- "tag_name": "Ainm an taga",
- "delete_tag": "Sguab às an taga",
- "save_tag": "Sàbhail an taga"
- },
- "search": {
- "search": "Lorg",
- "account": "Cunntas",
- "tag": "Taga hais",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Liosta ùr",
- "edit": "Deasaich",
- "delete": {
- "confirm": {
- "title": "Dearbh",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Sguab às",
- "cancel": "Sguir dheth"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " an-seo",
- "search": "Lorg",
- "login": "Clàraich a-steach"
- },
- "authorize": {
- "manually_1": "Chaidh duilleag ùghdarrachaidh fhosgladh sa bhrabhsair agad.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Cuir a-null e nuair a bhios tu air ùghdarrachadh sa bhrabhsair agad.",
- "submit": "Cuir a-null"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Dh’fhàillig le luchdadh nan cunntasan",
- "account_remove_error": "Cha deach leinn an cunntas a thoirt air falbh",
- "preferences_load_error": "Dh’fhàillig le luchdadh nan roghainnean",
- "timeline_fetch_error": "Cha b’ urrainn dhuinn an loidhne-ama fhaighinn",
- "notification_fetch_error": "Cha b’ urrainn dhuinn am brath fhaighinn",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Dh'fhàillig le gabhail ris an t-iarrtas",
- "follow_request_reject_error": "Dh’fhàillig le diùltadh an iarrtais",
- "attach_error": "Cha b’ urrainn dhuinn am faidhle a cheangal ris",
- "authorize_duplicate_error": "Chan urrainn dhuinn clàradh a-steach dhan aon chunntas dhen aon àrainn",
- "authorize_error": "Dh’fhàillig leis an ùghdarrachadh",
- "followers_fetch_error": "Cha b’ urrainn dhuinn an luchd-leantainn fhaighinn",
- "follows_fetch_error": "Cha b’ urrainn dhuinn fiosrachadh do leantainn fhaighinn",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Dh’fhàillig le leantainn a’ chleachdaiche",
- "unfollow_error": "Dh’fhàillig le sgur de leantainn a’ chleachdaiche",
- "subscribe_error": "Dh’fhàillig leis an fho-sgrìobhadh air a’ chleachdaiche",
- "unsubscribe_error": "Cha deach leinn crìoch a chur air an fho-sgrìobhadh air a’ chleachdaiche",
- "lists_fetch_error": "Cha b’ urrainn dhuinn na liostaichean fhaighinn",
- "list_create_error": "Cha b’ urrainn dhuinn liosta a chruthachadh",
- "members_fetch_error": "Cha b’ urrainn dhuinn na buill fhaighinn",
- "remove_user_error": "Cha deach leinn an cleachdaiche a thoirt air falbh",
- "find_account_error": "Cha deach an cunntas a lorg",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Cha b’ urrainn dhuinn a chur ris na h-annsachdan",
- "unfavourite_error": "Cha b’ urrainn dhuinn a thoirt air falbh o na h-annsachdan",
- "bookmark_error": "Chaidh a chur ris na comharran-lìn",
- "unbookmark_error": "Cha deach leinn an comharra-lìn a thoirt air falbh",
- "delete_error": "Failed to delete the post",
- "search_error": "Dh’fhàillig leis an lorg",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Cha b’ urrainn dhuinn na ballrachdan liosta ùrachadh",
- "add_user_error": "Cha b’ urrainn dhuinn an cleachdaiche a chur ris",
- "authorize_url_error": "Cha b’ urrainn dhuinn an t-URL ùghdarrachaidh fhaighinn",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "’Ga luchdadh…",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Cha b’ urrainn dhuinn a’ chriathrag ùrachadh",
- "create_filter_error": "Dh’fhàillig le cruthachadh na criathraige"
- },
- "validation": {
- "login": {
- "require_domain_name": "Tha feum air ainm àrainne",
- "domain_format": "Na cuir a-steach ach ainm na h-àrainne"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "Tha {{username}} ’gad leantainn a-nis"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/hu/translation.json b/src/config/locales/hu/translation.json
deleted file mode 100644
index 28818446..00000000
--- a/src/config/locales/hu/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Quit"
- },
- "edit": {
- "name": "Edit",
- "undo": "Undo",
- "redo": "Redo",
- "cut": "Cut",
- "copy": "Copy",
- "paste": "Paste",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Window",
- "close": "Close Window",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profile",
- "show_profile": "Show profile",
- "edit_profile": "Edit profile",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "Home",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "Home",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/id/translation.json b/src/config/locales/id/translation.json
deleted file mode 100644
index 22268d60..00000000
--- a/src/config/locales/id/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Tentang Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Layanan",
- "hide": "Sembunyikan Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Keluar"
- },
- "edit": {
- "name": "Sunting",
- "undo": "Urungkan",
- "redo": "Ulangi",
- "cut": "Potong",
- "copy": "Salin",
- "paste": "Tempel",
- "select_all": "Pilih semua"
- },
- "view": {
- "name": "Tampilan",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Jendela",
- "close": "Tutup jendela",
- "open": "Buka jendela",
- "minimize": "Perkecil",
- "jump_to": "Lompat ke"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Tambahkan akun baru"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Lihat profil",
- "edit_profile": "Sunting profil",
- "settings": "Account settings",
- "collapse": "Ciutkan",
- "expand": "Perluas",
- "home": "Beranda",
- "notification": "Notifications",
- "direct": "Pesan langsung",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Linimasa lokal",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Cari",
- "lists": "Daftar"
- },
- "header_menu": {
- "home": "Beranda",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Linimasa lokal",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Cari",
- "lists": "Daftar",
- "members": "Anggota",
- "reload": "Muat Ulang"
- },
- "settings": {
- "title": "Pengaturan",
- "general": {
- "title": "Umum",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Publik",
- "unlisted": "Tidak terdaftar",
- "private": "Privat",
- "direct": "Langsung"
- },
- "sensitive": {
- "description": "Tandai sebagai media sensitif secara bawaan"
- }
- }
- },
- "timeline": {
- "title": "Linimasa",
- "use_marker": {
- "title": "Muat linimasa dari posisi baca terakhir",
- "home": "Beranda",
- "notifications": "Pemberitahuan"
- }
- },
- "filters": {
- "title": "Filter",
- "form": {
- "phrase": "Kata kunci atau frasa",
- "expire": "Kedaluwarsa setelah",
- "context": "Konteks filter",
- "irreversible": "Hapus alih-alih sembunyikan",
- "whole_word": "Seluruh kata",
- "submit": "Kirim",
- "cancel": "Batal"
- },
- "expires": {
- "never": "Tidak Pernah",
- "30_minutes": "30 menit",
- "1_hour": "1 jam",
- "6_hours": "6 jam",
- "12_hours": "12 jam",
- "1_day": "1 hari",
- "1_week": "1 minggu"
- },
- "new": {
- "title": "Baru"
- },
- "edit": {
- "title": "Sunting"
- },
- "delete": {
- "title": "Hapus",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Hapus",
- "confirm_cancel": "Batal"
- }
- }
- },
- "preferences": {
- "title": "Preferensi",
- "general": {
- "title": "Umum",
- "sounds": {
- "title": "Bunyi",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Linimasa",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Pilihan lainnya",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Setel ulang preferensi"
- }
- },
- "appearance": {
- "title": "Penampilan",
- "theme_color": "Colour themes",
- "theme": {
- "system": "Sistem",
- "light": "Terang",
- "dark": "Gelap",
- "solarized_light": "Solarized Light",
- "solarized_dark": "Solarized Dark",
- "kimbie_dark": "Kimbie Dark",
- "custom": "Kustom"
- },
- "custom_theme": {
- "background_color": "Latar belakang dasar",
- "selected_background_color": "Latar belakang fokus",
- "global_header_color": "Menu akun",
- "side_menu_color": "Menu samping",
- "primary_color": "Font utama",
- "regular_color": "Font reguler",
- "secondary_color": "Font sekunder",
- "border_color": "Tepian",
- "header_menu_color": "Menu header",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Ukuran font",
- "font_family": "Jenis font",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Tampilan nama dan nama pengguna",
- "display_name": "Nama tampilan",
- "username": "Nama pengguna"
- },
- "time_format": {
- "title": "Format waktu",
- "absolute": "Absolut",
- "relative": "Relatif"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Akun",
- "connected": "Connected accounts",
- "username": "Nama pengguna",
- "domain": "Domain",
- "association": "Asosiasi",
- "order": "Urutan",
- "remove_association": "Hapus asosiasi",
- "remove_all_associations": "Hapus semua asosiasi",
- "confirm": "Konfirmasi",
- "cancel": "Batalkan",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Jaringan",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Tidak ada proksi",
- "system": "Gunakan proksi sistem",
- "manual": "Konfigurasi proksi manual",
- "protocol": "Protokol",
- "host": "Host proksi",
- "port": "Port proksi",
- "username": "Nama pengguna proksi",
- "password": "Kata sandi proksi",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Simpan"
- },
- "language": {
- "title": "Bahasa",
- "language": {
- "title": "Bahasa",
- "description": "Pilih bahasa yang ingin kamu gunakan di Whalebird."
- },
- "spellchecker": {
- "title": "Periksa Ejaan",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Lompat ke..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Nama akun"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Batal",
- "ok": "Bisu"
- },
- "shortcut": {
- "title": "Pintasan keyboard",
- "ctrl_number": "Ganti akun",
- "ctrl_k": "Lompat ke linimasa lain",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Tutup halaman ini"
- },
- "report": {
- "title": "Report this user",
- "comment": "Komentar tambahan",
- "cancel": "Batalkan",
- "ok": "Laporkan"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Selengkapnya",
- "hide": "Sembunyikan",
- "sensitive": "Tampilkan konten sensitif",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Bisukan",
- "block": "Blokir",
- "report": "Laporkan",
- "delete": "Hapus",
- "via": "melalui {{application}}",
- "reply": "Balas",
- "reblog": "Boost",
- "fav": "Favorit",
- "detail": "Post details",
- "bookmark": "Markah",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Beri suara",
- "votes_count": "suara",
- "until": "hingga {{datetime}}",
- "left": "sisa {{datetime}}",
- "refresh": "Muat ulang"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Muat lebih status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Mengikuti anda",
- "doesnt_follow_you": "Tidak mengikuti anda",
- "detail": "Rincian",
- "follow": "Ikuti pengguna ini",
- "unfollow": "Berhenti ikuti pengguna ini",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Meminta permintaan mengikuti",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Bisukan",
- "unmute": "Buka bisu",
- "unblock": "Buka blokir",
- "block": "Blokir",
- "toots": "Posts",
- "follows": "Mengikuti",
- "followers": "Pengikut"
- }
- },
- "follow_requests": {
- "accept": "Setuju",
- "reject": "Tolak"
- },
- "hashtag": {
- "tag_name": "Nama tag",
- "delete_tag": "Hapus tag",
- "save_tag": "Simpan tag"
- },
- "search": {
- "search": "Pencarian",
- "account": "Akun",
- "tag": "Tagar",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Daftar Baru",
- "edit": "Sunting",
- "delete": {
- "confirm": {
- "title": "Konfirmasi",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Hapus",
- "cancel": "Batal"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " sini",
- "search": "Cari",
- "login": "Masuk"
- },
- "authorize": {
- "manually_1": "Halaman otorisasi telah dibuka di perambanmu.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Mohon masukkan setelah kamu mengotorisasi di perambanmu.",
- "submit": "Otorisasi"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Gagal memuat akun",
- "account_remove_error": "Gagal menghapus akun",
- "preferences_load_error": "Gagal memuat preferensi",
- "timeline_fetch_error": "Gagal memuat linimasa",
- "notification_fetch_error": "Gagal memuat pemberitahuan",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Gagal menerima permintaan mengikuti",
- "follow_request_reject_error": "Gagal menolak permintaan mengikuti",
- "attach_error": "Tidak dapat melampirkan berkas",
- "authorize_duplicate_error": "Tidak dapat masuk di akun yang sama dari domain yang sama",
- "authorize_error": "Gagal otorisasi",
- "followers_fetch_error": "Gagal memuat pengikut",
- "follows_fetch_error": "Gagal memuat mengikuti",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Gagal memuat pengguna",
- "unfollow_error": "Gagal tidak mengikuti pengguna",
- "subscribe_error": "Gagal berlangganan ke pengguna",
- "unsubscribe_error": "Gagal tidak berlangganan ke pengguna",
- "lists_fetch_error": "Gagal memuat daftar",
- "list_create_error": "Gagal membuat daftar",
- "members_fetch_error": "Gagal memuat anggota",
- "remove_user_error": "Gagal menghapus pengguna",
- "find_account_error": "Akun tidak ditemukan",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Gagal memfavoritkan",
- "unfavourite_error": "Gagal unfavorit",
- "bookmark_error": "Gagal memarkah",
- "unbookmark_error": "Gagal menghapus markah",
- "delete_error": "Failed to delete the post",
- "search_error": "Gagal mencari",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Gagal memutakhirkan daftar anggota",
- "add_user_error": "Gagal menambahkan pengguna",
- "authorize_url_error": "Gagal mendapatkan url otorisasi",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Memuat...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Gagal memutakhirkan filter",
- "create_filter_error": "Gagal membuat filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "Nama domain diperlukan",
- "domain_format": "Mohon masukkan nama domain"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} sekarang mengikuti anda"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/is/translation.json b/src/config/locales/is/translation.json
deleted file mode 100644
index 5a1de1c8..00000000
--- a/src/config/locales/is/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Um Whalebird",
- "preferences": "Kjörstillingar",
- "shortcuts": "Flýtileiðir á lyklaborði",
- "services": "Þjónustur",
- "hide": "Fela Whalebird",
- "hide_others": "Fela annað",
- "show_all": "Sýna allt",
- "open": "Opna glugga",
- "quit": "Quit"
- },
- "edit": {
- "name": "Breyta",
- "undo": "Afturkalla",
- "redo": "Endurtaka",
- "cut": "Klippa",
- "copy": "Afrita",
- "paste": "Líma",
- "select_all": "Velja allt"
- },
- "view": {
- "name": "Skoðun",
- "toggle_full_screen": "Víxla skjáfylli af/á"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Gluggi",
- "close": "Loka glugga",
- "open": "Opna glugga",
- "minimize": "Lágmarka",
- "jump_to": "Hoppa í"
- },
- "help": {
- "name": "Hjálp",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Bæta við nýjum aðgangi"
- },
- "side_menu": {
- "profile": "Notandasnið",
- "show_profile": "Birta notandasnið",
- "edit_profile": "Breyta notandasniði",
- "settings": "Account settings",
- "collapse": "Fella saman",
- "expand": "Fletta út",
- "home": "Heim",
- "notification": "Tilkynningar",
- "direct": "Bein skilaboð",
- "follow_requests": "Beiðnir um að fylgjast með",
- "favourite": "Eftirlæti",
- "bookmark": "Bókamerki",
- "local": "Staðvær tímalína",
- "public": "Sameiginleg tímalína",
- "hashtag": "Myllumerki",
- "search": "Leita",
- "lists": "Listar"
- },
- "header_menu": {
- "home": "Heim",
- "notification": "Tilkynningar",
- "favourite": "Eftirlæti",
- "bookmark": "Bókamerki",
- "follow_requests": "Beiðnir um að fylgjast með",
- "direct_messages": "Bein skilaboð",
- "local": "Staðvær tímalína",
- "public": "Sameiginleg tímalína",
- "hashtag": "Myllumerki",
- "search": "Leita",
- "lists": "Listar",
- "members": "Meðlimir",
- "reload": "Endurlesa"
- },
- "settings": {
- "title": "Stillingar",
- "general": {
- "title": "Almennt",
- "toot": {
- "title": "Færslur",
- "visibility": {
- "description": "Sjálfgefinn sýnileiki færslna",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Opinbert",
- "unlisted": "Óskráð",
- "private": "Einka",
- "direct": "Beint"
- },
- "sensitive": {
- "description": "Sjálfgefið merkja myndefni sem viðkvæmt"
- }
- }
- },
- "timeline": {
- "title": "Tímalína",
- "use_marker": {
- "title": "Hlaða inn tímalínunni þar sem síðast var verið að skoða",
- "home": "Heim",
- "notifications": "Tilkynningar"
- }
- },
- "filters": {
- "title": "Síur",
- "form": {
- "phrase": "Stikkorð eða setning",
- "expire": "Rennur út eftir",
- "context": "Sía samhengi",
- "irreversible": "Fella niður í staðinn fyrir að fela",
- "whole_word": "Heil orð",
- "submit": "Senda inn",
- "cancel": "Hætta við"
- },
- "expires": {
- "never": "Aldrei",
- "30_minutes": "30 mínútur",
- "1_hour": "1 klukkustund",
- "6_hours": "6 klukkustundir",
- "12_hours": "12 klukkustundir",
- "1_day": "1 dagur",
- "1_week": "1 vika"
- },
- "new": {
- "title": "Nýtt"
- },
- "edit": {
- "title": "Breyta"
- },
- "delete": {
- "title": "Eyða",
- "confirm": "Ertu viss um að þú viljir eyða þessari síu?",
- "confirm_ok": "Eyða",
- "confirm_cancel": "Hætta við"
- }
- }
- },
- "preferences": {
- "title": "Kjörstillingar",
- "general": {
- "title": "Almennt",
- "sounds": {
- "title": "Hljóð",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Tímalína",
- "description": "Customize how your timelines are displayed",
- "cw": "Alltaf fletta út færslum sem eru með aðvörun vegna efnis.",
- "nsfw": "Alltaf birta myndefni.",
- "hideAllAttachments": "Alltaf fela myndefni."
- },
- "other": {
- "title": "Aðrir valkostir",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Frumstilla kjörstillingar"
- }
- },
- "appearance": {
- "title": "Útlit",
- "theme_color": "Litastef",
- "theme": {
- "system": "Kerfis",
- "light": "Ljóst",
- "dark": "Dökkt",
- "solarized_light": "SólaríseraðLjóst",
- "solarized_dark": "SólaríseraðDökkt",
- "kimbie_dark": "KimbieDökkt",
- "custom": "Sérsniðið"
- },
- "custom_theme": {
- "background_color": "Aðalbakgrunnur",
- "selected_background_color": "Bakgrunnur við virkni",
- "global_header_color": "Valmynd notandaaðgangs",
- "side_menu_color": "Hliðarvalmynd",
- "primary_color": "Aðalletur",
- "regular_color": "Venjulegt letur",
- "secondary_color": "Aukaletur",
- "border_color": "Jaðar",
- "header_menu_color": "Valmynd í haus",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Leturstærð",
- "font_family": "Leturgerð",
- "toot_padding": "Fylling í kringum færslur",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Birtingarnafn og notandanafn",
- "display_name": "Birtingarnafn",
- "username": "Notandanafn"
- },
- "time_format": {
- "title": "Tímasnið",
- "absolute": "Algilt",
- "relative": "Hlutfallslegt"
- }
- },
- "notification": {
- "title": "Tilkynningar",
- "enable": {
- "description": "Láta mig vita þegar ég fæ...",
- "reply": "Svör",
- "reblog": "Endurbirtingar",
- "favourite": "Eftirlæti",
- "follow": "Nýja fylgjendur",
- "reaction": "Emoji reactions",
- "follow_request": "Beiðnir um að fylgjast með",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Notandaaðgangur",
- "connected": "Connected accounts",
- "username": "Notandanafn",
- "domain": "Lén",
- "association": "Tengsl",
- "order": "Röðun",
- "remove_association": "Fjarlægja tengsl",
- "remove_all_associations": "Fjarlægja öll tengsl",
- "confirm": "Staðfesta",
- "cancel": "Hætta við",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Netkerfi",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Enginn milliþjónn",
- "system": "Nota milliþjón kerfis",
- "manual": "Handvirk uppsetning milliþjóns (proxy)\n",
- "protocol": "Samskiptamáti",
- "host": "Hýsilvél milliþjóns",
- "port": "Gátt milliþjóns",
- "username": "Notandanafn á milliþjóni",
- "password": "Lykilorð á milliþjóni",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Vista"
- },
- "language": {
- "title": "Tungumál",
- "language": {
- "title": "Tungumál",
- "description": "Veldu tungumálið sem þú vilt nota í Whalebird."
- },
- "spellchecker": {
- "title": "Yfirfara stafsetningu",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Hoppa á..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Heiti notandaaðgangs"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Hætta við",
- "ok": "Þagga niður"
- },
- "shortcut": {
- "title": "Flýtileiðir á lyklaborði",
- "ctrl_number": "Skipta um notandaaðgang",
- "ctrl_k": "Hoppa á aðrar tímalínur",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Loka núverandi síðu"
- },
- "report": {
- "title": "Report this user",
- "comment": "Aðrar athugasemdir",
- "cancel": "Hætta við",
- "ok": "Tilkynna"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Sýna meira",
- "hide": "Fela",
- "sensitive": "Birta viðkvæmt myndefni",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Þagga niður",
- "block": "Útiloka",
- "report": "Tilkynna",
- "delete": "Eyða",
- "via": "með {{application}}",
- "reply": "Svara",
- "reblog": "Endurbirta",
- "fav": "Eftirlæti",
- "detail": "Post details",
- "bookmark": "Bókamerki",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Greiða atkvæði",
- "votes_count": "atkvæði",
- "until": "til {{datetime}}",
- "left": "{{datetime}} eftir",
- "refresh": "Endurlesa"
- },
- "open_account": {
- "title": "Notandaaðgangur fannst ekki",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Opna",
- "cancel": "Hætta við"
- }
- },
- "status_loading": {
- "message": "Hlaða inn fleiri stöðufærslum"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Fylgir þér",
- "doesnt_follow_you": "Fylgist ekki með þér",
- "detail": "Nánar",
- "follow": "Fylgjast með þessum notanda",
- "unfollow": "Hætta að fylgjast með þessum notanda",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Beðið um að fylgja",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Þagga niður",
- "unmute": "Ekki þagga",
- "unblock": "Aflétta útilokun",
- "block": "Útiloka",
- "toots": "Færslur",
- "follows": "Fylgist með",
- "followers": "Fylgjendur"
- }
- },
- "follow_requests": {
- "accept": "Samþykkja",
- "reject": "Hafna"
- },
- "hashtag": {
- "tag_name": "Heiti merkis",
- "delete_tag": "Eyða merki",
- "save_tag": "Vista merki"
- },
- "search": {
- "search": "Leita",
- "account": "Notandaaðgangur",
- "tag": "Myllumerki",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Nýr listi",
- "edit": "Breyta",
- "delete": {
- "confirm": {
- "title": "Staðfesta",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Eyða",
- "cancel": "Hætta við"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " hér",
- "search": "Leita",
- "login": "Innskráning"
- },
- "authorize": {
- "manually_1": "Auðkenningarsíða hefur opnast í vafranum þínum.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Sendu inn eftir að þú hefur auðkennt þig í vafranum þínum.",
- "submit": "Senda inn"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Mistókst að hlaða inn notendaaðgöngum",
- "account_remove_error": "Mistókst að fjarlægja notandaaðganginn",
- "preferences_load_error": "Mistókst að hlaða inn kjörstillingum",
- "timeline_fetch_error": "Mistókst að sækja tímalínu",
- "notification_fetch_error": "Mistókst að sækja tilkynningar",
- "favourite_fetch_error": "Mistókst að sækja eftirlæti",
- "bookmark_fetch_error": "Mistókst að sækja bókamerki",
- "follow_request_accept_error": "Mistókst að samþykkja beiðnina",
- "follow_request_reject_error": "Mistókst að hafna beiðninni",
- "attach_error": "Gat ekki hengt við skrána",
- "authorize_duplicate_error": "Get ekki skráð inn sama aðgang af sama léni",
- "authorize_error": "Tókst ekki að auðkenna",
- "followers_fetch_error": "Mistókst að sækja fylgjendur",
- "follows_fetch_error": "Mistókst að sækja þá sem fylgst er með",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Mistókst að fylgjast með notandanum",
- "unfollow_error": "Mistókst að hætta að fylgjast með notandanum",
- "subscribe_error": "Mistókst að gerast áskrifandi að þessum notanda",
- "unsubscribe_error": "Mistókst að hætta sem áskrifandi að þessum notanda",
- "lists_fetch_error": "Mistókst að sækja lista",
- "list_create_error": "Mistókst að búa til lista",
- "members_fetch_error": "Mistókst að sækja meðlimi",
- "remove_user_error": "Mistókst að fjarlægja notandann",
- "find_account_error": "Notandaaðgangur fannst ekki",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Mistókst að setja í eftirlæti",
- "unfavourite_error": "FMistókst að taka úr eftirlætum",
- "bookmark_error": "Mistókst að vista bókamerki",
- "unbookmark_error": "Mistókst að fjarlægja bókamerki",
- "delete_error": "Failed to delete the post",
- "search_error": "Tókst ekki að leita",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Mistókst að uppfæra lista yfir meðlimi",
- "add_user_error": "Mistókst að bæta við notanda",
- "authorize_url_error": "Tókst ekki að fá auðkenningarslóð",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Hleð inn...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Mistókst að uppfæra síuna",
- "create_filter_error": "Mistókst að útbúa síuna"
- },
- "validation": {
- "login": {
- "require_domain_name": "Heiti léns er nauðsynlegt",
- "domain_format": "Settu einungis inn heiti lénsins"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "Nýtt eftirlæti",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "Nýr fylgjandi",
- "body": "{{username}} er núna að fylgjast með þér"
- },
- "follow_request": {
- "title": "Ný beiðni um að fylgjast með",
- "body": "Fékkst fylgjendabeiðni frá {{username}}"
- },
- "reblog": {
- "title": "Ný endurbirting",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Hætta við",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Bæta við myndum",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/it/translation.json b/src/config/locales/it/translation.json
deleted file mode 100644
index 9fe1382a..00000000
--- a/src/config/locales/it/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "A Proposito di Whalebird",
- "preferences": "Preferenze",
- "shortcuts": "Scorciatoie da tastiera",
- "services": "Servizi",
- "hide": "Nascondi Whalebird",
- "hide_others": "Nascondi altri",
- "show_all": "Mostra tutto",
- "open": "Apri finestra",
- "quit": "Esci"
- },
- "edit": {
- "name": "Modifica",
- "undo": "Annulla",
- "redo": "Ripeti",
- "cut": "Taglia",
- "copy": "Copia",
- "paste": "Incolla",
- "select_all": "Seleziona Tutto"
- },
- "view": {
- "name": "Visualizza",
- "toggle_full_screen": "Attiva/disattiva schermo intero"
- },
- "window": {
- "always_show_menu_bar": "Mostra sempre la barra dei menu",
- "name": "Finestra",
- "close": "Chiudi Finestra",
- "open": "Apri Finestra",
- "minimize": "Minimizza",
- "jump_to": "Salta a"
- },
- "help": {
- "name": "Aiuto",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Aggiungi nuovo account"
- },
- "side_menu": {
- "profile": "Profilo",
- "show_profile": "Mostra profilo",
- "edit_profile": "Modifica profilo",
- "settings": "Impostazioni account",
- "collapse": "Riduci",
- "expand": "Espandi",
- "home": "Pagina Iniziale",
- "notification": "Notifiche",
- "direct": "Messaggi diretti",
- "follow_requests": "Richieste di seguirti",
- "favourite": "Preferiti",
- "bookmark": "Segnalibri",
- "local": "Timeline locale",
- "public": "Timeline federata",
- "hashtag": "Hashtag",
- "search": "Cerca",
- "lists": "Liste"
- },
- "header_menu": {
- "home": "Pagina Iniziale",
- "notification": "Notifiche",
- "favourite": "Preferiti",
- "bookmark": "Segnalibri",
- "follow_requests": "Richieste di seguirti",
- "direct_messages": "Messaggi diretti",
- "local": "Timeline locale",
- "public": "Timeline federata",
- "hashtag": "Hashtag",
- "search": "Cerca",
- "lists": "Liste",
- "members": "Membri",
- "reload": "Ricarica"
- },
- "settings": {
- "title": "Impostazioni",
- "general": {
- "title": "Generali",
- "toot": {
- "title": "Post",
- "visibility": {
- "description": "Visibilità predefinita del post",
- "notice": "Questa impostazione si applica solo ai nuovi post; le risposte seguiranno le impostazioni di visibilità del post principale.",
- "public": "Pubblico",
- "unlisted": "Non elencato",
- "private": "Privato",
- "direct": "Diretto"
- },
- "sensitive": {
- "description": "Contrassegna i contenuti multimediali come sensibili per impostazione predefinita"
- }
- }
- },
- "timeline": {
- "title": "Cronologia",
- "use_marker": {
- "title": "Carica la timeline dall'ultima posizione di lettura",
- "home": "Pagina Iniziale",
- "notifications": "Notifiche"
- }
- },
- "filters": {
- "title": "Filtri",
- "form": {
- "phrase": "Parola chiave o frase",
- "expire": "Scade dopo",
- "context": "Contesti del filtro",
- "irreversible": "Ignorare invece di nascondere",
- "whole_word": "Parola intera",
- "submit": "Invia",
- "cancel": "Annulla"
- },
- "expires": {
- "never": "Mai",
- "30_minutes": "30 minuti",
- "1_hour": "1 ora",
- "6_hours": "6 ore",
- "12_hours": "12 ore",
- "1_day": "1 giorno",
- "1_week": "1 settimana"
- },
- "new": {
- "title": "Nuovo"
- },
- "edit": {
- "title": "Modifica"
- },
- "delete": {
- "title": "Elimina",
- "confirm": "Sei sicuro di voler eliminare questo filtro?",
- "confirm_ok": "Elimina",
- "confirm_cancel": "Annulla"
- }
- }
- },
- "preferences": {
- "title": "Preferenze",
- "general": {
- "title": "Generali",
- "sounds": {
- "title": "Suoni",
- "description": "Riproduci suoni quando",
- "fav_rb": "Preferisci o potenzi un post",
- "toot": "Crei un post"
- },
- "timeline": {
- "title": "Cronologia",
- "description": "Personalizza la visualizzazione delle tue timeline",
- "cw": "Espandere sempre i post contrassegnati da avvisi di contenuto.",
- "nsfw": "Visualizza sempre i contenuti multimediali.",
- "hideAllAttachments": "Nascondi sempre i contenuti multimediali."
- },
- "other": {
- "title": "Altre opzioni",
- "launch": "Esegui Whalebird all'avvio",
- "hideOnLaunch": "Nascondi la finestra Whalebird all'avvio"
- },
- "reset": {
- "button": "Ripristina preferenze"
- }
- },
- "appearance": {
- "title": "Aspetto",
- "theme_color": "Temi cromatici",
- "theme": {
- "system": "Sistema",
- "light": "Chiaro",
- "dark": "Scuro",
- "solarized_light": "Chiaro Solarizzato",
- "solarized_dark": "Scuro Solarizzato",
- "kimbie_dark": "KimbieDark",
- "custom": "Personalizzato"
- },
- "custom_theme": {
- "background_color": "Sfondo di base",
- "selected_background_color": "Sfondo focalizzato",
- "global_header_color": "Menu account",
- "side_menu_color": "Menu laterale",
- "primary_color": "Carattere primario",
- "regular_color": "Carattere regolare",
- "secondary_color": "Carattere secondario",
- "border_color": "Bordo",
- "header_menu_color": "Menu di intestazione",
- "wrapper_mask_color": "Wrapper finestra di dialogo"
- },
- "font_size": "Dimensione carattere",
- "font_family": "Tipo di carattere",
- "toot_padding": "Padding attorno ai post",
- "display_style": {
- "title": "Stile visualizzazione nome utente",
- "display_name_and_username": "Visualizza nome e nome utente",
- "display_name": "Visualizza nome",
- "username": "Nome utente"
- },
- "time_format": {
- "title": "Formato orario",
- "absolute": "Assoluto",
- "relative": "Relativo"
- }
- },
- "notification": {
- "title": "Notifiche",
- "enable": {
- "description": "Avvisami quando ricevo...",
- "reply": "Risposte",
- "reblog": "Potenziamenti",
- "favourite": "Preferiti",
- "follow": "Nuovi follower",
- "reaction": "Reazioni emoji",
- "follow_request": "Richieste di seguirti",
- "status": "Notifiche di stato",
- "poll_vote": "Voti del sondaggio",
- "poll_expired": "Conclusione di un sondaggio"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Account collegati",
- "username": "Nome utente",
- "domain": "Dominio",
- "association": "Associazione",
- "order": "Ordina",
- "remove_association": "Rimuovi associazione",
- "remove_all_associations": "Rimuovi tutte le associazioni",
- "confirm": "Conferma",
- "cancel": "Annulla",
- "confirm_message": "Sei sicuro di voler rimuovere tutte le associazioni?"
- },
- "network": {
- "title": "Rete",
- "proxy": {
- "title": "Configurazione proxy",
- "no": "Nessun proxy",
- "system": "Usa proxy di sistema",
- "manual": "Configurazione proxy manuale",
- "protocol": "Protocollo",
- "host": "Host",
- "port": "Porta",
- "username": "Nome utente",
- "password": "Password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Salva"
- },
- "language": {
- "title": "Lingua",
- "language": {
- "title": "Lingua",
- "description": "Scegli la lingua che vuoi utilizzare con Whalebird."
- },
- "spellchecker": {
- "title": "Controllo ortografico",
- "enabled": "Abilita il controllo ortografico"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Salta a..."
- },
- "add_list_member": {
- "title": "Aggiungi membro alla Lista",
- "account_name": "Nome utente"
- },
- "list_membership": {
- "title": "Elenco membri"
- },
- "mute_confirm": {
- "title": "Silenzia utente",
- "body": "Sei sicuro di voler disattivare le notifiche da questo utente?",
- "cancel": "Annulla",
- "ok": "Silenzia"
- },
- "shortcut": {
- "title": "Scorciatoie da Tastiera",
- "ctrl_number": "Passa ad un altro account",
- "ctrl_k": "Salta ad altre cronologie",
- "ctrl_enter": "Pubblica il post",
- "ctrl_r": "Aggiorna la timeline corrente",
- "j": "Seleziona il post successivo",
- "k": "Seleziona il post precedente",
- "r": "Rispondi al post selezionato",
- "b": "Potenzia il post selezionato",
- "f": "Preferisci il post selezionato",
- "o": "Visualizza i dettagli del post selezionato",
- "p": "Mostra il profilo dell'autore del post selezionato",
- "i": "Apre le immagini del post selezionato",
- "x": "Mostra/nascondi post con avviso di contenuto",
- "?": "Mostra questa finestra di dialogo",
- "esc": "Chiudi la pagina corrente"
- },
- "report": {
- "title": "Segnala questo utente",
- "comment": "Commenti aggiuntivi",
- "cancel": "Annulla",
- "ok": "Segnala"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Mostra tutto",
- "hide": "Nascondi",
- "sensitive": "Mostra contenuti sensibili",
- "view_toot_detail": "Visualizza dettagli post",
- "open_in_browser": "Apri nel browser",
- "copy_link_to_toot": "Copia link del post",
- "mute": "Silenzia",
- "block": "Blocca",
- "report": "Segnala",
- "delete": "Cancella",
- "via": "tramite {{application}}",
- "reply": "Rispondi",
- "reblog": "Potenzia",
- "fav": "Preferisci",
- "detail": "Dettagli post",
- "bookmark": "Segnalibro",
- "pinned": "Post fissato",
- "poll": {
- "vote": "Vota",
- "votes_count": "voti",
- "until": "fino a {{datetime}}",
- "left": "{{datetime}} mancanti",
- "refresh": "Aggiorna"
- },
- "open_account": {
- "title": "Account non trovato",
- "text": "Impossibili a trovare {{account}} sul server. Vuoi aprire l'account in un browser?",
- "ok": "Apri",
- "cancel": "Annulla"
- }
- },
- "status_loading": {
- "message": "Carica più stati"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Ti segue",
- "doesnt_follow_you": "Non ti segue",
- "detail": "Dettagli",
- "follow": "Segui questo utente",
- "unfollow": "Smetti di seguire questo utente",
- "subscribe": "Iscriviti a questo utente",
- "unsubscribe": "Annulla la sottoscrizione a questo utente",
- "follow_requested": "Richieste di seguirti",
- "open_in_browser": "Apri nel browser",
- "manage_list_memberships": "Gestisci le iscrizioni alla lista",
- "mute": "Silenzia",
- "unmute": "Non silenziare",
- "unblock": "Sblocca",
- "block": "Blocca",
- "toots": "Post",
- "follows": "Seguiti",
- "followers": "Seguaci"
- }
- },
- "follow_requests": {
- "accept": "Accetta",
- "reject": "Rifiuta"
- },
- "hashtag": {
- "tag_name": "Cerca tag",
- "delete_tag": "Cancella tag",
- "save_tag": "Salva tag"
- },
- "search": {
- "search": "Cerca",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Parola chiave",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Nuova Lista",
- "edit": "Modifica",
- "delete": {
- "confirm": {
- "title": "Conferma",
- "message": "Questo elenco verrà eliminato definitivamente. Sei sicuro di voler continuare?",
- "ok": "Elimina",
- "cancel": "Annulla"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Benvenuto in Whalebird! Inserisci il dominio del server per accedere ad un account.",
- "proxy_info": "Se è necessario utilizzare un server proxy, configuralo",
- "proxy_here": "qui",
- "search": "Cerca",
- "login": "Accesso"
- },
- "authorize": {
- "manually_1": "Una pagina di autorizzazione è stata aperta nel tuo browser.",
- "manually_2": "Se non è ancora stato aperto, vai manualmente al seguente URL:",
- "code_label": "Inserisci il codice di autorizzazione:",
- "misskey_label": "Si prega di inviare dopo l'autorizzazione nel browser.",
- "submit": "Sottoscrivi"
- },
- "receive_drop": {
- "drop_message": "Trascina qui per allegare un file"
- },
- "message": {
- "account_load_error": "Impossibile caricare l'account",
- "account_remove_error": "Impossibile rimuovere l'account",
- "preferences_load_error": "Impossibile caricare le preferenze",
- "timeline_fetch_error": "Impossibile recuperare la cronologia",
- "notification_fetch_error": "Impossibile recuperare le notifiche",
- "favourite_fetch_error": "Recupero dei preferiti non riuscito",
- "bookmark_fetch_error": "Recupero dei segnalibri non riuscito",
- "follow_request_accept_error": "Impossibile accettare la richiesta",
- "follow_request_reject_error": "Impossibile rifiutare la richiesta",
- "attach_error": "Non è stato possibile allegare il file",
- "authorize_duplicate_error": "Non è possibile accedere allo stesso account dello stesso dominio",
- "authorize_error": "Autorizzazione fallita",
- "followers_fetch_error": "Impossibile recuperare l'elenco dei seguaci",
- "follows_fetch_error": "Impossibile recuperare l'elenco dei seguiti",
- "toot_fetch_error": "Recupero dei dettagli del post non riuscito",
- "follow_error": "Impossibile seguire l'utente",
- "unfollow_error": "Impossibile smettere di seguire l'utente",
- "subscribe_error": "Impossibile iscriversi all'utente",
- "unsubscribe_error": "Impossibile annullare la sottoscrizione all'utente",
- "lists_fetch_error": "Impossibile recuperale le liste",
- "list_create_error": "Impossibile creare la lista",
- "members_fetch_error": "Impossibile recuperare la lista dei membri",
- "remove_user_error": "Impossibile rimuovere l'utente",
- "find_account_error": "Account non trovato",
- "reblog_error": "Impossibile potenziare",
- "unreblog_error": "Impossibile depotenziare",
- "favourite_error": "Impossibile aggiungere ai preferiti",
- "unfavourite_error": "Impossibile rimuovere dai preferiti",
- "bookmark_error": "Aggiunta del segnalibro fallita",
- "unbookmark_error": "Rimozione del segnalibro fallita",
- "delete_error": "Impossibile eliminare il post",
- "search_error": "Impossibile eseguire la ricerca",
- "toot_error": "Impossibile creare il post",
- "update_list_memberships_error": "Impossibile aggiornare le iscrizioni alla lista",
- "add_user_error": "Impossibile aggiungere un utente",
- "authorize_url_error": "Impossibile ottenere l'URL di autorizzazione",
- "domain_confirmed": "{{domain}} è confermato, per favore accedi",
- "domain_doesnt_exist": "Impossibile connettersi a {{domain}}, assicurarsi che l'URL del server sia valido o corretto.",
- "loading": "Caricamento...",
- "language_not_support_spellchecker_error": "Questa lingua non è supportata dal correttore ortografico",
- "update_filter_error": "Aggiornamento del filtro non riuscito",
- "create_filter_error": "Creazione del filtro non riuscita"
- },
- "validation": {
- "login": {
- "require_domain_name": "È richiesto un nome dominio",
- "domain_format": "Per fovore, inserire solo il nome dominio"
- },
- "compose": {
- "toot_length": "La lunghezza del post deve essere compresa tra {{min}} e {{max}}",
- "attach_length": "È possibile allegare solo fino a {{max}} immagine",
- "attach_length_plural": "È possibile allegare solo fino a {{max}} immagini",
- "attach_image": "È possibile allegare solo immagini o video",
- "poll_invalid": "Scelte sondaggio non valide"
- }
- },
- "notification": {
- "favourite": {
- "title": "Nuovo preferito",
- "body": "{{username}} ha preferito il tuo post"
- },
- "follow": {
- "title": "Nuovo seguace",
- "body": "{{username}} ha iniziato a seguirti"
- },
- "follow_request": {
- "title": "Nuova richiesta di seguirti",
- "body": "Ricevuta una richiesta di seguirti da {{username}}"
- },
- "reblog": {
- "title": "Nuovo potenziamento",
- "body": "{{username}} ha potenziato il tuo post"
- },
- "quote": {
- "title": "Nuova citazione",
- "body": "{{username}} ha citato il tuo post"
- },
- "reaction": {
- "title": "Nuova reazione",
- "body": "{{username}} ha reagito al tuo post"
- },
- "status": {
- "title": "Nuovo post",
- "body": "{{username}} ha creato un nuovo post"
- },
- "poll_vote": {
- "title": "Nuovo voto al sondaggio",
- "body": "{{username}} ha votato il tuo sondaggio"
- },
- "poll_expired": {
- "title": "Sondaggio concluso",
- "body": "Il sondaggio di {{username}} è concluso"
- }
- },
- "compose": {
- "title": "Nuovo post",
- "cw": "Scrivi qui il tuo avviso",
- "status": "A cosa stai pensando?",
- "cancel": "Annulla",
- "toot": "Posta",
- "description": "Aggiungi testo alternativo per questo contenuto multimediale",
- "footer": {
- "add_image": "Aggiungi immagini",
- "poll": "Aggiungi un sondaggio",
- "change_visibility": "Modifica visibilità",
- "change_sensitive": "Contrassegnare il contenuto multimediale come sensibile",
- "add_cw": "Aggiungi avvisi di contenuto",
- "pined_hashtag": "Hashtag fissato"
- },
- "poll": {
- "add_choice": "Aggiungi un'opzione",
- "expires": {
- "5_minutes": "5 minuti",
- "30_minutes": "30 minuti",
- "1_hour": "1 ora",
- "6_hours": "6 ore",
- "1_day": "1 giorno",
- "3_days": "3 giorni",
- "7_days": "7 giorni"
- }
- }
- }
-}
diff --git a/src/config/locales/ja/translation.json b/src/config/locales/ja/translation.json
deleted file mode 100644
index c9e97ac6..00000000
--- a/src/config/locales/ja/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Whalebirdについて",
- "preferences": "設定",
- "shortcuts": "ショートカットキー",
- "services": "サービス",
- "hide": "Whalebirdを隠す",
- "hide_others": "ほかを隠す",
- "show_all": "すべてを表示",
- "open": "ウィンドウを開く",
- "quit": "終了"
- },
- "edit": {
- "name": "編集",
- "undo": "取り消す",
- "redo": "やり直す",
- "cut": "切り取り",
- "copy": "コピー",
- "paste": "ペースト",
- "select_all": "すべてを選択"
- },
- "view": {
- "name": "表示",
- "toggle_full_screen": "フルスクリーンの切り替え"
- },
- "window": {
- "always_show_menu_bar": "メニューを常に表示する",
- "name": "ウィンドウ",
- "close": "ウィンドウを閉じる",
- "open": "ウィンドウを表示",
- "minimize": "縮小",
- "jump_to": "移動"
- },
- "help": {
- "name": "ヘルプ",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "アカウントを追加"
- },
- "side_menu": {
- "profile": "プロフィール",
- "show_profile": "プロフィール確認",
- "edit_profile": "プロフィール編集",
- "settings": "アカウント設定",
- "collapse": "縮小",
- "expand": "拡大",
- "home": "ホーム",
- "notification": "通知",
- "direct": "DM",
- "follow_requests": "フォロー申請",
- "favourite": "お気に入り",
- "bookmark": "ブックマーク",
- "local": "ローカル",
- "public": "連合タイムライン",
- "hashtag": "ハッシュタグ",
- "search": "検索",
- "lists": "リスト"
- },
- "header_menu": {
- "home": "ホーム",
- "notification": "通知",
- "favourite": "お気に入り",
- "bookmark": "ブックマーク",
- "follow_requests": "フォロー申請",
- "direct_messages": "ダイレクトメッセージ",
- "local": "ローカルタイムライン",
- "public": "連合タイムライン",
- "hashtag": "ハッシュタグ",
- "search": "検索",
- "lists": "リスト",
- "members": "メンバー",
- "reload": "再読み込み"
- },
- "settings": {
- "title": "設定",
- "general": {
- "title": "一般",
- "toot": {
- "title": "投稿",
- "visibility": {
- "description": "投稿の公開設定を変更する",
- "notice": "この設定は新しい投稿にのみ適用され、返信は元の投稿の公開設定に従います。",
- "public": "公開",
- "unlisted": "未収載",
- "private": "フォロワー限定",
- "direct": "ダイレクト"
- },
- "sensitive": {
- "description": "メディアを常に閲覧注意として投稿する"
- }
- }
- },
- "timeline": {
- "title": "タイムライン",
- "use_marker": {
- "title": "前回読んだ位置からタイムラインを読み込む",
- "home": "ホーム",
- "notifications": "通知"
- }
- },
- "filters": {
- "title": "フィルター",
- "form": {
- "phrase": "キーワードまたはフレーズ",
- "expire": "有効期限",
- "context": "除外対象",
- "irreversible": "非表示ではなく除外",
- "whole_word": "単語全体にマッチ",
- "submit": "送信",
- "cancel": "キャンセル"
- },
- "expires": {
- "never": "なし",
- "30_minutes": "30分後",
- "1_hour": "1時間後",
- "6_hours": "6時間後",
- "12_hours": "12時間後",
- "1_day": "1日後",
- "1_week": "1週間後"
- },
- "new": {
- "title": "新規作成"
- },
- "edit": {
- "title": "編集"
- },
- "delete": {
- "title": "削除",
- "confirm": "このフィルターを本当に削除しますか?",
- "confirm_ok": "削除する",
- "confirm_cancel": "キャンセル"
- }
- }
- },
- "preferences": {
- "title": "設定",
- "general": {
- "title": "一般",
- "sounds": {
- "title": "効果音",
- "description": "操作時の効果音を設定",
- "fav_rb": "お気に入り、ブースト時",
- "toot": "投稿時"
- },
- "timeline": {
- "title": "タイムライン",
- "description": "タイムラインをカスタマイズ",
- "cw": "閲覧注意の投稿を常に展開する",
- "nsfw": "すべてのメディアを常に表示する",
- "hideAllAttachments": "全てのメディアを常に隠す"
- },
- "other": {
- "title": "その他",
- "launch": "ログイン時にアプリを起動する",
- "hideOnLaunch": "起動時にウィンドウを隠す"
- },
- "reset": {
- "button": "設定をリセット"
- }
- },
- "appearance": {
- "title": "外観",
- "theme_color": "テーマカラー",
- "theme": {
- "system": "システム",
- "light": "標準",
- "dark": "ダーク",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "カスタム"
- },
- "custom_theme": {
- "background_color": "背景色",
- "selected_background_color": "フォーカス時",
- "global_header_color": "アカウントメニュー",
- "side_menu_color": "サイドメニュー",
- "primary_color": "文字色1",
- "regular_color": "文字色2",
- "secondary_color": "文字色3",
- "border_color": "ボーダー",
- "header_menu_color": "ヘッダーメニュー",
- "wrapper_mask_color": "モーダル背景"
- },
- "font_size": "フォントサイズ",
- "font_family": "フォント",
- "toot_padding": "投稿周りの空白",
- "display_style": {
- "title": "ユーザー名の表示形式",
- "display_name_and_username": "表示名+ユーザー名",
- "display_name": "表示名",
- "username": "ユーザー名"
- },
- "time_format": {
- "title": "時間の表示形式",
- "absolute": "絶対表示",
- "relative": "相対表示"
- }
- },
- "notification": {
- "title": "通知",
- "enable": {
- "description": "通知を受け取るかどうかを設定",
- "reply": "返信があるとき",
- "reblog": "ブーストされたとき",
- "favourite": "お気に入りされたとき",
- "follow": "フォローされたとき",
- "reaction": "絵文字リアクションを受け取ったとき",
- "follow_request": "フォロー申請を受け取ったとき",
- "status": "投稿の通知を受け取ったとき",
- "poll_vote": "アンケートに投票されたとき",
- "poll_expired": "アンケートが終了したとき"
- }
- },
- "account": {
- "title": "アカウント",
- "connected": "登録済みアカウント",
- "username": "ユーザー名",
- "domain": "ドメイン名",
- "association": "連携",
- "order": "順序",
- "remove_association": "連携を削除",
- "remove_all_associations": "全ての連携を削除",
- "confirm": "確認",
- "cancel": "キャンセル",
- "confirm_message": "本当に全ての連携を削除しますか?"
- },
- "network": {
- "title": "ネットワーク",
- "proxy": {
- "title": "プロキシー設定",
- "no": "プロキシーを使わない",
- "system": "OSのプロキシー設定を利用する",
- "manual": "プロキシーを手動で設定する",
- "protocol": "プロトコル",
- "host": "ホスト",
- "port": "ポート",
- "username": "ユーザー名",
- "password": "パスワード",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "保存"
- },
- "language": {
- "title": "言語",
- "language": {
- "title": "言語",
- "description": "Whalebirdの表示言語を選択"
- },
- "spellchecker": {
- "title": "スペルチェック",
- "enabled": "スペルチェッカーを有効にする"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "移動..."
- },
- "add_list_member": {
- "title": "リストに追加",
- "account_name": "アカウント名"
- },
- "list_membership": {
- "title": "リストメンバー管理"
- },
- "mute_confirm": {
- "title": "本当にミュートしますか?",
- "body": "このユーザーからの通知をミュートしますか?",
- "cancel": "キャンセル",
- "ok": "ミュートする"
- },
- "shortcut": {
- "title": "キーボードショートカット",
- "ctrl_number": "アカウントの切り替え",
- "ctrl_k": "タイムラインの移動",
- "ctrl_enter": "投稿を送信",
- "ctrl_r": "タイムラインを更新",
- "j": "次の投稿を選択",
- "k": "前の投稿を選択",
- "r": "選択した投稿に返信",
- "b": "選択した投稿をブースト",
- "f": "選択した投稿をお気に入り",
- "o": "選択した投稿の詳細を表示",
- "p": "選択した投稿者のプロフィールを表示",
- "i": "選択した投稿の画像を開く",
- "x": "CWとNSFWの表示切り替え",
- "?": "このヘルプを表示",
- "esc": "ページを閉じる"
- },
- "report": {
- "title": "このユーザを報告する",
- "comment": "追加のコメント",
- "cancel": "キャンセル",
- "ok": "報告"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "続きを見る",
- "hide": "隠す",
- "sensitive": "閲覧注意コンテンツを表示する",
- "view_toot_detail": "詳細",
- "open_in_browser": "ブラウザで開く",
- "copy_link_to_toot": "コピー",
- "mute": "ミュート",
- "block": "ブロック",
- "report": "通報",
- "delete": "削除する",
- "via": "{{application}} より",
- "reply": "返信",
- "reblog": "ブースト",
- "fav": "お気に入り",
- "detail": "詳細",
- "bookmark": "ブックマーク",
- "pinned": "固定された投稿",
- "poll": {
- "vote": "投票",
- "votes_count": "投票",
- "until": "{{datetime}} まで",
- "left": "{{datetime}} まで",
- "refresh": "更新"
- },
- "open_account": {
- "title": "アカウントが見つかりません",
- "text": "サーバー上で {{account}} が見つかりませんでした。代わりにブラウザでアカウントを開きますか?",
- "ok": "開く",
- "cancel": "キャンセル"
- }
- },
- "status_loading": {
- "message": "さらにステータスを読み込む"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "フォローされています",
- "doesnt_follow_you": "フォローされていません",
- "detail": "詳細",
- "follow": "このユーザーをフォロー",
- "unfollow": "このユーザーのフォローを解除",
- "subscribe": "このユーザの投稿時に通知",
- "unsubscribe": "このユーザの投稿通知を解除",
- "follow_requested": "フォロー承認待ち",
- "open_in_browser": "ブラウザで開く",
- "manage_list_memberships": "リストの管理",
- "mute": "ミュート",
- "unmute": "ミュートを解除",
- "unblock": "ブロックを解除",
- "block": "ブロック",
- "toots": "投稿",
- "follows": "フォロー",
- "followers": "フォロワー"
- }
- },
- "follow_requests": {
- "accept": "承認",
- "reject": "却下"
- },
- "hashtag": {
- "tag_name": "タグ名",
- "delete_tag": "タグを削除",
- "save_tag": "タグを保存"
- },
- "search": {
- "search": "検索",
- "account": "アカウント",
- "tag": "ハッシュタグ",
- "keyword": "キーワード",
- "toot": "投稿"
- },
- "lists": {
- "index": {
- "new_list": "新規リスト",
- "edit": "編集",
- "delete": {
- "confirm": {
- "title": "確認",
- "message": "この操作は元に戻すことができません。このリストを完全に削除しますか?",
- "ok": "削除する",
- "cancel": "キャンセル"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Whalebirdへようこそ! サーバーのドメイン名を入力してアカウントにログインします。",
- "proxy_info": "もしプロキシーを利用する場合は",
- "proxy_here": "こちら.",
- "search": "検索",
- "login": "ログイン"
- },
- "authorize": {
- "manually_1": "認証用ページが自動的に開きます.",
- "manually_2": "もし開かない場合は、以下のURLから手動で認証用ページを開いてください。",
- "code_label": "ブラウザに表示された認証コードを貼り付けてください",
- "misskey_label": "ブラウザでこのアプリを許可した後に認証ボタンを押してください",
- "submit": "認証"
- },
- "receive_drop": {
- "drop_message": "ファイルをドロップしてください"
- },
- "message": {
- "account_load_error": "アカウントの読み込みに失敗しました",
- "account_remove_error": "アカウントの削除に失敗しました",
- "preferences_load_error": "設定の読み込みに失敗しました",
- "timeline_fetch_error": "タイムラインの読み込みに失敗しました",
- "notification_fetch_error": "通知の読み込みに失敗しました",
- "favourite_fetch_error": "お気に入りの読み込みに失敗しました",
- "bookmark_fetch_error": "ブークマークの読み込みに失敗しました",
- "follow_request_accept_error": "フォロー申請の承認に失敗しました",
- "follow_request_reject_error": "フォロー申請の却下に失敗しました",
- "attach_error": "ファイルを添付できませんでした",
- "authorize_duplicate_error": "同一ドメイン同一アカウントではログインできません",
- "authorize_error": "認証に失敗しました",
- "followers_fetch_error": "フォロワーの取得に失敗しました",
- "follows_fetch_error": "フォローの取得に失敗しました",
- "toot_fetch_error": "投稿の詳細の取得に失敗しました",
- "follow_error": "フォローに失敗しました",
- "unfollow_error": "フォロー解除に失敗しました",
- "subscribe_error": "通知設定に失敗しました",
- "unsubscribe_error": "通知解除に失敗しました",
- "lists_fetch_error": "リストの読み込みに失敗しました",
- "list_create_error": "リストの作成に失敗しました",
- "members_fetch_error": "メンバーの取得に失敗しました",
- "remove_user_error": "ユーザの削除に失敗しました",
- "find_account_error": "アカウントが見つかりません",
- "reblog_error": "ブーストに失敗しました",
- "unreblog_error": "ブーストの取り消しに失敗しました",
- "favourite_error": "お気に入りできませんでした",
- "unfavourite_error": "お気に入り解除に失敗しました",
- "bookmark_error": "ブックマークの追加に失敗しました",
- "unbookmark_error": "ブックマークの削除に失敗しました",
- "delete_error": "投稿の削除に失敗しました",
- "search_error": "検索に失敗しました",
- "toot_error": "投稿に失敗しました",
- "update_list_memberships_error": "リストメンバーの更新に失敗しました",
- "add_user_error": "メンバー追加に失敗しました",
- "authorize_url_error": "認証用URLの取得に失敗しました",
- "domain_confirmed": "{{domain}} が確認できました、ログインしてください",
- "domain_doesnt_exist": "{{domain}} への接続に失敗しました。サーバーの URL が正しいか正しいか確認してください。",
- "loading": "読み込み中...",
- "language_not_support_spellchecker_error": "この言語はスペルチェッカーではサポートされていません",
- "update_filter_error": "フィルターの更新に失敗しました",
- "create_filter_error": "フィルターの作成に失敗しました"
- },
- "validation": {
- "login": {
- "require_domain_name": "ドメイン名は必須です",
- "domain_format": "ドメイン名のみを入力してください"
- },
- "compose": {
- "toot_length": "投稿の長さは {{min}} から {{max}} の間でなければなりません",
- "attach_length": "添付ファイルは {{max}} 個までです",
- "attach_length_plural": "添付ファイルは {{max}} 個までです",
- "attach_image": "画像または動画のみ添付できます",
- "poll_invalid": "アンケートに不正な選択肢が含まれています"
- }
- },
- "notification": {
- "favourite": {
- "title": "お気に入り",
- "body": "{{username}} にお気に入り登録されました"
- },
- "follow": {
- "title": "フォロー",
- "body": "{{username}} さんにフォローされました"
- },
- "follow_request": {
- "title": "フォロー申請",
- "body": "{{username}} からフォロー申請を受け取りました"
- },
- "reblog": {
- "title": "ブースト",
- "body": "{{username}} があなたの投稿をブーストしました"
- },
- "quote": {
- "title": "引用",
- "body": "{{username}} があなたの投稿を引用しました"
- },
- "reaction": {
- "title": "リアクション",
- "body": "{{username}} があなたの投稿にリアクションしました"
- },
- "status": {
- "title": "投稿",
- "body": "{{username}} が新しい投稿を行いました"
- },
- "poll_vote": {
- "title": "アンケート投票",
- "body": "{{username}} があなたのアンケートに投票しました"
- },
- "poll_expired": {
- "title": "アンケート終了",
- "body": "{{username}} のアンケートが終了しました"
- }
- },
- "compose": {
- "title": "投稿",
- "cw": "ここに警告を書いてください",
- "status": "今なにしてる?",
- "cancel": "キャンセル",
- "toot": "投稿",
- "description": "メディアの説明を追加",
- "footer": {
- "add_image": "画像を添付",
- "poll": "アンケートを追加",
- "change_visibility": "公開範囲を変更",
- "change_sensitive": "メディアを閲覧注意にする",
- "add_cw": "コンテンツ警告を追加",
- "pined_hashtag": "ハッシュタグを固定する"
- },
- "poll": {
- "add_choice": "選択肢を追加",
- "expires": {
- "5_minutes": "5分後",
- "30_minutes": "30分後",
- "1_hour": "1時間後",
- "6_hours": "6時間後",
- "1_day": "1日後",
- "3_days": "3日後",
- "7_days": "7日後"
- }
- }
- }
-}
diff --git a/src/config/locales/ko/translation.json b/src/config/locales/ko/translation.json
deleted file mode 100644
index d5f217d8..00000000
--- a/src/config/locales/ko/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Whalebird 에 대하여",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "서비스",
- "hide": "Whalebird 숨기기",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "나가기"
- },
- "edit": {
- "name": "수정",
- "undo": "되돌리기",
- "redo": "다시 실행",
- "cut": "잘라내기",
- "copy": "복사",
- "paste": "붙여넣기",
- "select_all": "모두 선택"
- },
- "view": {
- "name": "보이기",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "창",
- "close": "창 닫기",
- "open": "창 열기",
- "minimize": "최소화",
- "jump_to": "이동"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "계정 추가"
- },
- "side_menu": {
- "profile": "프로필",
- "show_profile": "프로필 보기",
- "edit_profile": "프로필 수정",
- "settings": "Account settings",
- "collapse": "접기",
- "expand": "펼치기",
- "home": "홈",
- "notification": "Notifications",
- "direct": "메세지",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "로컬",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "검색",
- "lists": "리스트"
- },
- "header_menu": {
- "home": "홈",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "로컬",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "검색",
- "lists": "리스트",
- "members": "멤버",
- "reload": "새로고침"
- },
- "settings": {
- "title": "설정",
- "general": {
- "title": "일반",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "공개",
- "unlisted": "미등록",
- "private": "비공개",
- "direct": "다이렉트"
- },
- "sensitive": {
- "description": "자동으로 모든 미디어를 민감한 미디어로 분류"
- }
- }
- },
- "timeline": {
- "title": "타임라인",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "설정",
- "general": {
- "title": "일반",
- "sounds": {
- "title": "사운드",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "외관",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "밝은 테마",
- "dark": "어두운 테마",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "사용자 설정"
- },
- "custom_theme": {
- "background_color": "기본 배경 색상",
- "selected_background_color": "선택 배경 색상",
- "global_header_color": "계정 메뉴 색상",
- "side_menu_color": "사이드 바 색상",
- "primary_color": "기본 글꼴 색상",
- "regular_color": "레귤러 글꼴 색상",
- "secondary_color": "보조 글꼴 색상",
- "border_color": "경계선 색상",
- "header_menu_color": "헤더 메뉴 색상",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "글꼴 크기",
- "font_family": "글꼴 패밀리",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "닉네임과 아이디 모두 보이기",
- "display_name": "닉네임만 보이기",
- "username": "아이디만 보이기"
- },
- "time_format": {
- "title": "시간 표시 형식",
- "absolute": "고정 시각 표시",
- "relative": "상대 시간 표시"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "계정",
- "connected": "Connected accounts",
- "username": "닉네임",
- "domain": "도메인",
- "association": "연결된 계정",
- "order": "순서",
- "remove_association": "연결 해제",
- "remove_all_associations": "모든 연결 해제",
- "confirm": "확인",
- "cancel": "취소",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "언어",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "이동"
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "계정 이름"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "취소",
- "ok": "뮤트"
- },
- "shortcut": {
- "title": "키보드 단축키",
- "ctrl_number": "계정 변경",
- "ctrl_k": "다른 타임라인으로 이동",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "현재 페이지 닫기"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "더보기",
- "hide": "숨기기",
- "sensitive": "민감한 미디어 표시",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "뮤트",
- "block": "차단",
- "report": "신고",
- "delete": "삭제",
- "via": "{{application}} 에서",
- "reply": "답장하기",
- "reblog": "Boost",
- "fav": "즐겨찾기",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "사용자를 팔로잉 중입니다",
- "doesnt_follow_you": "사용자를 팔로잉하지 않습니다",
- "detail": "자세히",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "팔로우 요청중",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "뮤트",
- "unmute": "뮤트 해제",
- "unblock": "차단 해제",
- "block": "차단",
- "toots": "Posts",
- "follows": "팔로잉",
- "followers": "팔로워"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "태그 이름",
- "delete_tag": "태그 삭제",
- "save_tag": "태그 저장"
- },
- "search": {
- "search": "검색",
- "account": "계정",
- "tag": "해시태그",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "새 리스트",
- "edit": "수정",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "검색",
- "login": "로그인"
- },
- "authorize": {
- "manually_1": "브라우저에서 인증 페이지가 열렸어요.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "제출"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "계정을 읽어 올 수 없습니다",
- "account_remove_error": "계정을 제거할 수 없습니다",
- "preferences_load_error": "설정을 읽을 수 없습니다",
- "timeline_fetch_error": "타임라인을 가져올 수 없습니다",
- "notification_fetch_error": "알림을 가져올 수 없습니다",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "파일을 첨부할 수 없습니다",
- "authorize_duplicate_error": "같은 도메인의 같은 계정을 중복 등록할 수 없습니다",
- "authorize_error": "인증에 실패했습니다",
- "followers_fetch_error": "팔로워 정보를 가져올 수 없습니다",
- "follows_fetch_error": "팔로우 정보를 가져올 수 없습니다",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "사용자를 팔로우할 수 없습니다",
- "unfollow_error": "사용자를 언팔로우할 수 없습니다",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "리스트를 가져올 수 없습니다",
- "list_create_error": "리스트를 생성할 수 없습니다",
- "members_fetch_error": "멤버를 가져올 수 없습니다",
- "remove_user_error": "사용자를 제거할 수 없습니다",
- "find_account_error": "계정을 찾을 수 없습니다",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "즐겨찾기를 설정할 수 없습니다",
- "unfavourite_error": "즐겨찾기를 해제할 수 없습니다",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "찾을 수 없습니다",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "리스트 멤버를 업데이트할 수 없습니다",
- "add_user_error": "사용자를 추가할 수 없습니다",
- "authorize_url_error": "인증 URL을 가져올 수 없습니다",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "로딩중...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "도메인 주소가 필요합니다",
- "domain_format": "도메인 주소만 입력해주세요"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/no/translation.json b/src/config/locales/no/translation.json
deleted file mode 100644
index 9c7453d4..00000000
--- a/src/config/locales/no/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Om Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Tjenester",
- "hide": "Skjul Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Avslutt"
- },
- "edit": {
- "name": "Rediger",
- "undo": "Angre",
- "redo": "Gjør om",
- "cut": "Klipp ut",
- "copy": "Kopier",
- "paste": "Lim inn",
- "select_all": "Velg alle"
- },
- "view": {
- "name": "Vis",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Vindu",
- "close": "Lukk vindu",
- "open": "Åpne vindu",
- "minimize": "Minimer",
- "jump_to": "Gå til"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Legg til ny konto"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Vis profil",
- "edit_profile": "Rediger profil",
- "settings": "Account settings",
- "collapse": "Skjul",
- "expand": "Utvid",
- "home": "Hjem",
- "notification": "Notifications",
- "direct": "Direktemeldinger",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Lokal tidslinje",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Søk",
- "lists": "Lister"
- },
- "header_menu": {
- "home": "Hjem",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Lokal tidslinje",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Søk",
- "lists": "Lister",
- "members": "Medlemmer",
- "reload": "Last inn på nytt"
- },
- "settings": {
- "title": "Innstillinger",
- "general": {
- "title": "Generelt",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Offentlig",
- "unlisted": "Uoppført",
- "private": "Privat",
- "direct": "Direkte"
- },
- "sensitive": {
- "description": "Merk medier som sensitiv som standard"
- }
- }
- },
- "timeline": {
- "title": "Tidslinje",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Sekundær skrifttype",
- "border_color": "Kantlinje",
- "header_menu_color": "Topplinje meny",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Skriftstørrelse",
- "font_family": "Skrifttypefamilie",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove associations",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/pl/translation.json b/src/config/locales/pl/translation.json
deleted file mode 100644
index 7fcb34cb..00000000
--- a/src/config/locales/pl/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "O Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Usługi",
- "hide": "Ukryj Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Wyjdź"
- },
- "edit": {
- "name": "Edycja",
- "undo": "Cofnij",
- "redo": "Powtórz",
- "cut": "Wytnij",
- "copy": "Kopiuj",
- "paste": "Wklej",
- "select_all": "Zaznacz wszystko"
- },
- "view": {
- "name": "Widok",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Okno",
- "close": "Zamknij okno",
- "open": "Otwórz okno",
- "minimize": "Zminimalizuj",
- "jump_to": "Przejdź do"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Dodaj nowe konto"
- },
- "side_menu": {
- "profile": "Profil",
- "show_profile": "Pokaż profil",
- "edit_profile": "Edytuj profil",
- "settings": "Account settings",
- "collapse": "Zawalić się",
- "expand": "Rozszerzać",
- "home": "Strona główna",
- "notification": "Notifications",
- "direct": "Bezpośrednie wiadomości",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Lokalna oś czasu",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Wyszukiwanie",
- "lists": "Listy"
- },
- "header_menu": {
- "home": "Strona główna",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Lokalna oś czasu",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Wyszukiwanie",
- "lists": "Listy",
- "members": "Użytkownicy",
- "reload": "Przeładować"
- },
- "settings": {
- "title": "Ustawienia",
- "general": {
- "title": "Ogólne",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Publiczne",
- "unlisted": "Niewidoczne",
- "private": "Prywatne",
- "direct": "Bezpośrednie"
- },
- "sensitive": {
- "description": "Mark medias as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Oś czasu",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Całe słowo",
- "submit": "Submit",
- "cancel": "Anuluj"
- },
- "expires": {
- "never": "Nigdy",
- "30_minutes": "30 minut",
- "1_hour": "1 godzina",
- "6_hours": "6 godzin",
- "12_hours": "12 godzin",
- "1_day": "1 dzień",
- "1_week": "1 tydzień"
- },
- "new": {
- "title": "Nowy"
- },
- "edit": {
- "title": "Edytuj"
- },
- "delete": {
- "title": "Usuń",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Usuń",
- "confirm_cancel": "Anuluj"
- }
- }
- },
- "preferences": {
- "title": "Preferencje",
- "general": {
- "title": "Ogólne",
- "sounds": {
- "title": "Dźwięki",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Oś czasu",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Wygląd",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Jasny",
- "dark": "Ciemny",
- "solarized_light": "Solarized Light",
- "solarized_dark": "Solarized Dark",
- "kimbie_dark": "Kimbie Dark",
- "custom": "Własna"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Menu boczne",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Obramowanie",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Rozmiar czcionki",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Nazwa wyświetlana i nazwa użytkownika",
- "display_name": "Nazwa wyświetlana",
- "username": "Nazwa użytkownika"
- },
- "time_format": {
- "title": "Format godziny",
- "absolute": "Bezwzględny",
- "relative": "Względny"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Konta",
- "connected": "Connected accounts",
- "username": "Nazwa użytkownika",
- "domain": "Domena",
- "association": "Powiązanie",
- "order": "Kolejność",
- "remove_association": "Usuń powiązanie",
- "remove_all_associations": "Usuń wszystkie powiązania",
- "confirm": "Potwierdź",
- "cancel": "Anuluj",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Sieć",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Nie używaj proxy",
- "system": "Użyj systemowego proxy",
- "manual": "Użyj ręcznej konfiguracji proxy",
- "protocol": "Protokół",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Zapisz"
- },
- "language": {
- "title": "Język",
- "language": {
- "title": "Język",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Sprawdzanie pisowni",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Przejdź do…"
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Nazwa konta"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Skróty klawiszowe",
- "ctrl_number": "Przełącz konta",
- "ctrl_k": "Przejdź do innych osi czasu",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Pokaż więcej",
- "hide": "Ukryj",
- "sensitive": "Pokaż zawartość wrażliwą",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Usuń",
- "via": "przez {{application}}",
- "reply": "Odpowiadać",
- "reblog": "Boost",
- "fav": "Ulubiony",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Odśwież"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Śledzi Cię",
- "doesnt_follow_you": "Nie śledzi Cię",
- "detail": "Szczegół",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Śledź prośbę",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Śledzeni",
- "followers": "Śledzący"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Odrzuć"
- },
- "hashtag": {
- "tag_name": "Tag",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Szukaj",
- "account": "Konta",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Nowa lista",
- "edit": "Edytuj",
- "delete": {
- "confirm": {
- "title": "Potwierdź",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Usuń",
- "cancel": "Anuluj"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " tutaj",
- "search": "Znajdź",
- "login": "Zaloguj się"
- },
- "authorize": {
- "manually_1": "Strona autoryzacji została otwarta w Twojej przeglądarce.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Wyślij"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Nie udało się załadować kont",
- "account_remove_error": "Nie udało się usunąć konta",
- "preferences_load_error": "Nie udało się załadować ustawień",
- "timeline_fetch_error": "Nie udało się załadować osi czasu",
- "notification_fetch_error": "Nie udało się załadować powiadomień",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Nie udało się załączyć pliku",
- "authorize_duplicate_error": "Nie możesz zalogować się na to samo konto na tej samej instancji",
- "authorize_error": "Uwierzytelnienie nie powiodło się",
- "followers_fetch_error": "Nie udało się załadować śledzących",
- "follows_fetch_error": "Nie udało się załadować śledzonych",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Nie udało się zacząć śledzić użytkownika",
- "unfollow_error": "Nie udało się przestać śledzić użytkownika",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Nie udało się załadować list",
- "list_create_error": "Nie udało się utworzyć listy",
- "members_fetch_error": "Nie udało się załadować członków",
- "remove_user_error": "Nie udało się usunąć użytkownika",
- "find_account_error": "Nie znaleziono konta",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Nie udało się dodać wpisu do ulubionych",
- "unfavourite_error": "Nie udało się usunąć wpisu z ulubionych",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Wyszukiwanie nie powiodło się",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Nie udało się zaktualizować listy członków listy",
- "add_user_error": "Nie udało się dodać użytkownika",
- "authorize_url_error": "Nie udało się uzyskać adresu autoryzacji",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Ładowanie…",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "Nazwa domeny jest wymagana",
- "domain_format": "Wprowadź tylko nazwę domeny"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/pt_pt/translation.json b/src/config/locales/pt_pt/translation.json
deleted file mode 100644
index 28818446..00000000
--- a/src/config/locales/pt_pt/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Quit"
- },
- "edit": {
- "name": "Edit",
- "undo": "Undo",
- "redo": "Redo",
- "cut": "Cut",
- "copy": "Copy",
- "paste": "Paste",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Window",
- "close": "Close Window",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profile",
- "show_profile": "Show profile",
- "edit_profile": "Edit profile",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "Home",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "Home",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/ru/translation.json b/src/config/locales/ru/translation.json
deleted file mode 100644
index 4f974ff1..00000000
--- a/src/config/locales/ru/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "О Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Сервисы",
- "hide": "Скрыть Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Выйти"
- },
- "edit": {
- "name": "Редактировать",
- "undo": "Отменить",
- "redo": "Повторить",
- "cut": "Вырезать",
- "copy": "Копировать",
- "paste": "Вставить",
- "select_all": "Выбрать всё"
- },
- "view": {
- "name": "Вид",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Окно",
- "close": "Закрыть окно",
- "open": "Открыть окно",
- "minimize": "Свернуть",
- "jump_to": "Перейти к"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Добавить аккаунт"
- },
- "side_menu": {
- "profile": "Профиль",
- "show_profile": "Показать профиль",
- "edit_profile": "Редактировать профиль",
- "settings": "Account settings",
- "collapse": "Свернуть",
- "expand": "Развернуть",
- "home": "Главная",
- "notification": "Notifications",
- "direct": "Личные сообщения",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Локальная лента времени",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Поиск",
- "lists": "Списки"
- },
- "header_menu": {
- "home": "Главная",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Локальная лента времени",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Поиск",
- "lists": "Списки",
- "members": "Участники",
- "reload": "Обновить"
- },
- "settings": {
- "title": "Настройки",
- "general": {
- "title": "Общие",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Публичный",
- "unlisted": "Не в списке",
- "private": "Приватный",
- "direct": "Личный"
- },
- "sensitive": {
- "description": "По умолчанию помечать медиафайлы деликатными"
- }
- }
- },
- "timeline": {
- "title": "Лента времени",
- "use_marker": {
- "title": "Загрузить ленту времени от последней прочитанной позиции",
- "home": "Главная",
- "notifications": "Уведомления"
- }
- },
- "filters": {
- "title": "Фильтры",
- "form": {
- "phrase": "Ключевое слово или фраза",
- "expire": "Истекает после",
- "context": "Фильтр контекстов",
- "irreversible": "Удалить вместо скрытия",
- "whole_word": "Слово целиком",
- "submit": "Подтвердить",
- "cancel": "Отмена"
- },
- "expires": {
- "never": "Никогда",
- "30_minutes": "30 минут",
- "1_hour": "1 час",
- "6_hours": "6 часов",
- "12_hours": "12 часов",
- "1_day": "1 день",
- "1_week": "1 неделя"
- },
- "new": {
- "title": "Новый"
- },
- "edit": {
- "title": "Изменить"
- },
- "delete": {
- "title": "Удалить",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Удалить",
- "confirm_cancel": "Отмена"
- }
- }
- },
- "preferences": {
- "title": "Настройки",
- "general": {
- "title": "Общие",
- "sounds": {
- "title": "Звуки",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Лента времени",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Другие настройки",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Сбросить настройки"
- }
- },
- "appearance": {
- "title": "Внешний вид",
- "theme_color": "Colour themes",
- "theme": {
- "system": "Системная",
- "light": "Светлая",
- "dark": "Тёмная",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Пользовательская"
- },
- "custom_theme": {
- "background_color": "Основной фон",
- "selected_background_color": "Фон в фокусе",
- "global_header_color": "Меню учетной записи",
- "side_menu_color": "Боковое меню",
- "primary_color": "Основной шрифт",
- "regular_color": "Обычный шрифт",
- "secondary_color": "Дополнительный шрифт",
- "border_color": "Граница",
- "header_menu_color": "Меню заголовка",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Размер шрифта",
- "font_family": "Шрифт",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Отображаемое имя и имя пользователя",
- "display_name": "Отображаемое имя",
- "username": "Имя пользователя"
- },
- "time_format": {
- "title": "Формат времени",
- "absolute": "Абсолютно",
- "relative": "Относительно"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Учетная запись",
- "connected": "Connected accounts",
- "username": "Имя пользователя",
- "domain": "Домен",
- "association": "Привязка",
- "order": "Порядок",
- "remove_association": "Удалить привязку",
- "remove_all_associations": "Удалить все привязки",
- "confirm": "Подтвердить",
- "cancel": "Отмена",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Сеть",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Без прокси-сервера",
- "system": "Использовать системный прокси-сервер",
- "manual": "Ручная настройка прокси-сервера",
- "protocol": "Протокол",
- "host": "Прокси-сервер",
- "port": "Порт прокси-сервера",
- "username": "Имя пользователя прокси-сервера",
- "password": "Пароль прокси-сервера",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Сохранить"
- },
- "language": {
- "title": "Язык",
- "language": {
- "title": "Язык",
- "description": "Выберите язык, который вы хотели бы использовать в Whalebird."
- },
- "spellchecker": {
- "title": "Правописание",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Перейти к..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Имя учетной записи"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Отмена",
- "ok": "Заглушить"
- },
- "shortcut": {
- "title": "Горячие клавиши",
- "ctrl_number": "Сменить учетную запись",
- "ctrl_k": "Перейти к другим лентам времени",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Закрыть текущую страницу"
- },
- "report": {
- "title": "Report this user",
- "comment": "Дополнительные комментарии",
- "cancel": "Отмена",
- "ok": "Жалоба"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Показать еще",
- "hide": "Скрыть",
- "sensitive": "Содержимое деликатного характера",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Заглушить",
- "block": "Блокировать",
- "report": "Жалоба",
- "delete": "Удалить",
- "via": "через {{application}}",
- "reply": "Ответ",
- "reblog": "Boost",
- "fav": "Избранное",
- "detail": "Post details",
- "bookmark": "Закладка",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Голосование",
- "votes_count": "голоса",
- "until": "до {{datetime}}",
- "left": "Осталось {{datetime}}",
- "refresh": "Обновить"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Загрузить больше статуса"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Подписан на вас",
- "doesnt_follow_you": "Не подписан на вас",
- "detail": "Подробности",
- "follow": "Подписаться на этого пользователя",
- "unfollow": "Отписаться от этого пользователя",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Запросы на подписку",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Заглушить",
- "unmute": "Включить звук",
- "unblock": "Разблокировать",
- "block": "Блокировать",
- "toots": "Posts",
- "follows": "Подписки",
- "followers": "Подписчики"
- }
- },
- "follow_requests": {
- "accept": "Принять",
- "reject": "Отклонить"
- },
- "hashtag": {
- "tag_name": "Имя тега",
- "delete_tag": "Удалить тег",
- "save_tag": "Сохранить тег"
- },
- "search": {
- "search": "Поиск",
- "account": "Учетная запись",
- "tag": "Хэштег",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Новый список",
- "edit": "Изменить",
- "delete": {
- "confirm": {
- "title": "Подтвердить",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Удалить",
- "cancel": "Отмена"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " здесь",
- "search": "Поиск",
- "login": "Вход"
- },
- "authorize": {
- "manually_1": "Страница авторизации открыта в браузере.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Пожалуйста, подтвердите после авторизации в вашем браузере.",
- "submit": "Подтвердить"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Не удалось загрузить учетные записи",
- "account_remove_error": "Не удалось удалить учетную запись",
- "preferences_load_error": "Не удалось загрузить настройки",
- "timeline_fetch_error": "Не удалось загрузить ленту времени",
- "notification_fetch_error": "Не удалось получить уведомление",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Не удалось принять запрос",
- "follow_request_reject_error": "Не удалось отклонить запрос",
- "attach_error": "Не удалось прикрепить файл",
- "authorize_duplicate_error": "Не могу войти в один и тот же аккаунт одного домена",
- "authorize_error": "Не удалось авторизовать",
- "followers_fetch_error": "Не удалось загрузить подписчиков",
- "follows_fetch_error": "Не удалось загрузить на кого вы подписаны",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Не удалось подписаться на пользователя",
- "unfollow_error": "Не удалось отменить подписку от пользователя",
- "subscribe_error": "Не удалось подписать пользователя",
- "unsubscribe_error": "Не удалось отписаться от пользователя",
- "lists_fetch_error": "Не удалось получить списки",
- "list_create_error": "Не удалось создать список",
- "members_fetch_error": "Не удалось загрузить участников",
- "remove_user_error": "Не удалось удалить пользователя",
- "find_account_error": "Аккаунт не найден",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Не удалось добавить в избранное",
- "unfavourite_error": "Не удалось удалить избранное",
- "bookmark_error": "Не удалось добавить в закладку",
- "unbookmark_error": "Не удалось удалить закладку",
- "delete_error": "Failed to delete the post",
- "search_error": "Не удалось найти",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Не удалось обновить список участников",
- "add_user_error": "Не удалось добавить пользователя",
- "authorize_url_error": "Не удалось получить адрес авторизации",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Загрузка...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Не удалось обновить фильтр",
- "create_filter_error": "Не удалось создать фильтр"
- },
- "validation": {
- "login": {
- "require_domain_name": "Требуется доменное имя",
- "domain_format": "Пожалуйста, введите только доменное имя"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} стал вашим подписчиком"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/si/translation.json b/src/config/locales/si/translation.json
deleted file mode 100644
index e8ad9665..00000000
--- a/src/config/locales/si/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "සේවාවන්",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "ඉවත් වන්න"
- },
- "edit": {
- "name": "සංස්කරණය",
- "undo": "පෙර සේ",
- "redo": "පසු සේ",
- "cut": "Cut",
- "copy": "පිටපත්",
- "paste": "අලවන්න",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "කවුළුව",
- "close": "කවුළුව වසන්න",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "පැතිකඩ",
- "show_profile": "පැතිකඩ පෙන්වන්න",
- "edit_profile": "පැතිකඩ සංස්කරණය",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "මුල",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "සොයන්න",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "මුල",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "සොයන්න",
- "lists": "Lists",
- "members": "සාමාජිකයින්",
- "reload": "නැවත පූරණය"
- },
- "settings": {
- "title": "සැකසුම්",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "පුද්ගලික",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "පෙරහන්",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "අවලංගු"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "විනාඩි 30",
- "1_hour": "පැය 1",
- "6_hours": "පැය 6",
- "12_hours": "පැය 12",
- "1_day": "දවස් 1",
- "1_week": "සති 1"
- },
- "new": {
- "title": "නව"
- },
- "edit": {
- "title": "සංස්කරණය"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "අවලංගු"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "ශබ්ද",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "වෙනත් විකල්ප",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "අඳුරු",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "අභිරුචි"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "පරිශීලක නාමය"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "ගිණුම",
- "connected": "Connected accounts",
- "username": "පරිශීලක නාමය",
- "domain": "වසම",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "අවලංගු",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "ජාලය",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "කෙටුම්පත",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "සුරකින්න"
- },
- "language": {
- "title": "භාෂාව",
- "language": {
- "title": "භාෂාව",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "ගිණුමේ නම"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "අවලංගු",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "යතුරුපුවරුවේ කෙටිමං",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "අවලංගු",
- "ok": "වාර්තා කරන්න"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "තව පෙන්වන්න",
- "hide": "සඟවන්න",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "අවහිර",
- "report": "වාර්තා කරන්න",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "පිළිතුරු",
- "reblog": "Boost",
- "fav": "ප්රියතම",
- "detail": "Post details",
- "bookmark": "පොත්යොමුව",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "විස්තරය",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "අනවහිර",
- "block": "අවහිර",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "සොයන්න",
- "account": "ගිණුම",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "සෙවීමට අසමත්විය",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "පූරණය වෙමින්…",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/sv_se/translation.json b/src/config/locales/sv_se/translation.json
deleted file mode 100644
index 28818446..00000000
--- a/src/config/locales/sv_se/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "About Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Services",
- "hide": "Hide Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Quit"
- },
- "edit": {
- "name": "Edit",
- "undo": "Undo",
- "redo": "Redo",
- "cut": "Cut",
- "copy": "Copy",
- "paste": "Paste",
- "select_all": "Select All"
- },
- "view": {
- "name": "View",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Window",
- "close": "Close Window",
- "open": "Open Window",
- "minimize": "Minimize",
- "jump_to": "Jump to"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Add new account"
- },
- "side_menu": {
- "profile": "Profile",
- "show_profile": "Show profile",
- "edit_profile": "Edit profile",
- "settings": "Account settings",
- "collapse": "Collapse",
- "expand": "Expand",
- "home": "Home",
- "notification": "Notifications",
- "direct": "Direct messages",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists"
- },
- "header_menu": {
- "home": "Home",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Local timeline",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Search",
- "lists": "Lists",
- "members": "Members",
- "reload": "Reload"
- },
- "settings": {
- "title": "Settings",
- "general": {
- "title": "General",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Public",
- "unlisted": "Unlisted",
- "private": "Private",
- "direct": "Direct"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Timeline",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Preferences",
- "general": {
- "title": "General",
- "sounds": {
- "title": "Sounds",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Timeline",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Other options",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Light",
- "dark": "Dark",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Base background",
- "selected_background_color": "Focused background",
- "global_header_color": "Account menu",
- "side_menu_color": "Side menu",
- "primary_color": "Primary font",
- "regular_color": "Regular font",
- "secondary_color": "Secondary font",
- "border_color": "Border",
- "header_menu_color": "Header menu",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Font size",
- "font_family": "Font family",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Display name and username",
- "display_name": "Display name",
- "username": "Username"
- },
- "time_format": {
- "title": "Time format",
- "absolute": "Absolute",
- "relative": "Relative"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Account",
- "connected": "Connected accounts",
- "username": "Username",
- "domain": "Domain",
- "association": "Association",
- "order": "Order",
- "remove_association": "Remove association",
- "remove_all_associations": "Remove all associations",
- "confirm": "Confirm",
- "cancel": "Cancel",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Network",
- "proxy": {
- "title": "Proxy configuration",
- "no": "No proxy",
- "system": "Use system proxy",
- "manual": "Manual proxy configuration",
- "protocol": "Protocol",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Proxy username",
- "password": "Proxy password",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Save"
- },
- "language": {
- "title": "Language",
- "language": {
- "title": "Language",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Jump to..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Account name"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Cancel",
- "ok": "Mute"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Jump to other timelines",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Close current page"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Cancel",
- "ok": "Report"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Show more",
- "hide": "Hide",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Mute",
- "block": "Block",
- "report": "Report",
- "delete": "Delete",
- "via": "via {{application}}",
- "reply": "Reply",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Vote",
- "votes_count": "votes",
- "until": "until {{datetime}}",
- "left": "{{datetime}} left",
- "refresh": "Refresh"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Follows you",
- "doesnt_follow_you": "Doesn't follow you",
- "detail": "Detail",
- "follow": "Follow this user",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Follow requested",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Mute",
- "unmute": "Unmute",
- "unblock": "Unblock",
- "block": "Block",
- "toots": "Posts",
- "follows": "Follows",
- "followers": "Followers"
- }
- },
- "follow_requests": {
- "accept": "Accept",
- "reject": "Reject"
- },
- "hashtag": {
- "tag_name": "Tag name",
- "delete_tag": "Delete tag",
- "save_tag": "Save tag"
- },
- "search": {
- "search": "Search",
- "account": "Account",
- "tag": "Hashtag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "New List",
- "edit": "Edit",
- "delete": {
- "confirm": {
- "title": "Confirm",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Delete",
- "cancel": "Cancel"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " here",
- "search": "Search",
- "login": "Login"
- },
- "authorize": {
- "manually_1": "An authorization page has opened in your browser.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Please submit after you authorize in your browser.",
- "submit": "Submit"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Failed to load accounts",
- "account_remove_error": "Failed to remove the account",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Failed to accept the request",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Can not login the same account of the same domain",
- "authorize_error": "Failed to authorize",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Failed to follow the user",
- "unfollow_error": "Failed to unfollow the user",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Failed to remove the user",
- "find_account_error": "Account not found",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Failed to add user",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Loading...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} is now following you"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/tzm/translation.json b/src/config/locales/tzm/translation.json
deleted file mode 100644
index 647a965f..00000000
--- a/src/config/locales/tzm/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "Γef Whalebird",
- "preferences": "Preferences",
- "shortcuts": "Keyboard shortcuts",
- "services": "Tinufa",
- "hide": "Ffer Whalebird",
- "hide_others": "Hide others",
- "show_all": "Show all",
- "open": "Open window",
- "quit": "Ffeɣ"
- },
- "edit": {
- "name": "Senfel",
- "undo": "Sser",
- "redo": "Ales",
- "cut": "Bbi",
- "copy": "Senɣel",
- "paste": "Sleɣ",
- "select_all": "Sty maṛṛa"
- },
- "view": {
- "name": "Smal",
- "toggle_full_screen": "Toggle full screen"
- },
- "window": {
- "always_show_menu_bar": "Always show menu bar",
- "name": "Asatm",
- "close": "Rgel Asatm",
- "open": "Ṛẓem Asatm",
- "minimize": "Semẓi",
- "jump_to": "Ddu ɣer"
- },
- "help": {
- "name": "Help",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "Rnu yan umiḍan amaynu"
- },
- "side_menu": {
- "profile": "Ifres",
- "show_profile": "Sken ifres",
- "edit_profile": "Ssenfel ifres",
- "settings": "Account settings",
- "collapse": "Ssemun",
- "expand": "Semɣer",
- "home": "Asnubg",
- "notification": "Notifications",
- "direct": "Tuzinin tusridin",
- "follow_requests": "Follow requests",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "local": "Ifili n uzmez adɣran",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Rzu",
- "lists": "Tilgamin"
- },
- "header_menu": {
- "home": "Asenubeg",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "Ifili n uzmez adɣran",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "Rzu",
- "lists": "Tilgamin",
- "members": "Agmamn",
- "reload": "Als"
- },
- "settings": {
- "title": "Tisɣal",
- "general": {
- "title": "Amatay",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "Tagdudant",
- "unlisted": "Unlisted",
- "private": "Tusligt",
- "direct": "Tusridt"
- },
- "sensitive": {
- "description": "Mark media as sensitive by default"
- }
- }
- },
- "timeline": {
- "title": "Ifili n uzmez",
- "use_marker": {
- "title": "Load the timeline from the last reading position",
- "home": "Home",
- "notifications": "Notifications"
- }
- },
- "filters": {
- "title": "Filters",
- "form": {
- "phrase": "Keyword or phrase",
- "expire": "Expire after",
- "context": "Filter contexts",
- "irreversible": "Drop instead of hide",
- "whole_word": "Whole word",
- "submit": "Submit",
- "cancel": "Cancel"
- },
- "expires": {
- "never": "Never",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "12_hours": "12 hours",
- "1_day": "1 day",
- "1_week": "1 week"
- },
- "new": {
- "title": "New"
- },
- "edit": {
- "title": "Edit"
- },
- "delete": {
- "title": "Delete",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "Delete",
- "confirm_cancel": "Cancel"
- }
- }
- },
- "preferences": {
- "title": "Isemnyifen",
- "general": {
- "title": "Amatay",
- "sounds": {
- "title": "Imeslitn",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "Ifili n uzmez",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "Tideɣrin yaḍnin",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "Reset preferences"
- }
- },
- "appearance": {
- "title": "Appearance",
- "theme_color": "Colour themes",
- "theme": {
- "system": "System",
- "light": "Anafaw",
- "dark": "Adeɣmum",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "Custom"
- },
- "custom_theme": {
- "background_color": "Agilal n tsila",
- "selected_background_color": "Agilal asmssi",
- "global_header_color": "Umuɣ n umiḍan",
- "side_menu_color": "Umuɣ n tama",
- "primary_color": "Aklu n uḍṛiṣ amenzu",
- "regular_color": "Aklu n uḍṛiṣ anaway",
- "secondary_color": "Aklu n uḍṛiṣ asinan",
- "border_color": "Imisi",
- "header_menu_color": "Umuɣ n waflla",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "Tiɣzi n tuniɣt",
- "font_family": "Tawacunt n tuniɣt",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "Smal isem d Isem n unessmres",
- "display_name": "Smal isem",
- "username": "Isem n unessmres"
- },
- "time_format": {
- "title": "Talɣa n wakud",
- "absolute": "Absolute",
- "relative": "Amaqqan"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "Amiḍan",
- "connected": "Connected accounts",
- "username": "Isem n unessmres",
- "domain": "Iger",
- "association": "Tamesmunt",
- "order": "Yaḍen",
- "remove_association": "Kkes tamesmunt",
- "remove_all_associations": "Kkes timesmunin maṛṛa",
- "confirm": "Seddid",
- "cancel": "Sser",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "Aẓeṭṭa",
- "proxy": {
- "title": "Proxy configuration",
- "no": "Walu apṛuksy",
- "system": "Semres apṛuksy n ungraw",
- "manual": "Manual proxy configuration",
- "protocol": "Apṛutukul",
- "host": "Proxy host",
- "port": "Proxy port",
- "username": "Isem n unessmres n upruksi",
- "password": "Taguri n uzeray n upṛuksi",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "Ḥḍu"
- },
- "language": {
- "title": "Tutlayt",
- "language": {
- "title": "Tutlayt",
- "description": "Choose the language you would like to use with Whalebird."
- },
- "spellchecker": {
- "title": "Spellcheck",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "Ddu ɣer..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "Isem n umiḍan"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "Sser",
- "ok": "Ẓẓiẓen"
- },
- "shortcut": {
- "title": "Keyboard shortcuts",
- "ctrl_number": "Switch accounts",
- "ctrl_k": "Ddu ɣer ifiliten n uzmez yaḍnin",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "Rgel tasna tamirant"
- },
- "report": {
- "title": "Report this user",
- "comment": "Additional comments",
- "cancel": "Sser",
- "ok": "Mel"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "Smal uggar",
- "hide": "Ffer",
- "sensitive": "Show sensitive content",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "Ẓẓiẓen",
- "block": "Gdel",
- "report": "Mel",
- "delete": "Kkes",
- "via": "sɣur {{application}}",
- "reply": "Rar",
- "reblog": "Boost",
- "fav": "Favourite",
- "detail": "Post details",
- "bookmark": "Bookmark",
- "pinned": "Pinned post",
- "poll": {
- "vote": "Asettay",
- "votes_count": "isettayen",
- "until": "ar {{datetime}}",
- "left": "{{datetime}} ag qimen",
- "refresh": "Zzuzwu"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "Load more status"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "Iḍffer-k",
- "doesnt_follow_you": "Ur-k iḍffeṛ",
- "detail": "Detail",
- "follow": "Ḍfeṛ anessmres-a",
- "unfollow": "Unfollow this user",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "Ḍfeṛ tutrawin",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "Ẓẓiẓen",
- "unmute": "Kkes aẓiẓen",
- "unblock": "Kkes ageddul",
- "block": "Gdel",
- "toots": "Posts",
- "follows": "Imeḍfaṛ",
- "followers": "Imeḍfaṛen"
- }
- },
- "follow_requests": {
- "accept": "Ḍeggi",
- "reject": "Agy"
- },
- "hashtag": {
- "tag_name": "Isem n waṭag",
- "delete_tag": "Kkes aṭag",
- "save_tag": "Ḥḍu aṭag"
- },
- "search": {
- "search": "Rzu",
- "account": "Amiḍan",
- "tag": "Hacṭag",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "Aseddi amaynu",
- "edit": "Senfel",
- "delete": {
- "confirm": {
- "title": "Seddid",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "Kkes",
- "cancel": "Ser"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " da",
- "search": "Rzu",
- "login": "Akcam"
- },
- "authorize": {
- "manually_1": "Tettuṛẓem yat n tasna n usurg g umssara-nnek.",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "Mek tufid azen-tt adday tssurged g umssara-nnek.",
- "submit": "Azen"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "Azgel g usali n imiḍanen",
- "account_remove_error": "Azgel g usitey n imiḍanen",
- "preferences_load_error": "Failed to load preferences",
- "timeline_fetch_error": "Failed to fetch timeline",
- "notification_fetch_error": "Failed to fetch notification",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "Azgel n udggi n tutrawin",
- "follow_request_reject_error": "Failed to reject the request",
- "attach_error": "Could not attach the file",
- "authorize_duplicate_error": "Ur tzmmared ad kcemd s imiḍanen imsasan g igran imsasan",
- "authorize_error": "Azgel g usureg",
- "followers_fetch_error": "Failed to fetch followers",
- "follows_fetch_error": "Failed to fetch follows",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "Azgel g uḍfaṛ n unessmres",
- "unfollow_error": "Azgel g tukksa n uḍfaṛ n unessmres",
- "subscribe_error": "Failed to subscribe the user",
- "unsubscribe_error": "Failed to unsubscribe the user",
- "lists_fetch_error": "Failed to fetch lists",
- "list_create_error": "Failed to create a list",
- "members_fetch_error": "Failed to fetch members",
- "remove_user_error": "Azgel g usitey n unessmres",
- "find_account_error": "Ur ittwafa umiḍam",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "Failed to favourite",
- "unfavourite_error": "Failed to unfavourite",
- "bookmark_error": "Failed to bookmark",
- "unbookmark_error": "Failed to remove bookmark",
- "delete_error": "Failed to delete the post",
- "search_error": "Failed to search",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "Failed to update the list memberships",
- "add_user_error": "Azgel g urnnu n unessmres",
- "authorize_url_error": "Failed to get authorize url",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "Azdam...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "Failed to update the filter",
- "create_filter_error": "Failed to create the filter"
- },
- "validation": {
- "login": {
- "require_domain_name": "A domain name is required",
- "domain_format": "Please only enter the domain name"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "la-k iḍffeṛ {{username}}"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/locales/zh_cn/translation.json b/src/config/locales/zh_cn/translation.json
deleted file mode 100644
index 66446997..00000000
--- a/src/config/locales/zh_cn/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird",
- "about": "关于 Whalebird",
- "preferences": "首选项",
- "shortcuts": "快捷键",
- "services": "服务",
- "hide": "隐藏 Whalebird",
- "hide_others": "隐藏其他",
- "show_all": "显示全部",
- "open": "打开窗口",
- "quit": "退出"
- },
- "edit": {
- "name": "编辑",
- "undo": "撤销",
- "redo": "重做",
- "cut": "剪切",
- "copy": "复制",
- "paste": "粘贴",
- "select_all": "全选"
- },
- "view": {
- "name": "视图",
- "toggle_full_screen": "切换全屏"
- },
- "window": {
- "always_show_menu_bar": "始终显示菜单栏",
- "name": "窗口",
- "close": "关闭窗口",
- "open": "打开窗口",
- "minimize": "最小化",
- "jump_to": "跳转至"
- },
- "help": {
- "name": "帮助",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "添加账户"
- },
- "side_menu": {
- "profile": "个人资料",
- "show_profile": "查看个人资料",
- "edit_profile": "修改个人资料",
- "settings": "账户设置",
- "collapse": "收起",
- "expand": "展开",
- "home": "主页",
- "notification": "通知",
- "direct": "私信",
- "follow_requests": "关注请求",
- "favourite": "喜欢",
- "bookmark": "书签",
- "local": "本站时间轴",
- "public": "跨站时间轴",
- "hashtag": "话题",
- "search": "搜索",
- "lists": "列表"
- },
- "header_menu": {
- "home": "主页",
- "notification": "通知",
- "favourite": "喜欢",
- "bookmark": "书签",
- "follow_requests": "关注请求",
- "direct_messages": "私信",
- "local": "本站时间轴",
- "public": "跨站时间轴",
- "hashtag": "话题",
- "search": "搜索",
- "lists": "列表",
- "members": "成员",
- "reload": "刷新"
- },
- "settings": {
- "title": "设置",
- "general": {
- "title": "通用",
- "toot": {
- "title": "嘟文",
- "visibility": {
- "description": "默认发嘟可见性",
- "notice": "此设置仅适用于新嘟文;回复将遵循父嘟文的可见性设置。",
- "public": "公开",
- "unlisted": "不公开",
- "private": "仅关注者",
- "direct": "私信"
- },
- "sensitive": {
- "description": "总是将媒体标记为敏感内容"
- }
- }
- },
- "timeline": {
- "title": "时间轴",
- "use_marker": {
- "title": "从最后阅读位置加载时间轴",
- "home": "主页",
- "notifications": "通知"
- }
- },
- "filters": {
- "title": "过滤规则",
- "form": {
- "phrase": "关键字或词组",
- "expire": "过期于",
- "context": "过滤器内容",
- "irreversible": "丢弃而不是隐藏",
- "whole_word": "完全匹配词语",
- "submit": "提交",
- "cancel": "取消"
- },
- "expires": {
- "never": "从不",
- "30_minutes": "30 分钟",
- "1_hour": "1 小时",
- "6_hours": "6 小时",
- "12_hours": "12 小时",
- "1_day": "1 天",
- "1_week": "1 周"
- },
- "new": {
- "title": "新增"
- },
- "edit": {
- "title": "编辑"
- },
- "delete": {
- "title": "删除",
- "confirm": "您确定要删除这个过滤规则吗?",
- "confirm_ok": "删除",
- "confirm_cancel": "取消"
- }
- }
- },
- "preferences": {
- "title": "首选项",
- "general": {
- "title": "一般",
- "sounds": {
- "title": "音效",
- "description": "当……时播放通知铃声",
- "fav_rb": "您喜欢或者转嘟了",
- "toot": "您发布了一条嘟文"
- },
- "timeline": {
- "title": "时间轴",
- "description": "自定义时间轴的显示方式",
- "cw": "总是显示敏感嘟文",
- "nsfw": "总是显示所有媒体",
- "hideAllAttachments": "总是隐藏所有媒体"
- },
- "other": {
- "title": "其它选项",
- "launch": "开机启动",
- "hideOnLaunch": "启动时隐藏 Whalebird 窗口"
- },
- "reset": {
- "button": "重置首选项"
- }
- },
- "appearance": {
- "title": "外观",
- "theme_color": "颜色主题",
- "theme": {
- "system": "系统",
- "light": "明亮",
- "dark": "深暗",
- "solarized_light": "Solarized Light",
- "solarized_dark": "Solarized Dark",
- "kimbie_dark": "Kimbie Dark",
- "custom": "自定义"
- },
- "custom_theme": {
- "background_color": "基本背景",
- "selected_background_color": "聚焦背景",
- "global_header_color": "账户菜单",
- "side_menu_color": "侧边栏",
- "primary_color": "首要文字",
- "regular_color": "普通文字",
- "secondary_color": "次要文字",
- "border_color": "边界",
- "header_menu_color": "标题菜单",
- "wrapper_mask_color": "对话框包装器"
- },
- "font_size": "字体大小",
- "font_family": "字体",
- "toot_padding": "嘟文上下间距",
- "display_style": {
- "title": "用户名显示样式",
- "display_name_and_username": "昵称和用户名",
- "display_name": "昵称",
- "username": "用户名"
- },
- "time_format": {
- "title": "时间格式",
- "absolute": "绝对时间",
- "relative": "相对时间"
- }
- },
- "notification": {
- "title": "通知",
- "enable": {
- "description": "当我收到……时通知我",
- "reply": "回复",
- "reblog": "转嘟",
- "favourite": "喜欢",
- "follow": "新粉丝",
- "reaction": "Emoji 回应",
- "follow_request": "关注请求",
- "status": "状态通知",
- "poll_vote": "投票",
- "poll_expired": "投票过期时"
- }
- },
- "account": {
- "title": "账户",
- "connected": "已关联的账户",
- "username": "用户名",
- "domain": "域名",
- "association": "关联",
- "order": "顺序",
- "remove_association": "移除账户",
- "remove_all_associations": "移除所有账户",
- "confirm": "确定",
- "cancel": "取消",
- "confirm_message": "确定移除所有账户吗?"
- },
- "network": {
- "title": "网络",
- "proxy": {
- "title": "代理配置",
- "no": "不使用代理",
- "system": "使用系统代理",
- "manual": "手动配置代理",
- "protocol": "协议",
- "host": "代理主机",
- "port": "代理端口",
- "username": "用户名",
- "password": "密码",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "保存"
- },
- "language": {
- "title": "语言",
- "language": {
- "title": "语言",
- "description": "设定 Whalebird 的界面语言。"
- },
- "spellchecker": {
- "title": "拼写检查",
- "enabled": "启用拼写检查"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "跳转至..."
- },
- "add_list_member": {
- "title": "向列表添加成员",
- "account_name": "用户名"
- },
- "list_membership": {
- "title": "列表成员"
- },
- "mute_confirm": {
- "title": "静音该用户的嘟文",
- "body": "您确定要静音该用户吗?",
- "cancel": "取消",
- "ok": "确定"
- },
- "shortcut": {
- "title": "快捷键",
- "ctrl_number": "切换账户",
- "ctrl_k": "跳转至其他时间线",
- "ctrl_enter": "发送嘟文",
- "ctrl_r": "重新加载当前时间线",
- "j": "选择下一条嘟文",
- "k": "选择上一条嘟文",
- "r": "回复选中的嘟文",
- "b": "转发所选嘟文",
- "f": "喜欢所选嘟文",
- "o": "查看选中嘟文的详细信息",
- "p": "显示选中嘟文作者的个人资料",
- "i": "打开选中嘟文的图像",
- "x": "显示/隐藏敏感嘟文",
- "?": "显示快捷键帮助",
- "esc": "关闭当前页"
- },
- "report": {
- "title": "举报该用户",
- "comment": "备注",
- "cancel": "取消",
- "ok": "举报"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "显示",
- "hide": "隐藏",
- "sensitive": "显示敏感内容",
- "view_toot_detail": "查看嘟文详细信息",
- "open_in_browser": "在浏览器中打开",
- "copy_link_to_toot": "复制嘟文链接",
- "mute": "静音",
- "block": "屏蔽",
- "report": "举报",
- "delete": "删除",
- "via": "来自 {{application}}",
- "reply": "回复",
- "reblog": "转嘟",
- "fav": "喜欢",
- "detail": "更多",
- "bookmark": "书签",
- "pinned": "置顶嘟文",
- "poll": {
- "vote": "投票",
- "votes_count": "投票计数",
- "until": "在 {{datetime}} 截止",
- "left": "剩余 {{datetime}}",
- "refresh": "刷新"
- },
- "open_account": {
- "title": "未找到该用户",
- "text": "在本服务器上找不到 {{account}} 。您想要在浏览器中打开吗?",
- "ok": "打开",
- "cancel": "取消"
- }
- },
- "status_loading": {
- "message": "加载更多状态"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "关注了你",
- "doesnt_follow_you": "没有关注你",
- "detail": "更多",
- "follow": "关注此用户",
- "unfollow": "取消关注此用户",
- "subscribe": "订阅此用户",
- "unsubscribe": "取消订阅此用户",
- "follow_requested": "已发送关注请求",
- "open_in_browser": "在浏览器中打开",
- "manage_list_memberships": "从列表中添加或删除",
- "mute": "静音",
- "unmute": "取消静音",
- "unblock": "取消屏蔽",
- "block": "屏蔽",
- "toots": "嘟文",
- "follows": "关注",
- "followers": "粉丝"
- }
- },
- "follow_requests": {
- "accept": "接受",
- "reject": "拒绝"
- },
- "hashtag": {
- "tag_name": "话题名称",
- "delete_tag": "删除话题",
- "save_tag": "保存话题"
- },
- "search": {
- "search": "搜索",
- "account": "用户",
- "tag": "话题",
- "keyword": "关键词",
- "toot": "嘟文"
- },
- "lists": {
- "index": {
- "new_list": "新列表的标题",
- "edit": "编辑",
- "delete": {
- "confirm": {
- "title": "确定",
- "message": "此列表将被永久删除。您确定要继续吗?",
- "ok": "删除",
- "cancel": "取消"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "欢迎使用 Whalebird !请输入一个服务器域名来登录你的账号。",
- "proxy_info": "如果您需要使用代理服务器,请设置",
- "proxy_here": " 这里进行设置",
- "search": "搜索",
- "login": "登录"
- },
- "authorize": {
- "manually_1": "一个认证页面已经在浏览器中打开。",
- "manually_2": "如果页面没有打开,请手动进入以下链接:",
- "code_label": "输入身份验证码",
- "misskey_label": "在提交后请在您的浏览器里进行授权。",
- "submit": "提交"
- },
- "receive_drop": {
- "drop_message": "拖放到此处以添加附件"
- },
- "message": {
- "account_load_error": "读取账户失败",
- "account_remove_error": "移除账户失败",
- "preferences_load_error": "加载首选项失败",
- "timeline_fetch_error": "加载时间轴失败",
- "notification_fetch_error": "加载通知失败",
- "favourite_fetch_error": "加载喜欢失败",
- "bookmark_fetch_error": "加载书签失败",
- "follow_request_accept_error": "接受请求失败",
- "follow_request_reject_error": "拒绝请求失败",
- "attach_error": "添加文件失败",
- "authorize_duplicate_error": "不能重复登录同一域名的同一帐户",
- "authorize_error": "认证失败",
- "followers_fetch_error": "读取粉丝列表失败",
- "follows_fetch_error": "读取关注列表失败",
- "toot_fetch_error": "加载嘟文失败",
- "follow_error": "关注失败",
- "unfollow_error": "取消关注失败",
- "subscribe_error": "订阅用户失败",
- "unsubscribe_error": "取消订阅用户失败",
- "lists_fetch_error": "加载列表失败",
- "list_create_error": "创建列表失败",
- "members_fetch_error": "加载成员失败",
- "remove_user_error": "移除用户失败",
- "find_account_error": "找不到用户",
- "reblog_error": "转嘟失败",
- "unreblog_error": "取消转嘟失败",
- "favourite_error": "喜欢失败",
- "unfavourite_error": "取消喜欢失败",
- "bookmark_error": "添加书签失败",
- "unbookmark_error": "移除书签失败",
- "delete_error": "删除嘟文失败",
- "search_error": "搜索失败",
- "toot_error": "创建新嘟失败",
- "update_list_memberships_error": "更新列表成员失败",
- "add_user_error": "添加用户失败",
- "authorize_url_error": "无法获取认证链接",
- "domain_confirmed": "{{domain}} 已确认,请登录",
- "domain_doesnt_exist": "连接到 {{domain}} 失败,请确认服务器链接是有效或正确的。",
- "loading": "加载中...",
- "language_not_support_spellchecker_error": "此语言暂时不支持拼写检查",
- "update_filter_error": "更新过滤器失败",
- "create_filter_error": "创建过滤器失败"
- },
- "validation": {
- "login": {
- "require_domain_name": "需要域名",
- "domain_format": "只能输入域名"
- },
- "compose": {
- "toot_length": "嘟文长度应在 {{min}} 和 {{max}} 之间",
- "attach_length": "您只能添加最多 {{max}} 张图片",
- "attach_length_plural": "您只能添加最多 {{max}} 张图片",
- "attach_image": "您只能上传图片或视频",
- "poll_invalid": "投票选项无效"
- }
- },
- "notification": {
- "favourite": {
- "title": "新的喜欢",
- "body": "{{username}} 喜欢了你的嘟文"
- },
- "follow": {
- "title": "新粉丝",
- "body": "{{username}} 正在关注你"
- },
- "follow_request": {
- "title": "新关注请求",
- "body": "收到来自 {{username}} 的关注请求"
- },
- "reblog": {
- "title": "新转嘟",
- "body": "{{username}} 转发了你的嘟文"
- },
- "quote": {
- "title": "新回复",
- "body": "{{username}} 引用了你的嘟文"
- },
- "reaction": {
- "title": "新回应",
- "body": "{{username}} 回应了你的嘟文"
- },
- "status": {
- "title": "新建嘟文",
- "body": "{{username}} 发了一条新嘟嘟"
- },
- "poll_vote": {
- "title": "新投票",
- "body": "来自 {{username}} 的投票"
- },
- "poll_expired": {
- "title": "投票已过期",
- "body": "{{username}} 的投票已截止"
- }
- },
- "compose": {
- "title": "新建嘟文",
- "cw": "在此写下您的警告",
- "status": "在想啥?",
- "cancel": "取消",
- "toot": "发嘟嘟",
- "description": "为此媒体添加备用文本",
- "footer": {
- "add_image": "上传图片",
- "poll": "发起投票",
- "change_visibility": "更改可见性",
- "change_sensitive": "标记媒体为敏感内容",
- "add_cw": "添加敏感内容警告",
- "pined_hashtag": "已保留的话题标签"
- },
- "poll": {
- "add_choice": "添加一个选项",
- "expires": {
- "5_minutes": "5 分钟",
- "30_minutes": "30 分钟",
- "1_hour": "1 小时",
- "6_hours": "6 小时",
- "1_day": "1 天",
- "3_days": "3 天",
- "7_days": "7 天"
- }
- }
- }
-}
diff --git a/src/config/locales/zh_tw/translation.json b/src/config/locales/zh_tw/translation.json
deleted file mode 100644
index cca070fd..00000000
--- a/src/config/locales/zh_tw/translation.json
+++ /dev/null
@@ -1,540 +0,0 @@
-{
- "main_menu": {
- "application": {
- "name": "Whalebird (鯨鳥)",
- "about": "關於 Whalebird (鯨鳥)",
- "preferences": "偏好設定",
- "shortcuts": "鍵盤快捷鍵",
- "services": "服務",
- "hide": "隱藏 Whalebird (鯨鳥)",
- "hide_others": "隱藏其他",
- "show_all": "全部顯示",
- "open": "開啟視窗",
- "quit": "離開"
- },
- "edit": {
- "name": "編輯",
- "undo": "復原",
- "redo": "重做",
- "cut": "剪下",
- "copy": "複製",
- "paste": "貼上",
- "select_all": "全選"
- },
- "view": {
- "name": "檢視",
- "toggle_full_screen": "切換至全螢幕顯示"
- },
- "window": {
- "always_show_menu_bar": "總是顯示功能選單",
- "name": "視窗",
- "close": "關閉視窗",
- "open": "開啟視窗",
- "minimize": "最小化",
- "jump_to": "跳至"
- },
- "help": {
- "name": "幫助",
- "thirdparty": "Thirdparty licenses"
- }
- },
- "global_header": {
- "add_new_account": "新增帳號"
- },
- "side_menu": {
- "profile": "個人檔案",
- "show_profile": "顯示個人檔案",
- "edit_profile": "編輯個人檔案",
- "settings": "帳號設定",
- "collapse": "收合",
- "expand": "展開",
- "home": "首頁",
- "notification": "通知",
- "direct": "私訊",
- "follow_requests": "追隨請求",
- "favourite": "我的最愛",
- "bookmark": "書籤",
- "local": "本機時間軸",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "搜尋",
- "lists": "列表"
- },
- "header_menu": {
- "home": "首頁",
- "notification": "Notifications",
- "favourite": "Favourited",
- "bookmark": "Bookmarks",
- "follow_requests": "Follow requests",
- "direct_messages": "Direct messages",
- "local": "本機時間軸",
- "public": "Federated timeline",
- "hashtag": "Hashtags",
- "search": "搜尋",
- "lists": "列表",
- "members": "成員",
- "reload": "重新整理"
- },
- "settings": {
- "title": "設定",
- "general": {
- "title": "一般",
- "toot": {
- "title": "Posts",
- "visibility": {
- "description": "Default post visibility",
- "notice": "This setting applies only to new posts; replies will follow the visibility settings of the parent post.",
- "public": "公開",
- "unlisted": "不列出",
- "private": "私密",
- "direct": "私訊"
- },
- "sensitive": {
- "description": "預設標記媒體為敏感"
- }
- }
- },
- "timeline": {
- "title": "時間軸",
- "use_marker": {
- "title": "從上次閱讀位置讀取時間軸",
- "home": "首頁",
- "notifications": "通知"
- }
- },
- "filters": {
- "title": "過濾器",
- "form": {
- "phrase": "關鍵字或片語",
- "expire": "多久後過期",
- "context": "過濾內容",
- "irreversible": "丟棄而非隱藏",
- "whole_word": "整個單字",
- "submit": "送出",
- "cancel": "取消"
- },
- "expires": {
- "never": "從不",
- "30_minutes": "30 分鐘",
- "1_hour": "1 小時",
- "6_hours": "6 小時",
- "12_hours": "12 小時",
- "1_day": "1 天",
- "1_week": "1 週"
- },
- "new": {
- "title": "新增"
- },
- "edit": {
- "title": "編輯"
- },
- "delete": {
- "title": "刪除",
- "confirm": "Are you sure you want to delete this filter?",
- "confirm_ok": "刪除",
- "confirm_cancel": "取消"
- }
- }
- },
- "preferences": {
- "title": "偏好設定",
- "general": {
- "title": "一般",
- "sounds": {
- "title": "聲音",
- "description": "Play sounds when",
- "fav_rb": "You favourite or boost a post",
- "toot": "You make a post"
- },
- "timeline": {
- "title": "時間軸",
- "description": "Customize how your timelines are displayed",
- "cw": "Always expand posts tagged with content warnings.",
- "nsfw": "Always show media.",
- "hideAllAttachments": "Always hide media."
- },
- "other": {
- "title": "其他選項",
- "launch": "Launch Whalebird on startup",
- "hideOnLaunch": "Hide the Whalebird window on launch"
- },
- "reset": {
- "button": "重置偏好設定"
- }
- },
- "appearance": {
- "title": "外觀設定",
- "theme_color": "Colour themes",
- "theme": {
- "system": "系統",
- "light": "淺色主題",
- "dark": "深色主題",
- "solarized_light": "SolarizedLight",
- "solarized_dark": "SolarizedDark",
- "kimbie_dark": "KimbieDark",
- "custom": "自訂"
- },
- "custom_theme": {
- "background_color": "基礎背景",
- "selected_background_color": "焦點背景",
- "global_header_color": "帳號選單",
- "side_menu_color": "側邊選單",
- "primary_color": "主要字型",
- "regular_color": "一般字型",
- "secondary_color": "次要字型",
- "border_color": "邊框",
- "header_menu_color": "頁頂選單",
- "wrapper_mask_color": "Dialog wrapper"
- },
- "font_size": "字型大小",
- "font_family": "字型家族",
- "toot_padding": "Padding around posts",
- "display_style": {
- "title": "Username display style",
- "display_name_and_username": "顯示名稱及帳號",
- "display_name": "顯示名稱",
- "username": "帳號"
- },
- "time_format": {
- "title": "時間格式",
- "absolute": "絕對",
- "relative": "相對"
- }
- },
- "notification": {
- "title": "Notifications",
- "enable": {
- "description": "Notify me when I receive...",
- "reply": "Replies",
- "reblog": "Boosts",
- "favourite": "Favourites",
- "follow": "New followers",
- "reaction": "Emoji reactions",
- "follow_request": "Follow requests",
- "status": "Status notifications",
- "poll_vote": "Poll votes",
- "poll_expired": "When a poll expires"
- }
- },
- "account": {
- "title": "帳號",
- "connected": "Connected accounts",
- "username": "帳號",
- "domain": "網域",
- "association": "配對",
- "order": "順序",
- "remove_association": "移除帳號配對",
- "remove_all_associations": "移除所有配對",
- "confirm": "確認",
- "cancel": "取消",
- "confirm_message": "Are you sure you want to remove all associations?"
- },
- "network": {
- "title": "網路",
- "proxy": {
- "title": "Proxy configuration",
- "no": "不使用代理伺服器",
- "system": "使用系統代理伺服器",
- "manual": "手動設定代理伺服器",
- "protocol": "協定",
- "host": "代理伺服器位址",
- "port": "代理伺服器連接埠",
- "username": "代理伺服器使用者名稱",
- "password": "代理伺服器密碼",
- "protocol_list": {
- "http": "http",
- "https": "https",
- "socks4": "socks4",
- "socks4a": "socks4a",
- "socks5": "socks5",
- "socks5h": "socks5h"
- }
- },
- "save": "儲存"
- },
- "language": {
- "title": "語言",
- "language": {
- "title": "語言",
- "description": "請選擇您欲使用於 Whalebird 之語言。"
- },
- "spellchecker": {
- "title": "拼字檢查",
- "enabled": "Enable spell checker"
- }
- }
- },
- "modals": {
- "jump": {
- "jump_to": "跳至..."
- },
- "add_list_member": {
- "title": "Add member to List",
- "account_name": "帳號名稱"
- },
- "list_membership": {
- "title": "List memberships"
- },
- "mute_confirm": {
- "title": "Mute user",
- "body": "Are you sure you want to mute notifications from this user?",
- "cancel": "取消",
- "ok": "靜音"
- },
- "shortcut": {
- "title": "鍵盤快速鍵",
- "ctrl_number": "切換帳號",
- "ctrl_k": "跳至其他時間軸",
- "ctrl_enter": "Send the post",
- "ctrl_r": "Refresh current timeline",
- "j": "Select the next post",
- "k": "Select the previous post",
- "r": "Reply to the selected post",
- "b": "Boost the selected post",
- "f": "Favourite the selected post",
- "o": "View the selected post's details",
- "p": "Display the profile of the selected post's author",
- "i": "Open the selected post's images",
- "x": "Show/hide a content warned post",
- "?": "Show this dialog",
- "esc": "關閉目前頁面"
- },
- "report": {
- "title": "Report this user",
- "comment": "其他備註",
- "cancel": "取消",
- "ok": "檢舉"
- },
- "thirdparty": {
- "title": "Thirdparty licenses"
- }
- },
- "cards": {
- "toot": {
- "show_more": "顯示更多",
- "hide": "隱藏",
- "sensitive": "顯示敏感內容",
- "view_toot_detail": "View post details",
- "open_in_browser": "Open in browser",
- "copy_link_to_toot": "Copy post link",
- "mute": "靜音",
- "block": "封鎖",
- "report": "檢舉",
- "delete": "刪除",
- "via": "via {{application}}",
- "reply": "回覆",
- "reblog": "Boost",
- "fav": "最愛",
- "detail": "Post details",
- "bookmark": "書籤",
- "pinned": "Pinned post",
- "poll": {
- "vote": "投票",
- "votes_count": "投票數",
- "until": "直到 {{datetime}}",
- "left": "還剩下 {{datetime}}",
- "refresh": "重新整理"
- },
- "open_account": {
- "title": "Account not found",
- "text": "Could not find {{account}} on the server. Do you want to open the account in a browser instead?",
- "ok": "Open",
- "cancel": "Cancel"
- }
- },
- "status_loading": {
- "message": "讀取更多狀態"
- }
- },
- "side_bar": {
- "account_profile": {
- "follows_you": "跟隨了您",
- "doesnt_follow_you": "沒有跟隨您",
- "detail": "詳細資料",
- "follow": "跟隨此使用者",
- "unfollow": "取消跟隨此使用者",
- "subscribe": "Subscribe to this user",
- "unsubscribe": "Unsubscribe from this user",
- "follow_requested": "跟隨請求",
- "open_in_browser": "Open in browser",
- "manage_list_memberships": "Manage list memberships",
- "mute": "靜音",
- "unmute": "取消靜音",
- "unblock": "解除封鎖",
- "block": "封鎖",
- "toots": "Posts",
- "follows": "跟隨",
- "followers": "跟隨者"
- }
- },
- "follow_requests": {
- "accept": "接受",
- "reject": "拒絕"
- },
- "hashtag": {
- "tag_name": "主題標籤名稱",
- "delete_tag": "刪除主題標籤",
- "save_tag": "儲存主題標籤"
- },
- "search": {
- "search": "搜尋",
- "account": "帳號",
- "tag": "主題標籤",
- "keyword": "Keyword",
- "toot": "Post"
- },
- "lists": {
- "index": {
- "new_list": "新列表",
- "edit": "編輯",
- "delete": {
- "confirm": {
- "title": "確認",
- "message": "This list will be permanently deleted. Are you sure you want to continue?",
- "ok": "刪除",
- "cancel": "取消"
- }
- }
- }
- },
- "login": {
- "domain_name_label": "Welcome to Whalebird! Enter a server domain name to log into an account.",
- "proxy_info": "If you need to use a proxy server, please set it up",
- "proxy_here": " 這裡",
- "search": "搜尋",
- "login": "登入"
- },
- "authorize": {
- "manually_1": "授權頁面已於瀏覽器中開啟",
- "manually_2": "If it has not yet opened, please go to the following URL manually:",
- "code_label": "Enter your authorization code:",
- "misskey_label": "請於瀏覽器授權後再送出",
- "submit": "送出"
- },
- "receive_drop": {
- "drop_message": "Drop here to attach a file"
- },
- "message": {
- "account_load_error": "無法載入帳號",
- "account_remove_error": "無法刪除帳號",
- "preferences_load_error": "無法載入偏好設定",
- "timeline_fetch_error": "無法載入時間軸",
- "notification_fetch_error": "無法載入通知",
- "favourite_fetch_error": "Failed to fetch favourite",
- "bookmark_fetch_error": "Failed to fetch bookmarks",
- "follow_request_accept_error": "無法接受請求",
- "follow_request_reject_error": "無法拒絕請求",
- "attach_error": "無法附加檔案",
- "authorize_duplicate_error": "無法以相同帳號登入同一網域",
- "authorize_error": "授權失敗",
- "followers_fetch_error": "無法載入跟隨者",
- "follows_fetch_error": "無法載入跟隨對象",
- "toot_fetch_error": "Failed to fetch the post details",
- "follow_error": "無法跟隨此使用者",
- "unfollow_error": "無法取消跟隨此使用者",
- "subscribe_error": "無法訂閱此使用者",
- "unsubscribe_error": "無法取消訂閱此使用者",
- "lists_fetch_error": "無法載入列表",
- "list_create_error": "無法新增列表",
- "members_fetch_error": "無法載入成員",
- "remove_user_error": "無法移除此使用者",
- "find_account_error": "找不到該帳號",
- "reblog_error": "Failed to boost",
- "unreblog_error": "Failed to unboost",
- "favourite_error": "無法標記最愛",
- "unfavourite_error": "無法取消最愛",
- "bookmark_error": "無法加入書籤",
- "unbookmark_error": "無法移除書籤",
- "delete_error": "Failed to delete the post",
- "search_error": "無法搜尋",
- "toot_error": "Failed to create the post",
- "update_list_memberships_error": "無法更新列表成員",
- "add_user_error": "無法新增使用者",
- "authorize_url_error": "無法取得授權 URL",
- "domain_confirmed": "{{domain}} is confirmed, please log in",
- "domain_doesnt_exist": "Failed to connect to {{domain}}, make sure the server URL is valid or correct.",
- "loading": "載入中...",
- "language_not_support_spellchecker_error": "This language is not supported by the spell checker",
- "update_filter_error": "無法更新過濾器",
- "create_filter_error": "無法新增過濾器"
- },
- "validation": {
- "login": {
- "require_domain_name": "請填入網域名稱",
- "domain_format": "請僅輸入網域名稱 (無前綴 https://)"
- },
- "compose": {
- "toot_length": "Post length should be between {{min}} and {{max}}",
- "attach_length": "You can only attach up to {{max}} image",
- "attach_length_plural": "You can only attach up to {{max}} images",
- "attach_image": "You can only attach images or videos",
- "poll_invalid": "Invalid poll choices"
- }
- },
- "notification": {
- "favourite": {
- "title": "New favourite",
- "body": "{{username}} favourited your post"
- },
- "follow": {
- "title": "New follower",
- "body": "{{username}} 跟隨您了"
- },
- "follow_request": {
- "title": "New follow request",
- "body": "Received a follow request from {{username}}"
- },
- "reblog": {
- "title": "New boost",
- "body": "{{username}} boosted your post"
- },
- "quote": {
- "title": "New quote",
- "body": "{{username}} quoted your post"
- },
- "reaction": {
- "title": "New reaction",
- "body": "{{username}} reacted to your post"
- },
- "status": {
- "title": "New post",
- "body": "{{username}} made a new post"
- },
- "poll_vote": {
- "title": "New poll vote",
- "body": "{{username}} voted in your poll"
- },
- "poll_expired": {
- "title": "Poll expired",
- "body": "{{username}}'s poll has ended"
- }
- },
- "compose": {
- "title": "New post",
- "cw": "Write your warning here",
- "status": "What's on your mind?",
- "cancel": "Cancel",
- "toot": "Post",
- "description": "Add alternate text for this media",
- "footer": {
- "add_image": "Add images",
- "poll": "Add a poll",
- "change_visibility": "Change visibility",
- "change_sensitive": "Mark media as sensitive",
- "add_cw": "Add content warnings",
- "pined_hashtag": "Pinned hashtag"
- },
- "poll": {
- "add_choice": "Add an option",
- "expires": {
- "5_minutes": "5 minutes",
- "30_minutes": "30 minutes",
- "1_hour": "1 hour",
- "6_hours": "6 hours",
- "1_day": "1 day",
- "3_days": "3 days",
- "7_days": "7 days"
- }
- }
- }
-}
diff --git a/src/config/thirdparty.json b/src/config/thirdparty.json
deleted file mode 100644
index a071306f..00000000
--- a/src/config/thirdparty.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"package_name":"@babel/parser@7.22.4","license":"MIT","publisher":"The Babel Team","repository":"https://github.com/babel/babel"},{"package_name":"@babel/runtime@7.21.5","license":"MIT","publisher":"The Babel Team","repository":"https://github.com/babel/babel"},{"package_name":"@ctrl/tinycolor@3.5.0","license":"MIT","publisher":"Scott Cooper","repository":"https://github.com/scttcper/tinycolor"},{"package_name":"@element-plus/icons-vue@2.0.10","license":"MIT","repository":"https://github.com/element-plus/element-plus-icons"},{"package_name":"@floating-ui/core@1.2.1","license":"MIT","publisher":"atomiks","repository":"https://github.com/floating-ui/floating-ui"},{"package_name":"@floating-ui/dom@1.2.1","license":"MIT","publisher":"atomiks","repository":"https://github.com/floating-ui/floating-ui"},{"package_name":"@fortawesome/fontawesome-common-types@6.4.0","license":"MIT","publisher":"The Font Awesome Team","repository":"https://github.com/FortAwesome/Font-Awesome"},{"package_name":"@fortawesome/fontawesome-svg-core@6.4.0","license":"MIT","publisher":"The Font Awesome Team","repository":"https://github.com/FortAwesome/Font-Awesome"},{"package_name":"@fortawesome/free-regular-svg-icons@6.4.0","license":"(CC-BY-4.0 AND MIT)","publisher":"The Font Awesome Team","repository":"https://github.com/FortAwesome/Font-Awesome"},{"package_name":"@fortawesome/free-solid-svg-icons@6.4.0","license":"(CC-BY-4.0 AND MIT)","publisher":"The Font Awesome Team","repository":"https://github.com/FortAwesome/Font-Awesome"},{"package_name":"@fortawesome/vue-fontawesome@3.0.3","license":"MIT","repository":"https://github.com/FortAwesome/vue-fontawesome"},{"package_name":"@jridgewell/sourcemap-codec@1.4.15","license":"MIT","publisher":"Rich Harris","repository":"https://github.com/jridgewell/sourcemap-codec"},{"package_name":"@sxzz/popperjs-es@2.11.7","license":"MIT","publisher":"Federico Zivolo","repository":"https://github.com/popperjs/popper-core"},{"package_name":"@trodi/electron-splashscreen@1.0.2","license":"MIT","publisher":"Troy McKinnon","repository":"https://github.com/trodi/electron-splashscreen"},{"package_name":"@types/lodash-es@4.17.6","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/lodash@4.14.191","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/node@20.2.5","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/oauth@0.9.1","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/web-bluetooth@0.0.16","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/web-bluetooth@0.0.17","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@types/ws@8.5.4","license":"MIT","repository":"https://github.com/DefinitelyTyped/DefinitelyTyped"},{"package_name":"@vue/compiler-core@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/compiler-dom@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/compiler-sfc@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/compiler-ssr@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/devtools-api@6.5.0","license":"MIT","publisher":"Guillaume Chau","repository":"https://github.com/vuejs/vue-devtools"},{"package_name":"@vue/reactivity-transform@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/reactivity@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/runtime-core@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/runtime-dom@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/server-renderer@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vue/shared@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"@vueuse/core@10.1.2","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/core@9.13.0","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/math@10.1.2","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/metadata@10.1.2","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/metadata@9.13.0","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/shared@10.1.2","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"@vueuse/shared@9.13.0","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/vueuse/vueuse"},{"package_name":"Whalebird@5.0.5","license":"GPL-3.0*","publisher":"AkiraFukushima","repository":"https://github.com/h3poteto/whalebird-desktop"},{"package_name":"about-window@1.15.2","license":"MIT","publisher":"rhysd","repository":"https://github.com/rhysd/electron-about-window"},{"package_name":"agent-base@6.0.2","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/node-agent-base"},{"package_name":"animate.css@4.1.1","license":"MIT","publisher":"Animate.css","repository":"https://github.com/animate-css/animate.css"},{"package_name":"ansi-regex@5.0.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/chalk/ansi-regex"},{"package_name":"ansi-styles@4.3.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/chalk/ansi-styles"},{"package_name":"applescript@1.0.0","license":"MIT*","publisher":"Nathan Rajlich"},{"package_name":"astral-regex@2.0.0","license":"MIT","publisher":"Kevin Mårtensson","repository":"https://github.com/kevva/astral-regex"},{"package_name":"async-validator@4.2.5","license":"MIT","repository":"https://github.com/yiminghe/async-validator"},{"package_name":"async@2.6.4","license":"MIT","publisher":"Caolan McMahon","repository":"https://github.com/caolan/async"},{"package_name":"asynckit@0.4.0","license":"MIT","publisher":"Alex Indigo","repository":"https://github.com/alexindigo/asynckit"},{"package_name":"auto-launch@5.0.5","license":"MIT","publisher":"Donal Linehan","repository":"https://github.com/4ver/node-auto-launch"},{"package_name":"axios@1.4.0","license":"MIT","publisher":"Matt Zabriskie","repository":"https://github.com/axios/axios"},{"package_name":"babel-polyfill@6.26.0","license":"MIT","publisher":"Sebastian McKenzie","repository":"https://github.com/babel/babel/tree/master/packages/babel-polyfill"},{"package_name":"babel-runtime@6.26.0","license":"MIT","publisher":"Sebastian McKenzie","repository":"https://github.com/babel/babel/tree/master/packages/babel-runtime"},{"package_name":"balanced-match@1.0.2","license":"MIT","publisher":"Julian Gruber","repository":"https://github.com/juliangruber/balanced-match"},{"package_name":"base64-js@1.5.1","license":"MIT","publisher":"T. Jameson Little","repository":"https://github.com/beatgammit/base64-js"},{"package_name":"better-sqlite3@8.4.0","license":"MIT","publisher":"Joshua Wise","repository":"https://github.com/WiseLibs/better-sqlite3"},{"package_name":"bindings@1.5.0","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/node-bindings"},{"package_name":"bl@4.1.0","license":"MIT","repository":"https://github.com/rvagg/bl"},{"package_name":"brace-expansion@1.1.11","license":"MIT","publisher":"Julian Gruber","repository":"https://github.com/juliangruber/brace-expansion"},{"package_name":"buffer@5.7.1","license":"MIT","publisher":"Feross Aboukhadijeh","repository":"https://github.com/feross/buffer"},{"package_name":"bufferutil@4.0.7","license":"MIT","publisher":"Einar Otto Stangvik","repository":"https://github.com/websockets/bufferutil"},{"package_name":"chownr@1.1.4","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/chownr"},{"package_name":"cli-truncate@2.1.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/cli-truncate"},{"package_name":"color-convert@2.0.1","license":"MIT","publisher":"Heather Arthur","repository":"https://github.com/Qix-/color-convert"},{"package_name":"color-name@1.1.4","license":"MIT","publisher":"DY","repository":"https://github.com/colorjs/color-name"},{"package_name":"combined-stream@1.0.8","license":"MIT","publisher":"Felix Geisendörfer","repository":"https://github.com/felixge/node-combined-stream"},{"package_name":"concat-map@0.0.1","license":"MIT","publisher":"James Halliday","repository":"https://github.com/substack/node-concat-map"},{"package_name":"core-js@2.6.12","license":"MIT","repository":"https://github.com/zloirock/core-js"},{"package_name":"core-js@3.30.2","license":"MIT","publisher":"Denis Pushkarev","repository":"https://github.com/zloirock/core-js"},{"package_name":"csstype@3.1.2","license":"MIT","publisher":"Fredrik Nicol","repository":"https://github.com/frenic/csstype"},{"package_name":"dayjs@1.11.7","license":"MIT","publisher":"iamkun","repository":"https://github.com/iamkun/dayjs"},{"package_name":"debug@4.3.4","license":"MIT","publisher":"Josh Junon","repository":"https://github.com/debug-js/debug"},{"package_name":"decompress-response@6.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/decompress-response"},{"package_name":"deep-extend@0.6.0","license":"MIT","publisher":"Viacheslav Lotsmanov","repository":"https://github.com/unclechu/node-deep-extend"},{"package_name":"deepmerge@4.3.0","license":"MIT","repository":"https://github.com/TehShrike/deepmerge"},{"package_name":"delayed-stream@1.0.0","license":"MIT","publisher":"Felix Geisendörfer","repository":"https://github.com/felixge/node-delayed-stream"},{"package_name":"detect-libc@2.0.1","license":"Apache-2.0","publisher":"Lovell Fuller","repository":"https://github.com/lovell/detect-libc"},{"package_name":"dom-serializer@2.0.0","license":"MIT","publisher":"Felix Boehm","repository":"https://github.com/cheeriojs/dom-serializer"},{"package_name":"domelementtype@2.3.0","license":"BSD-2-Clause","publisher":"Felix Boehm","repository":"https://github.com/fb55/domelementtype"},{"package_name":"domhandler@5.0.3","license":"BSD-2-Clause","publisher":"Felix Boehm","repository":"https://github.com/fb55/domhandler"},{"package_name":"domutils@3.0.1","license":"BSD-2-Clause","publisher":"Felix Boehm","repository":"https://github.com/fb55/domutils"},{"package_name":"electron-context-menu@3.6.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/electron-context-menu"},{"package_name":"electron-dl@3.5.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/electron-dl"},{"package_name":"electron-is-dev@2.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/electron-is-dev"},{"package_name":"electron-json-storage@4.6.0","license":"MIT","publisher":"Juan Cruz Viotti","repository":"https://github.com/electron-userland/electron-json-storage"},{"package_name":"electron-log@4.4.8","license":"MIT","publisher":"Alexey Prokhorov","repository":"https://github.com/megahertz/electron-log"},{"package_name":"electron-window-state@5.0.3","license":"MIT","publisher":"Marcel Wiehle","repository":"https://github.com/mawie81/electron-window-state"},{"package_name":"element-plus@2.3.4","license":"MIT","repository":"https://github.com/element-plus/element-plus"},{"package_name":"emoji-mart-vue-fast@12.0.4","license":"BSD-3-Clause","publisher":"Borys Serebrov","repository":"https://github.com/serebrov/emoji-mart-vue"},{"package_name":"emoji-regex@8.0.0","license":"MIT","publisher":"Mathias Bynens","repository":"https://github.com/mathiasbynens/emoji-regex"},{"package_name":"end-of-stream@1.4.4","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/mafintosh/end-of-stream"},{"package_name":"entities@4.4.0","license":"BSD-2-Clause","publisher":"Felix Boehm","repository":"https://github.com/fb55/entities"},{"package_name":"escape-goat@2.1.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/escape-goat"},{"package_name":"escape-html@1.0.3","license":"MIT","repository":"https://github.com/component/escape-html"},{"package_name":"escape-string-regexp@4.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/escape-string-regexp"},{"package_name":"estree-walker@2.0.2","license":"MIT","publisher":"Rich Harris","repository":"https://github.com/Rich-Harris/estree-walker"},{"package_name":"expand-template@2.0.3","license":"(MIT OR WTFPL)","publisher":"LM","repository":"https://github.com/ralphtheninja/expand-template"},{"package_name":"ext-list@2.2.2","license":"MIT","publisher":"Kevin Mårtensson","repository":"https://github.com/kevva/ext-list"},{"package_name":"ext-name@5.0.0","license":"MIT","publisher":"Kevin Mårtensson","repository":"https://github.com/kevva/ext-name"},{"package_name":"file-type@10.11.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/file-type"},{"package_name":"file-uri-to-path@1.0.0","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/file-uri-to-path"},{"package_name":"follow-redirects@1.15.2","license":"MIT","publisher":"Ruben Verborgh","repository":"https://github.com/follow-redirects/follow-redirects"},{"package_name":"form-data@4.0.0","license":"MIT","publisher":"Felix Geisendörfer","repository":"https://github.com/form-data/form-data"},{"package_name":"fs-constants@1.0.0","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/mafintosh/fs-constants"},{"package_name":"fs.realpath@1.0.0","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/fs.realpath"},{"package_name":"github-from-package@0.0.0","license":"MIT","publisher":"James Halliday","repository":"https://github.com/substack/github-from-package"},{"package_name":"glob@7.2.3","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/node-glob"},{"package_name":"graceful-fs@4.2.10","license":"ISC","repository":"https://github.com/isaacs/node-graceful-fs"},{"package_name":"htmlparser2@8.0.1","license":"MIT","publisher":"Felix Boehm","repository":"https://github.com/fb55/htmlparser2"},{"package_name":"https-proxy-agent@5.0.1","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/node-https-proxy-agent"},{"package_name":"i18next@22.4.15","license":"MIT","publisher":"Jan Mühlemann","repository":"https://github.com/i18next/i18next"},{"package_name":"ieee754@1.2.1","license":"BSD-3-Clause","publisher":"Feross Aboukhadijeh","repository":"https://github.com/feross/ieee754"},{"package_name":"imurmurhash@0.1.4","license":"MIT","publisher":"Jens Taylor","repository":"https://github.com/jensyt/imurmurhash-js"},{"package_name":"inflight@1.0.6","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/npm/inflight"},{"package_name":"inherits@2.0.4","license":"ISC","repository":"https://github.com/isaacs/inherits"},{"package_name":"ini@1.3.8","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/ini"},{"package_name":"ip@2.0.0","license":"MIT","publisher":"Fedor Indutny","repository":"https://github.com/indutny/node-ip"},{"package_name":"is-fullwidth-code-point@3.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/is-fullwidth-code-point"},{"package_name":"is-plain-obj@1.1.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/is-plain-obj"},{"package_name":"is-plain-object@5.0.0","license":"MIT","publisher":"Jon Schlinkert","repository":"https://github.com/jonschlinkert/is-plain-object"},{"package_name":"jsonfile@4.0.0","license":"MIT","publisher":"JP Richardson","repository":"https://github.com/jprichardson/node-jsonfile"},{"package_name":"lockfile@1.0.4","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/npm/lockfile"},{"package_name":"lodash-es@4.17.21","license":"MIT","publisher":"John-David Dalton","repository":"https://github.com/lodash/lodash"},{"package_name":"lodash-unified@1.0.3","license":"MIT","publisher":"Jack Works"},{"package_name":"lodash@4.17.21","license":"MIT","publisher":"John-David Dalton","repository":"https://github.com/lodash/lodash"},{"package_name":"lru-cache@6.0.0","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/node-lru-cache"},{"package_name":"magic-string@0.30.0","license":"MIT","publisher":"Rich Harris","repository":"https://github.com/rich-harris/magic-string"},{"package_name":"megalodon@6.0.3","license":"MIT","publisher":"h3poteto","repository":"https://github.com/h3poteto/megalodon"},{"package_name":"memoize-one@6.0.0","license":"MIT","publisher":"Alex Reardon","repository":"https://github.com/alexreardon/memoize-one"},{"package_name":"mime-db@1.52.0","license":"MIT","repository":"https://github.com/jshttp/mime-db"},{"package_name":"mime-types@2.1.35","license":"MIT","repository":"https://github.com/jshttp/mime-types"},{"package_name":"mimic-response@3.1.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/mimic-response"},{"package_name":"minimatch@3.1.2","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/minimatch"},{"package_name":"minimist@1.2.8","license":"MIT","publisher":"James Halliday","repository":"https://github.com/minimistjs/minimist"},{"package_name":"mitt@2.1.0","license":"MIT","repository":"https://github.com/developit/mitt"},{"package_name":"mitt@3.0.0","license":"MIT","repository":"https://github.com/developit/mitt"},{"package_name":"mkdirp-classic@0.5.3","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/mafintosh/mkdirp-classic"},{"package_name":"mkdirp@0.5.6","license":"MIT","publisher":"James Halliday","repository":"https://github.com/substack/node-mkdirp"},{"package_name":"modify-filename@1.1.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/modify-filename"},{"package_name":"moment@2.29.4","license":"MIT","publisher":"Iskren Ivov Chernev","repository":"https://github.com/moment/moment"},{"package_name":"mousetrap@1.6.5","license":"Apache-2.0 WITH LLVM-exception","publisher":"Craig Campbell","repository":"https://github.com/ccampbell/mousetrap"},{"package_name":"ms@2.1.2","license":"MIT","repository":"https://github.com/zeit/ms"},{"package_name":"nanoid@3.3.6","license":"MIT","publisher":"Andrey Sitnik","repository":"https://github.com/ai/nanoid"},{"package_name":"napi-build-utils@1.0.2","license":"MIT","publisher":"Jim Schlight","repository":"https://github.com/inspiredware/napi-build-utils"},{"package_name":"node-abi@3.33.0","license":"MIT","publisher":"Lukas Geiger","repository":"https://github.com/electron/node-abi"},{"package_name":"node-gyp-build@4.6.0","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/prebuild/node-gyp-build"},{"package_name":"normalize-wheel-es@1.2.0","license":"BSD-3-Clause","publisher":"Bas Stottelaar","repository":"https://github.com/sxzz/normalize-wheel-es"},{"package_name":"oauth@0.10.0","license":"MIT","publisher":"Ciaran Jessup","repository":"https://github.com/ciaranj/node-oauth"},{"package_name":"object-assign-deep@0.4.0","license":"MIT","publisher":"Josh Cole","repository":"https://github.com/saikojosh/Object-Assign-Deep"},{"package_name":"once@1.4.0","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/once"},{"package_name":"opencollective-postinstall@2.0.3","license":"MIT","publisher":"Xavier Damman","repository":"https://github.com/opencollective/opencollective-postinstall"},{"package_name":"p-finally@1.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/p-finally"},{"package_name":"p-try@2.2.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/p-try"},{"package_name":"parse-link-header@2.0.0","license":"MIT","publisher":"Thorsten Lorenz","repository":"https://github.com/thlorenz/parse-link-header"},{"package_name":"parse-srcset@1.0.2","license":"MIT","publisher":"Alex Bell","repository":"https://github.com/albell/parse-srcset"},{"package_name":"path-exists@4.0.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/path-exists"},{"package_name":"path-is-absolute@1.0.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/path-is-absolute"},{"package_name":"picocolors@1.0.0","license":"ISC","publisher":"Alexey Raspopov","repository":"https://github.com/alexeyraspopov/picocolors"},{"package_name":"pify@4.0.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/pify"},{"package_name":"popper.js@1.16.1","license":"MIT","publisher":"Federico Zivolo","repository":"https://github.com/FezVrasta/popper.js"},{"package_name":"postcss@8.4.23","license":"MIT","publisher":"Andrey Sitnik","repository":"https://github.com/postcss/postcss"},{"package_name":"prebuild-install@7.1.1","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/prebuild/prebuild-install"},{"package_name":"proxy-from-env@1.1.0","license":"MIT","publisher":"Rob Wu","repository":"https://github.com/Rob--W/proxy-from-env"},{"package_name":"pump@3.0.0","license":"MIT","publisher":"Mathias Buus Madsen","repository":"https://github.com/mafintosh/pump"},{"package_name":"pupa@2.1.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/pupa"},{"package_name":"rc@1.2.8","license":"(BSD-2-Clause OR MIT OR Apache-2.0)","publisher":"Dominic Tarr","repository":"https://github.com/dominictarr/rc"},{"package_name":"read-chunk@3.2.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/read-chunk"},{"package_name":"readable-stream@3.6.1","license":"MIT","repository":"https://github.com/nodejs/readable-stream"},{"package_name":"readable-stream@3.6.2","license":"MIT","repository":"https://github.com/nodejs/readable-stream"},{"package_name":"regenerator-runtime@0.10.5","license":"MIT","publisher":"Ben Newman","repository":"https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime"},{"package_name":"regenerator-runtime@0.11.1","license":"MIT","publisher":"Ben Newman","repository":"https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime"},{"package_name":"regenerator-runtime@0.13.11","license":"MIT","publisher":"Ben Newman","repository":"https://github.com/facebook/regenerator/tree/main/packages/runtime"},{"package_name":"rimraf@2.7.1","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/rimraf"},{"package_name":"safe-buffer@5.2.1","license":"MIT","publisher":"Feross Aboukhadijeh","repository":"https://github.com/feross/safe-buffer"},{"package_name":"sanitize-html@2.10.0","license":"MIT","publisher":"Apostrophe Technologies, Inc.","repository":"https://github.com/apostrophecms/sanitize-html"},{"package_name":"semver@7.3.8","license":"ISC","publisher":"GitHub Inc.","repository":"https://github.com/npm/node-semver"},{"package_name":"signal-exit@3.0.7","license":"ISC","publisher":"Ben Coe","repository":"https://github.com/tapjs/signal-exit"},{"package_name":"simplayer@0.0.8","license":"MIT","publisher":"MaxMEllon"},{"package_name":"simple-concat@1.0.1","license":"MIT","publisher":"Feross Aboukhadijeh","repository":"https://github.com/feross/simple-concat"},{"package_name":"simple-get@4.0.1","license":"MIT","publisher":"Feross Aboukhadijeh","repository":"https://github.com/feross/simple-get"},{"package_name":"slice-ansi@3.0.0","license":"MIT","repository":"https://github.com/chalk/slice-ansi"},{"package_name":"smart-buffer@4.2.0","license":"MIT","publisher":"Josh Glazebrook","repository":"https://github.com/JoshGlazebrook/smart-buffer"},{"package_name":"socks-proxy-agent@7.0.0","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/node-socks-proxy-agent"},{"package_name":"socks@2.7.1","license":"MIT","publisher":"Josh Glazebrook","repository":"https://github.com/JoshGlazebrook/socks"},{"package_name":"sort-keys-length@1.0.1","license":"MIT","publisher":"Kevin Mårtensson","repository":"https://github.com/kevva/sort-keys-length"},{"package_name":"sort-keys@1.1.2","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/sort-keys"},{"package_name":"source-map-js@1.0.2","license":"BSD-3-Clause","publisher":"Valentin 7rulnik Semirulnik","repository":"https://github.com/7rulnik/source-map-js"},{"package_name":"string-width@4.2.3","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/string-width"},{"package_name":"string_decoder@1.3.0","license":"MIT","repository":"https://github.com/nodejs/string_decoder"},{"package_name":"strip-ansi@6.0.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/chalk/strip-ansi"},{"package_name":"strip-json-comments@2.0.1","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/strip-json-comments"},{"package_name":"system-font-families@0.6.0","license":"Apache-2.0","publisher":"Ryan Burgett","repository":"https://github.com/rBurgett/system-font-families"},{"package_name":"tar-fs@2.1.1","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/mafintosh/tar-fs"},{"package_name":"tar-stream@2.2.0","license":"MIT","publisher":"Mathias Buus","repository":"https://github.com/mafintosh/tar-stream"},{"package_name":"ttfinfo@0.2.0","license":"MIT","publisher":"Trevor Dixon","repository":"https://github.com/trevordixon/ttfinfo"},{"package_name":"tunnel-agent@0.6.0","license":"Apache-2.0","publisher":"Mikeal Rogers","repository":"https://github.com/mikeal/tunnel-agent"},{"package_name":"typescript@5.0.4","license":"Apache-2.0","publisher":"Microsoft Corp.","repository":"https://github.com/Microsoft/TypeScript"},{"package_name":"unicode-emoji-json@0.4.0","license":"MIT","publisher":"Mu-An Chiou","repository":"https://github.com/muan/unicode-emoji-json"},{"package_name":"untildify@3.0.3","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/untildify"},{"package_name":"unused-filename@2.1.0","license":"MIT","publisher":"Sindre Sorhus","repository":"https://github.com/sindresorhus/unused-filename"},{"package_name":"utf-8-validate@6.0.3","license":"MIT","publisher":"Einar Otto Stangvik","repository":"https://github.com/websockets/utf-8-validate"},{"package_name":"util-deprecate@1.0.2","license":"MIT","publisher":"Nathan Rajlich","repository":"https://github.com/TooTallNate/util-deprecate"},{"package_name":"uuid@9.0.0","license":"MIT","repository":"https://github.com/uuidjs/uuid"},{"package_name":"vue-demi@0.14.0","license":"MIT","publisher":"Anthony Fu","repository":"https://github.com/antfu/vue-demi"},{"package_name":"vue-observe-visibility@2.0.0-alpha.1","license":"MIT","publisher":"Guillaume Chau","repository":"https://github.com/Akryum/vue-observe-visibility"},{"package_name":"vue-popperjs@2.3.0","license":"MIT","publisher":"Igor Ognichenko","repository":"https://github.com/RobinCK/vue-popper"},{"package_name":"vue-resize@2.0.0-alpha.1","license":"MIT","publisher":"Guillaume Chau","repository":"https://github.com/Akryum/vue-resize"},{"package_name":"vue-router@4.2.2","license":"MIT","repository":"https://github.com/vuejs/router"},{"package_name":"vue-virtual-scroller@2.0.0-beta.8","license":"MIT","publisher":"Guillaume Chau","repository":"https://github.com/Akryum/vue-virtual-scroller"},{"package_name":"vue3-i18next@0.2.2","license":"MIT","publisher":"h3poteto","repository":"https://github.com/h3poteto/vue3-i18next"},{"package_name":"vue@3.3.4","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/core"},{"package_name":"vuex-router-sync@6.0.0-rc.1","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/vuex-router-sync"},{"package_name":"vuex@4.1.0","license":"MIT","publisher":"Evan You","repository":"https://github.com/vuejs/vuex"},{"package_name":"winreg@1.2.4","license":"BSD-2-Clause","publisher":"Paul Bottin","repository":"https://github.com/fresc81/node-winreg"},{"package_name":"with-open-file@0.1.7","license":"MIT","publisher":"Raphael von der Grün","repository":"https://github.com/raphinesse/with-open-file"},{"package_name":"wrappy@1.0.2","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/npm/wrappy"},{"package_name":"write-file-atomic@2.4.3","license":"ISC","publisher":"Rebecca Turner","repository":"https://github.com/iarna/write-file-atomic"},{"package_name":"ws@8.13.0","license":"MIT","publisher":"Einar Otto Stangvik","repository":"https://github.com/websockets/ws"},{"package_name":"xtend@4.0.2","license":"MIT","publisher":"Raynos","repository":"https://github.com/Raynos/xtend"},{"package_name":"yallist@4.0.0","license":"ISC","publisher":"Isaac Z. Schlueter","repository":"https://github.com/isaacs/yallist"}]
\ No newline at end of file
diff --git a/src/constants/displayStyle/index.ts b/src/constants/displayStyle/index.ts
deleted file mode 100644
index 8e72d37e..00000000
--- a/src/constants/displayStyle/index.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-export type DisplayStyleType = {
- name: string
- value: number
-}
-
-export type DisplayStyleList = {
- DisplayNameAndUsername: DisplayStyleType
- DisplayName: DisplayStyleType
- Username: DisplayStyleType
-}
-
-const displayStyleList: DisplayStyleList = {
- DisplayNameAndUsername: {
- name: 'preferences.appearance.display_style.display_name_and_username',
- value: 0
- },
- DisplayName: {
- name: 'preferences.appearance.display_style.display_name',
- value: 1
- },
- Username: {
- name: 'preferences.appearance.display_style.username',
- value: 2
- }
-}
-
-export default displayStyleList
diff --git a/src/constants/initializer/preferences.ts b/src/constants/initializer/preferences.ts
deleted file mode 100644
index 61624a7f..00000000
--- a/src/constants/initializer/preferences.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import DisplayStyle from '~/src/constants/displayStyle'
-import Theme from '~/src/constants/theme'
-import Language from '~/src/constants/language'
-import TimeFormat from '~/src/constants/timeFormat'
-import { LightTheme } from '~/src/constants/themeColor'
-import DefaultFonts from '~/src/renderer/utils/fonts'
-import { Sound } from '~/src/types/sound'
-import { Timeline } from '~/src/types/timeline'
-import { Notify } from '~/src/types/notify'
-import { Appearance } from '~/src/types/appearance'
-import { Language as LanguageSet } from '~/src/types/language'
-import { General, State, Notification, BaseConfig, Other, Menu } from '~/src/types/preference'
-import { Proxy, ProxySource } from '~/src/types/proxy'
-
-const sound: Sound = {
- fav_rb: true,
- toot: true
-}
-
-const timeline: Timeline = {
- cw: false,
- nsfw: false,
- hideAllAttachments: false
-}
-
-const other: Other = {
- launch: false,
- hideOnLaunch: false
-}
-
-const general: General = {
- sound: sound,
- timeline: timeline,
- other: other
-}
-
-const state: State = {
- collapse: false,
- hideGlobalHeader: false
-}
-
-const notify: Notify = {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true,
- follow_request: true,
- reaction: true,
- status: true,
- poll_vote: true,
- poll_expired: true
-}
-
-const language: LanguageSet = {
- language: Language.en.key,
- spellchecker: {
- enabled: true,
- languages: [Language.en.key]
- }
-}
-
-const notification: Notification = {
- notify: notify
-}
-
-const appearance: Appearance = {
- theme: Theme.System.key,
- fontSize: 14,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- timeFormat: TimeFormat.Absolute.value,
- customThemeColor: LightTheme,
- font: DefaultFonts[0],
- tootPadding: 8
-}
-
-const proxy: Proxy = {
- source: ProxySource.system,
- manualProxyConfig: {
- protocol: '',
- host: '',
- port: '',
- username: '',
- password: ''
- }
-}
-
-const menu: Menu = {
- autoHideMenu: false
-}
-
-export const Base: BaseConfig = {
- general: general,
- state: state,
- language: language,
- notification: notification,
- appearance: appearance,
- proxy: proxy,
- menu: menu
-}
diff --git a/src/constants/initializer/setting.ts b/src/constants/initializer/setting.ts
deleted file mode 100644
index 298dcfd9..00000000
--- a/src/constants/initializer/setting.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Setting } from '~/src/types/setting'
-
-export const DefaultSetting: Setting = {
- accountId: 0,
- markerHome: false,
- markerNotifications: true
-}
diff --git a/src/constants/language/index.ts b/src/constants/language/index.ts
deleted file mode 100644
index 31fc9d46..00000000
--- a/src/constants/language/index.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-export type LanguageType = {
- name: string
- key: string
- rfc4646: string
-}
-
-export type LanguageList = {
- de: LanguageType
- en: LanguageType
- fr: LanguageType
- gd: LanguageType
- ja: LanguageType
- ko: LanguageType
- pl: LanguageType
- id: LanguageType
- it: LanguageType
- zh_cn: LanguageType
- zh_tw: LanguageType
- cs: LanguageType
- es_es: LanguageType
- no: LanguageType
- pt_pt: LanguageType
- ru: LanguageType
- si: LanguageType
- sv_se: LanguageType
- tzm: LanguageType
- fa: LanguageType
- is: LanguageType
- eu: LanguageType
- hu: LanguageType
-}
-
-const languageList: LanguageList = {
- de: {
- name: 'Deutsch',
- key: 'de',
- rfc4646: 'de'
- },
- en: {
- name: 'English',
- key: 'en',
- rfc4646: 'en-US'
- },
- eu: {
- name: 'Basque',
- key: 'eu',
- rfc4646: 'eu'
- },
- fa: {
- name: 'Persian',
- key: 'fa',
- rfc4646: 'fa'
- },
- fr: {
- name: 'Français',
- key: 'fr',
- rfc4646: 'fr'
- },
- gd: {
- name: 'Gàidhlig',
- key: 'gd',
- rfc4646: 'gd'
- },
- ja: {
- name: '日本語',
- key: 'ja',
- rfc4646: 'ja-JP'
- },
- ko: {
- name: '한국어',
- key: 'ko',
- rfc4646: 'ko'
- },
- pl: {
- name: 'Polski',
- key: 'pl',
- rfc4646: 'pl'
- },
- hu: {
- name: 'Hungarian',
- key: 'hu',
- rfc4646: 'hu'
- },
- id: {
- name: 'Indonesian',
- key: 'id',
- rfc4646: 'id'
- },
- is: {
- name: 'Icelandic',
- key: 'is',
- rfc4646: 'is'
- },
- it: {
- name: 'Italiano',
- key: 'it',
- rfc4646: 'it'
- },
- zh_cn: {
- name: '简体中文',
- key: 'zh_cn',
- rfc4646: 'zh-CN'
- },
- zh_tw: {
- name: '繁體中文',
- key: 'zh_tw',
- rfc4646: 'zh-TW'
- },
- cs: {
- name: 'čeština',
- key: 'cs',
- rfc4646: 'cs'
- },
- es_es: {
- name: 'Español',
- key: 'es_es',
- rfc4646: 'es-ES'
- },
- no: {
- name: 'norsk',
- key: 'no',
- rfc4646: 'no'
- },
- pt_pt: {
- name: 'Português',
- key: 'pt_pt',
- rfc4646: 'pt-PT'
- },
- ru: {
- name: 'русский',
- key: 'ru',
- rfc4646: 'ru'
- },
- si: {
- name: 'සිංහල',
- key: 'si',
- rfc4646: 'si'
- },
- sv_se: {
- name: 'svenska',
- key: 'sv_se',
- rfc4646: 'sv-SE'
- },
- tzm: {
- name: 'Tamaziɣt',
- key: 'tzm',
- rfc4646: 'tzm'
- }
-}
-
-export default languageList
diff --git a/src/constants/servers/quote.ts b/src/constants/servers/quote.ts
deleted file mode 100644
index 0acb30cd..00000000
--- a/src/constants/servers/quote.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-const QuoteSupportMastodon: Array = ['fedibird.com']
-
-export { QuoteSupportMastodon }
diff --git a/src/constants/theme/index.ts b/src/constants/theme/index.ts
deleted file mode 100644
index 3d6781ca..00000000
--- a/src/constants/theme/index.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-export type ThemeType = {
- name: string
- key: string
-}
-
-export type ThemeList = {
- System: ThemeType
- Light: ThemeType
- Dark: ThemeType
- SolarizedLight: ThemeType
- SolarizedDark: ThemeType
- KimbieDark: ThemeType
- Custom: ThemeType
-}
-
-const themeList: ThemeList = {
- System: {
- name: 'preferences.appearance.theme.system',
- key: 'system'
- },
- Light: {
- name: 'preferences.appearance.theme.light',
- key: 'light'
- },
- Dark: {
- name: 'preferences.appearance.theme.dark',
- key: 'dark'
- },
- SolarizedLight: {
- name: 'preferences.appearance.theme.solarized_light',
- key: 'solarized_light'
- },
- SolarizedDark: {
- name: 'preferences.appearance.theme.solarized_dark',
- key: 'solarized_dark'
- },
- KimbieDark: {
- name: 'preferences.appearance.theme.kimbie_dark',
- key: 'kimbie_dark'
- },
- Custom: {
- name: 'preferences.appearance.theme.custom',
- key: 'custom'
- }
-}
-
-export default themeList
diff --git a/src/constants/themeColor/index.ts b/src/constants/themeColor/index.ts
deleted file mode 100644
index 4c5d533e..00000000
--- a/src/constants/themeColor/index.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-export type ThemeColorType = {
- background_color: string
- selected_background_color: string
- global_header_color: string
- side_menu_color: string
- primary_color: string
- regular_color: string
- secondary_color: string
- border_color: string
- header_menu_color: string
- wrapper_mask_color: string
- scrollbar_color: string
-}
-
-export const LightTheme: ThemeColorType = {
- background_color: '#ffffff',
- selected_background_color: '#f2f6fc',
- global_header_color: '#4a5664',
- side_menu_color: '#373d48',
- primary_color: '#303133',
- regular_color: '#606266',
- secondary_color: '#909399',
- border_color: '#ebeef5',
- header_menu_color: '#ffffff',
- wrapper_mask_color: 'rgba(255, 255, 255, 0.7)',
- scrollbar_color: 'rgba(0, 0, 0, 0.4)'
-}
-
-export const DarkTheme: ThemeColorType = {
- background_color: '#282c37',
- selected_background_color: '#313543',
- global_header_color: '#393f4f',
- side_menu_color: '#191b22',
- primary_color: '#ffffff',
- regular_color: '#ebeef5',
- secondary_color: '#e4e7ed',
- border_color: '#606266',
- header_menu_color: '#444b5d',
- wrapper_mask_color: 'rgba(0, 0, 0, 0.7)',
- scrollbar_color: 'rgba(255, 255, 255, 0.4)'
-}
-
-export const SolarizedLightTheme: ThemeColorType = {
- background_color: '#fdf6e3',
- selected_background_color: '#eee8d5',
- global_header_color: '#002b36',
- side_menu_color: '#073642',
- primary_color: '#657b83',
- regular_color: '#586e75',
- secondary_color: '#839496',
- border_color: '#93a1a1',
- header_menu_color: '#fdf6e3',
- wrapper_mask_color: 'rgba(255, 255, 255, 0.7)',
- scrollbar_color: 'rgba(0, 0, 0, 0.4)'
-}
-
-export const SolarizedDarkTheme: ThemeColorType = {
- background_color: '#073642',
- selected_background_color: '#586e75',
- global_header_color: '#073642',
- side_menu_color: '#002b36',
- primary_color: '#fdf6e3',
- regular_color: '#eee8d5',
- secondary_color: '#839496',
- border_color: '#93a1a1',
- header_menu_color: '#393f4f',
- wrapper_mask_color: 'rgba(0, 0, 0, 0.7)',
- scrollbar_color: 'rgba(255, 255, 255, 0.4)'
-}
-
-export const KimbieDarkTheme: ThemeColorType = {
- background_color: '#221a0f',
- selected_background_color: '#2e2920',
- global_header_color: '#221a0f',
- side_menu_color: '#362712',
- primary_color: '#fbebd4',
- regular_color: '#e4c6a5',
- secondary_color: '#d3af86',
- border_color: '#d6baad',
- header_menu_color: '#a57a4c',
- wrapper_mask_color: 'rgba(0, 0, 0, 0.7)',
- scrollbar_color: 'rgba(255, 255, 255, 0.4)'
-}
diff --git a/src/constants/timeFormat/index.ts b/src/constants/timeFormat/index.ts
deleted file mode 100644
index 6bd14532..00000000
--- a/src/constants/timeFormat/index.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export type TimeFormatType = {
- name: string
- value: number
-}
-
-export type TimeFormatList = {
- Absolute: TimeFormatType
- Relative: TimeFormatType
-}
-
-const timeFormatList: TimeFormatList = {
- Absolute: {
- name: 'preferences.appearance.time_format.absolute',
- value: 0
- },
- Relative: {
- name: 'preferences.appearance.time_format.relative',
- value: 1
- }
-}
-
-export default timeFormatList
diff --git a/src/constants/visibility/index.ts b/src/constants/visibility/index.ts
deleted file mode 100644
index e3af815d..00000000
--- a/src/constants/visibility/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-export type VisibilityType = {
- name: string
- value: number
- key: 'public' | 'unlisted' | 'private' | 'direct'
-}
-
-export type VisibilityList = {
- Public: VisibilityType
- Unlisted: VisibilityType
- Private: VisibilityType
- Direct: VisibilityType
-}
-
-const visibilityList: VisibilityList = {
- Public: {
- name: 'settings.general.toot.visibility.public',
- value: 0,
- key: 'public'
- },
- Unlisted: {
- name: 'settings.general.toot.visibility.unlisted',
- value: 1,
- key: 'unlisted'
- },
- Private: {
- name: 'settings.general.toot.visibility.private',
- value: 2,
- key: 'private'
- },
- Direct: {
- name: 'settings.general.toot.visibility.direct',
- value: 3,
- key: 'direct'
- }
-}
-
-export default visibilityList
diff --git a/src/index.ejs b/src/index.ejs
deleted file mode 100644
index 33bb20f6..00000000
--- a/src/index.ejs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- Whalebird
-
-
-
-
-
-
-
diff --git a/src/main/database.ts b/src/main/database.ts
deleted file mode 100644
index 735a3105..00000000
--- a/src/main/database.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import sqlite, { Database } from 'better-sqlite3'
-
-const newDB = (file: string): Database => {
- const db = new sqlite(file)
-
- // migration
- db.prepare(
- 'CREATE TABLE IF NOT EXISTS accounts(\
-id INTEGER PRIMARY KEY, \
-username TEXT NOT NULL, \
-account_id TEXT NOT NULL, \
-avatar TEXT NOT NULL, \
-client_id TEXT DEFAULT NULL, \
-client_secret TEXT NOT NULL, \
-access_token TEXT NOT NULL, \
-refresh_token TEXT DEFAULT NULL, \
-sort INTEGER UNIQUE NOT NULL)'
- ).run()
-
- db.prepare(
- 'CREATE TABLE IF NOT EXISTS servers(\
-id INTEGER PRIMARY KEY, \
-domain TEXT NOT NULL, \
-base_url TEXT NOT NULL, \
-sns TEXT NOT NULL, \
-account_id INTEGER UNIQUE DEFAULT NULL, \
-FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)'
- ).run()
- db.prepare(
- 'CREATE TABLE IF NOT EXISTS hashtags(\
-id INTEGER PRIMARY KEY, \
-tag TEXT NOT NULL, \
-account_id INTEGER UNIQUE NOT NULL, \
-FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)'
- ).run()
- db.prepare(
- 'CREATE TABLE IF NOT EXISTS settings(\
-id INTEGER PRIMARY KEY, \
-account_id INTEGER UNIQUE NOT NULL, \
-marker_home BOOLEAN NOT NULL DEFAULT false, \
-marker_notifications BOOLEAN NOT NULL DEFAULT true, \
-FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE)'
- ).run()
- db.prepare(
- "DELETE FROM accounts WHERE id IN (SELECT accounts.id FROM accounts INNER JOIN servers ON servers.account_id = accounts.id WHERE servers.sns = 'misskey')"
- ).run()
-
- return db
-}
-
-export default newDB
diff --git a/src/main/db/account.ts b/src/main/db/account.ts
deleted file mode 100644
index 4e30489d..00000000
--- a/src/main/db/account.ts
+++ /dev/null
@@ -1,227 +0,0 @@
-import { Database } from 'better-sqlite3'
-import { LocalAccount } from '~/src/types/localAccount'
-import { LocalServer } from '~src/types/localServer'
-
-export const insertAccount = (
- db: Database,
- username: string,
- accountId: string,
- avatar: string,
- clientId: string,
- clientSecret: string,
- accessToken: string,
- refreshToken: string | null,
- serverId: number
-): Promise => {
- return new Promise((resolve, reject) => {
- const f = db.transaction(() => {
- const row = db.prepare('SELECT * FROM accounts ORDER BY sort DESC').get()
- let order = 1
- if (row) {
- order = row.sort + 1
- }
- try {
- const res = db
- .prepare(
- 'INSERT INTO accounts(username, account_id, avatar, client_id, client_secret, access_token, refresh_token, sort) VALUES (?, ?, ?, ?, ?, ?, ?, ?)'
- )
- .run(username, accountId, avatar, clientId, clientSecret, accessToken, refreshToken, order)
- const id = res.lastInsertRowid as number
- db.prepare('UPDATE servers SET account_id = ? WHERE id = ?').run(id, serverId)
- return resolve({
- id,
- username,
- accountId,
- avatar,
- clientId,
- clientSecret,
- accessToken,
- refreshToken,
- order
- })
- } catch (err) {
- reject(err)
- }
- })
- f()
- })
-}
-
-/**
- * List up authenticated accounts.
- */
-export const listAccounts = (db: Database): Promise> => {
- return new Promise(resolve => {
- const rows = db
- .prepare(
- 'SELECT \
-accounts.id as id, \
-accounts.username as username, \
-accounts.account_id as remote_account_id, \
-accounts.avatar as avatar, \
-accounts.client_id as client_id, \
-accounts.client_secret as client_secret, \
-accounts.access_token as access_token, \
-accounts.refresh_token as refresh_token, \
-accounts.sort as sort, \
-servers.id as server_id, \
-servers.base_url as base_url, \
-servers.domain as domain, \
-servers.sns as sns, \
-servers.account_id as account_id \
-FROM accounts INNER JOIN servers ON servers.account_id = accounts.id ORDER BY accounts.sort'
- )
- .all()
-
- resolve(
- rows.map(r => [
- {
- id: r.id,
- username: r.username,
- accountId: r.remote_account_id,
- avatar: r.avatar,
- clientId: r.client_id,
- clientSecret: r.client_secret,
- accessToken: r.access_token,
- refreshToken: r.refresh_token,
- order: r.sort
- } as LocalAccount,
- {
- id: r.server_id,
- baseURL: r.base_url,
- domain: r.domain,
- sns: r.sns,
- accountId: r.account_id
- } as LocalServer
- ])
- )
- })
-}
-
-export const getAccount = (db: Database, id: number): Promise<[LocalAccount, LocalServer]> => {
- return new Promise((resolve, reject) => {
- const row = db
- .prepare(
- 'SELECT \
-accounts.id as id, \
-accounts.username as username, \
-accounts.account_id as remote_account_id, \
-accounts.avatar as avatar, \
-accounts.client_id as client_id, \
-accounts.client_secret as client_secret, \
-accounts.access_token as access_token, \
-accounts.refresh_token as refresh_token, \
-accounts.sort as sort, \
-servers.id as server_id, \
-servers.base_url as base_url, \
-servers.domain as domain, \
-servers.sns as sns, \
-servers.account_id as account_id \
-FROM accounts INNER JOIN servers ON servers.account_id = accounts.id WHERE accounts.id = ?'
- )
- .get(id)
- if (row) {
- resolve([
- {
- id: row.id,
- username: row.username,
- accountId: row.remote_account_id,
- avatar: row.avatar,
- clientId: row.client_id,
- clientSecret: row.client_secret,
- accessToken: row.access_token,
- refreshToken: row.refresh_token,
- order: row.sort
- } as LocalAccount,
- {
- id: row.server_id,
- baseURL: row.base_url,
- domain: row.domain,
- sns: row.sns,
- accountId: row.account_id
- } as LocalServer
- ])
- } else {
- reject()
- }
- })
-}
-
-export const removeAccount = (db: Database, id: number): Promise => {
- return new Promise((resolve, reject) => {
- db.prepare('PRAGMA foreign_keys = ON').run()
-
- try {
- db.prepare('DELETE FROM accounts WHERE id = ?').run(id), resolve(null)
- } catch (err) {
- reject(err)
- }
- })
-}
-
-export const removeAllAccounts = (db: Database): Promise => {
- return new Promise((resolve, reject) => {
- db.prepare('PRAGMA foreign_keys = ON').run()
-
- try {
- db.prepare('DELETE FROM accounts').run()
- resolve(null)
- } catch (err) {
- reject(err)
- }
- })
-}
-
-export const forwardAccount = (db: Database, id: number): Promise => {
- return new Promise((resolve, reject) => {
- const f = db.transaction(() => {
- const rows = db.prepare('SELECT * FROM accounts ORDER BY sort').all()
-
- const index = rows.findIndex(r => r.id === id)
- if (index < 0 || index >= rows.length - 1) {
- db.prepare('ROLLBACK TRANSACTION').run()
- return resolve(null)
- }
- const target = rows[index + 1]
- const base = rows[index]
-
- try {
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(-100, base.id)
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(base.sort, target.id)
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(target.sort, base.id)
- return resolve(null)
- } catch (err) {
- console.error(err)
- reject(err)
- }
- })
- f()
- })
-}
-
-export const backwardAccount = (db: Database, id: number): Promise => {
- return new Promise((resolve, reject) => {
- const f = db.transaction(() => {
- const rows = db.prepare('SELECT * FROM accounts ORDER BY sort').all()
-
- const index = rows.findIndex(r => r.id === id)
- if (index < 1) {
- db.prepare('ROLLBACK TRANSACTION').run()
- return resolve(null)
- }
- const target = rows[index - 1]
- const base = rows[index]
-
- try {
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(-100, base.id)
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(base.sort, target.id)
- db.prepare('UPDATE accounts SET sort = ? WHERE id = ?').run(target.sort, base.id)
- return resolve(null)
- } catch (err) {
- console.error(err)
- return reject(err)
- }
- })
- f()
- })
-}
diff --git a/src/main/db/hashtags.ts b/src/main/db/hashtags.ts
deleted file mode 100644
index 4994b97e..00000000
--- a/src/main/db/hashtags.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { Database } from 'better-sqlite3'
-import { LocalTag } from '~/src/types/localTag'
-
-export const listTags = (db: Database, accountId: number): Promise> => {
- return new Promise(resolve => {
- const rows = db.prepare('SELECT * FROM hashtags WHERE account_id = ?').all(accountId)
-
- resolve(
- rows.map(r => ({
- id: r.id,
- tagName: r.tag,
- accountId: r.account_id
- }))
- )
- })
-}
-
-export const insertTag = (db: Database, accountId: number, tag: string): Promise => {
- return new Promise((resolve, reject) => {
- const f = db.transaction(() => {
- const row = db.prepare('SELECT * FROM hashtags WHERE id = ? AND tag = ?').get(accountId, tag)
-
- if (row) {
- resolve({
- id: row.id,
- tagName: row.tag,
- accountId: row.account_id
- })
- }
-
- try {
- const res = db.prepare('INSERT INTO hashtags(tag, account_id) VALUES (?, ?)').run(accountId, tag)
- return resolve({
- id: res.lastInsertRowid as number,
- tagName: tag,
- accountId: accountId
- })
- } catch (err) {
- console.error(err)
- reject(err)
- }
- })
- f()
- })
-}
-
-export const removeTag = (db: Database, tag: LocalTag): Promise => {
- return new Promise((resolve, reject) => {
- db.prepare('PRAGMA foreign_keys = ON').run()
-
- try {
- db.prepare('DELETE FROM hashtags WHERE id = ?').run(tag.id)
- resolve(null)
- } catch (err) {
- console.error(err)
- reject(err)
- }
- })
-}
diff --git a/src/main/db/server.ts b/src/main/db/server.ts
deleted file mode 100644
index c4007431..00000000
--- a/src/main/db/server.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Database } from 'better-sqlite3'
-import { LocalServer } from '~/src/types/localServer'
-
-export const insertServer = (
- db: Database,
- baseURL: string,
- domain: string,
- sns: 'mastodon' | 'pleroma' | 'firefish' | 'friendica',
- accountId: number | null
-): Promise => {
- return new Promise((resolve, reject) => {
- try {
- const res = db
- .prepare('INSERT INTO servers(domain, base_url, sns, account_id) values (?, ?, ?, ?)')
- .run(domain, baseURL, sns, accountId)
- resolve({
- id: res.lastInsertRowid as number,
- baseURL,
- domain,
- sns,
- accountId
- })
- } catch (err) {
- reject(err)
- }
- })
-}
-
-export const getServer = (db: Database, id: number): Promise => {
- return new Promise((resolve, reject) => {
- const row = db.prepare('SELECT id, base_url, domain, sns, account_id FROM servers WHERE id = ?').get(id)
- if (row) {
- resolve({
- id: row.id,
- baseURL: row.base_url,
- domain: row.domain,
- sns: row.sns,
- accountId: row.account_id
- } as LocalServer)
- } else {
- reject()
- }
- })
-}
diff --git a/src/main/db/setting.ts b/src/main/db/setting.ts
deleted file mode 100644
index 92405133..00000000
--- a/src/main/db/setting.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Database } from 'better-sqlite3'
-import { Setting } from '~/src/types/setting'
-import { DefaultSetting } from '~/src/constants/initializer/setting'
-
-export const getSetting = (db: Database, accountId: number): Promise => {
- return new Promise(resolve => {
- const row = db.prepare('SELECT * FROM settings WHERE account_id = ?').get(accountId)
- if (row) {
- return resolve({
- accountId: row.account_id,
- markerHome: Boolean(row.marker_home),
- markerNotifications: Boolean(row.marker_notifications)
- })
- }
- resolve(DefaultSetting)
- })
-}
-
-export const createOrUpdateSetting = (db: Database, setting: Setting): Promise => {
- return new Promise((resolve, reject) => {
- const row = db.prepare('SELECT * FROM settings WHERE account_id = ?').get(setting.accountId)
- if (row) {
- try {
- db.prepare('UPDATE settings SET marker_home = ?, marker_notifications = ? WHERE account_id = ?').run(
- setting.markerHome,
- setting.markerNotifications,
- setting.accountId
- )
- resolve(setting)
- } catch (err) {
- console.error(err)
- reject(err)
- }
- } else {
- try {
- db.prepare('INSERT INTO settings(account_id, marker_home, marker_notifications) VALUES (?, ?, ?)').run(
- setting.accountId,
- setting.markerHome,
- setting.markerNotifications
- )
- resolve(setting)
- } catch (err) {
- console.error(err)
- reject(err)
- }
- }
- })
-}
diff --git a/src/main/fonts.ts b/src/main/fonts.ts
deleted file mode 100644
index 345ca90b..00000000
--- a/src/main/fonts.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import SystemFonts from 'system-font-families'
-
-const fonts = async (): Promise> => {
- const systemFonts = new SystemFonts()
- return systemFonts.getFonts()
- .then((res: string) => {
- return Array.from(new Set(res)).sort()
- })
-}
-
-export default fonts
diff --git a/src/main/index.dev.ts b/src/main/index.dev.ts
deleted file mode 100644
index 22854cd2..00000000
--- a/src/main/index.dev.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * This file is used specifically and only for development. It installs
- * `electron-debug` & `vue-devtools`. There shouldn't be any need to
- * modify this file, but it can be used to extend your development
- * environment.
- */
-
-/* eslint-disable */
-
-import installExtension, { VUEJS3_DEVTOOLS } from 'electron-devtools-installer'
-
-// Install `electron-debug` with `devtron`
-require('electron-debug')({ showDevTools: true })
-
-// Install `vue-devtools`
-require('electron').app.on('ready', () => {
- installExtension(VUEJS3_DEVTOOLS)
- .then(name => console.log(`Added Extension: ${name}`))
- .catch(err => console.log('Unable to install `vue-devtools`: \n', err))
-})
-
-// Require `main` process to boot app
-require('./index')
diff --git a/src/main/index.ts b/src/main/index.ts
deleted file mode 100644
index f5d689ee..00000000
--- a/src/main/index.ts
+++ /dev/null
@@ -1,1477 +0,0 @@
-'use strict'
-
-import {
- app,
- ipcMain,
- shell,
- session,
- Menu,
- Tray,
- BrowserWindow,
- BrowserWindowConstructorOptions,
- MenuItemConstructorOptions,
- IpcMainEvent,
- nativeTheme,
- IpcMainInvokeEvent,
- Notification,
- NotificationConstructorOptions,
- clipboard
-} from 'electron'
-import fs from 'fs'
-import log from 'electron-log'
-import windowStateKeeper from 'electron-window-state'
-import simplayer from 'simplayer'
-import path from 'path'
-import ContextMenu from 'electron-context-menu'
-import { initSplashScreen, Config } from '@trodi/electron-splashscreen'
-import openAboutWindow from 'about-window'
-import generator, { detector, NotificationType, Entity } from 'megalodon'
-import AutoLaunch from 'auto-launch'
-import minimist from 'minimist'
-import sanitizeHtml from 'sanitize-html'
-
-// db
-import { backwardAccount, forwardAccount, getAccount, insertAccount, listAccounts, removeAccount, removeAllAccounts } from './db/account'
-import { insertTag, listTags, removeTag } from './db/hashtags'
-import { createOrUpdateSetting, getSetting } from './db/setting'
-import { getServer, insertServer } from './db/server'
-
-import { DirectStreaming, ListStreaming, LocalStreaming, PublicStreaming, StreamingURL, TagStreaming, UserStreaming } from './websocket'
-import Preferences from './preferences'
-import Fonts from './fonts'
-import i18next from '~/src/config/i18n'
-import { i18n as I18n } from 'i18next'
-import Language, { LanguageType } from '../constants/language'
-import { LocalAccount } from '~/src/types/localAccount'
-import { LocalTag } from '~/src/types/localTag'
-import { Proxy } from '~/src/types/proxy'
-import ProxyConfiguration from './proxy'
-import { Menu as MenuPreferences } from '~/src/types/preference'
-import { General as GeneralPreferences } from '~/src/types/preference'
-import newDB from './database'
-import { Setting } from '~/src/types/setting'
-import { LocalServer } from '~/src/types/localServer'
-import { Notify } from '~/src/types/notify'
-
-/**
- * Context menu
- */
-ContextMenu({
- showCopyImageAddress: true,
- showSaveImageAs: true
-})
-
-/**
- * Set log level
- */
-log.transports.console.level = 'debug'
-log.transports.file.level = 'info'
-
-declare namespace global {
- let __static: string
-}
-
-/**
- * Set `__static` path to static files in production
- * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
- */
-if (process.env.NODE_ENV !== 'development') {
- global.__static = path.join(__dirname, '/static').replace(/\\/g, '\\\\')
-}
-
-let mainWindow: BrowserWindow | null
-let tray: Tray | null
-const winURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080` : path.join('file://', __dirname, '/index.html')
-
-// MAS build is not allowed requestSingleInstanceLock.
-// ref: https://github.com/h3poteto/whalebird-desktop/issues/1030
-// ref: https://github.com/electron/electron-osx-sign/issues/137#issuecomment-307626305
-if (process.platform !== 'darwin') {
- // Enforces single instance for linux and windows.
- const gotTheLock = app.requestSingleInstanceLock()
-
- if (!gotTheLock) {
- app.quit()
- } else {
- app.on('second-instance', () => {
- // Someone tried to run a second instance, we should focus our window.
- if (mainWindow) {
- if (mainWindow.isMinimized()) mainWindow.restore()
- if (!mainWindow!.isVisible()) {
- mainWindow!.show()
- mainWindow!.setSkipTaskbar(false)
- }
- mainWindow.focus()
- }
- })
- }
-}
-
-const appId = 'social.whalebird.app'
-
-const splashURL =
- process.env.NODE_ENV === 'development'
- ? path.resolve(__dirname, '../../static/splash-screen.html')
- : path.join(__dirname, '/static/splash-screen.html')
-
-const userData = app.getPath('userData')
-const appPath = app.getPath('exe')
-const dbDir = path.join(userData, '/db')
-
-if (!fs.existsSync(dbDir) || !fs.lstatSync(dbDir).isDirectory()) {
- fs.mkdirSync(dbDir, { recursive: true })
-}
-
-const databasePath = path.join(dbDir, 'whalebird.db')
-const db = newDB(databasePath)
-
-const preferencesDBPath = path.join(dbDir, 'preferences.json')
-
-const soundBasePath =
- process.env.NODE_ENV === 'development' ? path.join(__dirname, '../../build/sounds/') : path.join(process.resourcesPath!, 'build/sounds/')
-const iconBasePath =
- process.env.NODE_ENV === 'development'
- ? path.resolve(__dirname, '../../build/icons/')
- : path.resolve(process.resourcesPath!, 'build/icons/')
-
-let launcher: AutoLaunch | null = null
-const proxyConfiguration = new ProxyConfiguration(preferencesDBPath)
-
-// On MAS build, auto launch is not working.
-// We have to use Launch Agent: https://github.com/Teamwork/node-auto-launch/issues/43
-// But it is too difficult to build, and Slack does not provide this function in MAS build.
-// Therefore I don't provide this function for MacOS.
-if (process.platform !== 'darwin') {
- launcher = new AutoLaunch({
- name: 'Whalebird',
- path: appPath
- })
-}
-
-async function changeAccount(account: LocalAccount, index: number) {
- // Sometimes application is closed to tray.
- // In this time, mainWindow in not exist, so we have to create window.
- if (mainWindow === null) {
- await createWindow()
- // We have to wait the web contents is loaded.
- mainWindow!.webContents.on('did-finish-load', () => {
- mainWindow!.webContents.send('change-account', Object.assign(account, { index: index }))
- })
- } else {
- mainWindow.show()
- mainWindow.webContents.send('change-account', Object.assign(account, { index: index }))
- }
-}
-
-async function getLanguage() {
- try {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.language.language
- } catch (err) {
- log.warn(err)
- return Language.en.key
- }
-}
-
-const getSpellChecker = async (): Promise => {
- try {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.language.spellchecker.enabled
- } catch (err) {
- return true
- }
-}
-
-const getMenuPreferences = async (): Promise => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.menu
-}
-
-const getGeneralPreferences = async (): Promise => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.general
-}
-
-/**
- * Set application menu
- * @return Whether the menu bar is auto hide.
- */
-const updateApplicationMenu = async (accountsChange: Array): Promise => {
- const menuPreferences = await getMenuPreferences()
- const menu = ApplicationMenu(accountsChange, menuPreferences, i18next)
- Menu.setApplicationMenu(menu)
- let autoHideMenuBar = false
- if (menuPreferences.autoHideMenu) {
- autoHideMenuBar = true
- }
- return autoHideMenuBar
-}
-
-/**
- * Set dock menu for mac
- */
-const updateDockMenu = async (accountsChange: Array) => {
- if (process.platform !== 'darwin') {
- return
- }
-
- const dockMenu = Menu.buildFromTemplate(accountsChange)
- app.dock.setMenu(dockMenu)
-}
-
-async function createWindow() {
- /**
- * List accounts
- */
- const accounts = await listAccounts(db)
- const accountsChange: Array = accounts.map(([a, s], index) => {
- return {
- label: s.domain,
- accelerator: `CmdOrCtrl+${index + 1}`,
- click: () => changeAccount(a, index)
- }
- })
-
- /**
- * Get language
- */
- const language = await getLanguage()
- i18next.changeLanguage(language)
-
- /**
- * Get spellcheck
- */
- const spellcheck = await getSpellChecker()
-
- /**
- * Get general preferences
- */
- const generalPreferences = await getGeneralPreferences()
-
- /**
- * Load system theme color for dark mode
- */
- nativeTheme.themeSource = 'system'
-
- /**
- * Set Application Menu
- */
- const autoHideMenuBar = await updateApplicationMenu(accountsChange)
-
- /**
- * Set dock menu for mac
- */
- await updateDockMenu(accountsChange)
-
- /**
- * Windows10 don't notify, so we have to set appId
- * https://github.com/electron/electron/issues/10864
- */
- app.setAppUserModelId(appId)
-
- /**
- * Enable accessibility
- */
- app.accessibilitySupportEnabled = true
-
- /**
- * Initial window options
- */
- const mainWindowState = windowStateKeeper({
- defaultWidth: 1000,
- defaultHeight: 563
- })
-
- const titleBarStyle = process.platform === 'linux' ? 'hidden' : 'default'
-
- const mainOpts: BrowserWindowConstructorOptions = {
- titleBarStyle: titleBarStyle,
- x: mainWindowState.x,
- y: mainWindowState.y,
- width: mainWindowState.width,
- height: mainWindowState.height,
- backgroundColor: '#fff',
- useContentSize: true,
- icon: path.join(iconBasePath, '256x256.png'),
- autoHideMenuBar: autoHideMenuBar,
- webPreferences: {
- nodeIntegration: false,
- contextIsolation: false,
- // To prevent CORS in renderer process.
- webSecurity: false,
- preload: path.resolve(__dirname, './preload.js'),
- spellcheck: spellcheck
- }
- }
- const config: Config = {
- windowOpts: mainOpts,
- templateUrl: splashURL,
- splashScreenOpts: {
- width: 425,
- height: 325
- }
- }
- mainWindow = initSplashScreen(config)
-
- mainWindowState.manage(mainWindow)
-
- /**
- * Get system proxy configuration.
- */
- if (session && session.defaultSession) {
- const proxyInfo = await session.defaultSession.resolveProxy('https://mastodon.social')
- proxyConfiguration.setSystemProxy(proxyInfo)
- log.info(`System proxy configuration: ${proxyInfo}`)
- }
-
- /**
- * Set proxy for BrowserWindow
- */
- const proxyConfig = await proxyConfiguration.forMastodon()
- if (proxyConfig) {
- await mainWindow.webContents.session.setProxy({ proxyRules: `${proxyConfig.protocol}://${proxyConfig.host}:${proxyConfig.port}` })
- }
- mainWindow.loadURL(winURL)
-
- mainWindow.webContents.on('will-navigate', event => event.preventDefault())
-
- // Show tray icon only linux and windows.
- if (process.platform !== 'darwin') {
- // Show tray icon
- tray = new Tray(path.join(iconBasePath, 'tray_icon.png'))
- const trayMenu = TrayMenu(accountsChange, i18next)
- tray.setContextMenu(trayMenu)
-
- // For Windows
- tray.setToolTip(i18next.t('main_menu.application.name'))
- tray.on('click', () => {
- if (mainWindow!.isVisible()) {
- mainWindow!.hide()
- mainWindow!.setSkipTaskbar(true)
- } else {
- mainWindow!.show()
- mainWindow!.setSkipTaskbar(false)
- }
- })
-
- // Minimize to tray
- mainWindow.on('close', event => {
- mainWindow!.hide()
- mainWindow!.setSkipTaskbar(true)
- event.preventDefault()
- })
-
- // Minimize to tray immediately if "hide on launch" selected
- // or if --hidden arg is passed
- if ((generalPreferences.other.hideOnLaunch || args.hidden) && !args.show) {
- mainWindow.once('show', () => {
- mainWindow?.hide()
- mainWindow?.setSkipTaskbar(true)
- })
- }
- } else {
- mainWindow.on('closed', () => {
- mainWindow = null
- })
- }
-}
-
-// Parse command line arguments and show help command.
-const args = minimist(process.argv.slice(process.env.NODE_ENV === 'development' ? 2 : 1))
-if (args.help) {
- console.log(`
-Whalebird is a Fediverse client for desktop.
-
-Usage
- $ whalebird
-
-Options
- --help show help
- --hidden start Whalebird hidden to tray
- --show start Whalebird with a window
-`)
- process.exit(0)
-}
-
-// Do not lower the rendering priority of Chromium when background
-app.commandLine.appendSwitch('disable-renderer-backgrounding')
-
-app.on('ready', async () => {
- createWindow()
- const accounts = await listAccounts(db)
- const preferences = new Preferences(preferencesDBPath)
- startUserStreamings(accounts, preferences)
- startDirectStreamings(accounts)
- startLocalStreamings(accounts)
- startPublicStreamings(accounts)
-})
-
-app.on('window-all-closed', () => {
- // this action is called when user click the close button.
- // In macOS, close button does not shutdown application. It is hide application window.
- if (process.platform !== 'darwin') {
- app.quit()
- } else {
- // In MacOS, we should change disable some menu items.
- const menu = Menu.getApplicationMenu()
- if (menu) {
- if (menu.items[0].submenu) {
- // Preferences
- menu.items[0].submenu.items[2].enabled = false
- }
- if (menu.items[3].submenu) {
- // Open Window
- menu.items[3].submenu.items[1].enabled = true
- // Jump to
- menu.items[3].submenu.items[4].enabled = false
- }
- }
- }
-})
-
-app.on('activate', () => {
- if (mainWindow === null) {
- createWindow()
- }
-})
-
-ipcMain.handle('add-server', async (_: IpcMainInvokeEvent, domain: string) => {
- const proxy = await proxyConfiguration.forMastodon()
- const sns = await detector(`https://${domain}`, proxy)
- if ((sns as string) === 'misskey') {
- return new Promise((_resolve, reject) => reject('misskey is not supported yet'))
- }
- const server = await insertServer(db, `https://${domain}`, domain, sns, null)
- return server
-})
-
-ipcMain.handle('add-app', async (_: IpcMainInvokeEvent, url: string) => {
- const proxy = await proxyConfiguration.forMastodon()
- const sns = await detector(url, proxy)
- const client = generator(sns, url, null, 'Whalebird', proxy)
- const appData = await client.registerApp('Whalebird', {
- website: 'https://whalebird.social'
- })
- if (appData.url) {
- shell.openExternal(appData.url)
- }
- return appData
-})
-
-type AuthorizeRequest = {
- serverID: number
- baseURL: string
- clientID: string
- clientSecret: string
- code: string
-}
-
-ipcMain.handle('authorize', async (_: IpcMainInvokeEvent, req: AuthorizeRequest) => {
- const proxy = await proxyConfiguration.forMastodon()
- const sns = await detector(req.baseURL, proxy)
- const client = generator(sns, req.baseURL, null, 'Whalebird', proxy)
- const tokenData = await client.fetchAccessToken(req.clientID, req.clientSecret, req.code, 'urn:ietf:wg:oauth:2.0:oob')
- let accessToken = tokenData.access_token
-
- const authorizedClient = generator(sns, req.baseURL, accessToken, 'Whalebird', proxy)
- const credentials = await authorizedClient.verifyAccountCredentials()
-
- const account = await insertAccount(
- db,
- credentials.data.username,
- credentials.data.id,
- credentials.data.avatar,
- req.clientID,
- req.clientSecret,
- accessToken,
- tokenData.refresh_token,
- req.serverID
- )
- const server = await getServer(db, req.serverID)
- const preferences = new Preferences(preferencesDBPath)
- startUserStreaming(account, server, preferences)
- startDirectStreaming(account, server)
- startLocalStreaming(account, server)
- startPublicStreaming(account, server)
-
- return account
-})
-
-ipcMain.handle('list-accounts', async (_: IpcMainInvokeEvent) => {
- const accounts = await listAccounts(db)
- return accounts
-})
-
-ipcMain.handle('get-local-account', async (_: IpcMainInvokeEvent, id: number) => {
- const account = await getAccount(db, id)
- return account
-})
-
-ipcMain.handle('remove-account', async (_: IpcMainInvokeEvent, id: number) => {
- userStreamings[id].stop()
- directStreamings[id].stop()
- localStreamings[id].stop()
- publicStreamings[id].stop()
- await removeAccount(db, id)
-
- const accounts = await listAccounts(db)
- const accountsChange: Array = accounts.map(([account, server], index) => {
- return {
- label: server.domain,
- accelerator: `CmdOrCtrl+${index + 1}`,
- click: () => changeAccount(account, index)
- }
- })
-
- await updateApplicationMenu(accountsChange)
- await updateDockMenu(accountsChange)
- if (process.platform !== 'darwin' && tray !== null) {
- tray.setContextMenu(TrayMenu(accountsChange, i18next))
- }
-})
-
-ipcMain.handle('forward-account', async (_: IpcMainInvokeEvent, id: number) => {
- await forwardAccount(db, id)
-})
-
-ipcMain.handle('backward-account', async (_: IpcMainInvokeEvent, id: number) => {
- await backwardAccount(db, id)
-})
-
-ipcMain.handle('remove-all-accounts', async (_: IpcMainInvokeEvent) => {
- stopAllStreamings()
- await removeAllAccounts(db)
- const accounts = await listAccounts(db)
- const accountsChange: Array = accounts.map(([account, server], index) => {
- return {
- label: server.domain,
- accelerator: `CmdOrCtrl+${index + 1}`,
- click: () => changeAccount(account, index)
- }
- })
-
- await updateApplicationMenu(accountsChange)
- await updateDockMenu(accountsChange)
- if (process.platform !== 'darwin' && tray !== null) {
- tray.setContextMenu(TrayMenu(accountsChange, i18next))
- }
-})
-
-ipcMain.handle('change-auto-launch', async (_: IpcMainInvokeEvent, enable: boolean) => {
- if (launcher) {
- const enabled = await launcher.isEnabled()
- if (!enabled && enable && launcher) {
- launcher.enable()
- } else if (enabled && !enable && launcher) {
- launcher.disable()
- }
- return enable
- } else {
- return false
- }
-})
-
-// badge
-ipcMain.on('reset-badge', () => {
- if (process.platform === 'darwin') {
- app.dock.setBadge('')
- }
-})
-
-// sounds
-ipcMain.on('fav-rt-action-sound', () => {
- const preferences = new Preferences(preferencesDBPath)
- preferences
- .load()
- .then(conf => {
- if (conf.general.sound.fav_rb) {
- const sound = path.join(soundBasePath, 'operation_sound01.wav')
- simplayer(sound, (err: Error) => {
- if (err) log.error(err)
- })
- }
- })
- .catch(err => log.error(err))
-})
-
-ipcMain.on('toot-action-sound', () => {
- const preferences = new Preferences(preferencesDBPath)
- preferences
- .load()
- .then(conf => {
- if (conf.general.sound.toot) {
- const sound = path.join(soundBasePath, 'operation_sound02.wav')
- simplayer(sound, (err: Error) => {
- if (err) log.error(err)
- })
- }
- })
- .catch(err => log.error(err))
-})
-
-// preferences
-ipcMain.handle('get-preferences', async (_: IpcMainInvokeEvent) => {
- const preferences = new Preferences(preferencesDBPath)
- let enabled = false
- if (launcher) {
- enabled = await launcher.isEnabled()
- }
- await preferences
- .update({
- general: {
- other: {
- launch: enabled
- }
- }
- })
- .catch(err => console.error(err))
- const conf = await preferences.load()
- return conf
-})
-
-ipcMain.handle('update-preferences', async (_: IpcMainInvokeEvent, data: any) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.update(data)
- return conf
-})
-
-ipcMain.handle('reset-preferences', async (_: IpcMainInvokeEvent) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.reset()
- return conf
-})
-
-ipcMain.handle('system-use-dark-theme', async (_: IpcMainInvokeEvent) => {
- return nativeTheme.shouldUseDarkColors
-})
-
-ipcMain.on('change-collapse', (_event: IpcMainEvent, value: boolean) => {
- const preferences = new Preferences(preferencesDBPath)
- preferences
- .update({
- state: {
- collapse: value
- }
- })
- .catch(err => {
- log.error(err)
- })
-})
-
-ipcMain.handle('get-collapse', async (_: IpcMainInvokeEvent) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.state.collapse
-})
-
-ipcMain.handle('change-global-header', async (_: IpcMainInvokeEvent, value: boolean) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.update({
- state: {
- hideGlobalHeader: value
- }
- })
- return conf
-})
-
-ipcMain.handle('get-global-header', async (_: IpcMainInvokeEvent) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.load()
- return conf.state.hideGlobalHeader
-})
-
-// proxy
-ipcMain.handle('update-proxy-config', async (_event: IpcMainInvokeEvent, proxy: Proxy) => {
- const preferences = new Preferences(preferencesDBPath)
- try {
- const conf = await preferences.update({
- proxy: proxy
- })
- const proxyConfig = await proxyConfiguration.forMastodon()
- if (proxyConfig) {
- await mainWindow?.webContents.session.setProxy({ proxyRules: `${proxyConfig.protocol}://${proxyConfig.host}:${proxyConfig.port}` })
- } else {
- await mainWindow?.webContents.session.setProxy({})
- }
- return conf
- } catch (err) {
- log.error(err)
- }
- return null
-})
-
-// language
-ipcMain.handle('change-language', async (_: IpcMainInvokeEvent, value: string) => {
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.update({
- language: {
- language: value
- }
- })
- i18next.changeLanguage(conf.language.language)
-
- const accounts = await listAccounts(db)
- const accountsChange: Array = accounts.map(([a, s], index) => {
- return {
- label: s.domain,
- accelerator: `CmdOrCtrl+${index + 1}`,
- click: () => changeAccount(a, index)
- }
- })
-
- await updateApplicationMenu(accountsChange)
- await updateDockMenu(accountsChange)
- if (process.platform !== 'darwin' && tray !== null) {
- tray.setContextMenu(TrayMenu(accountsChange, i18next))
- }
- return conf.language.language
-})
-
-ipcMain.handle('toggle-spellchecker', async (_: IpcMainInvokeEvent, value: boolean) => {
- mainWindow?.webContents.session.setSpellCheckerEnabled(value)
-
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.update({
- language: {
- spellchecker: {
- enabled: value
- }
- }
- })
- return conf.language.spellchecker.enabled
-})
-
-ipcMain.handle('update-spellchecker-languages', async (_: IpcMainInvokeEvent, languages: Array) => {
- const decoded: Array = languages.map(l => {
- const d = decodeLanguage(l)
- return d.rfc4646
- })
- mainWindow?.webContents.session.setSpellCheckerLanguages(decoded)
-
- const preferences = new Preferences(preferencesDBPath)
- const conf = await preferences.update({
- language: {
- spellchecker: {
- languages: languages
- }
- }
- })
- return conf.language.spellchecker.languages
-})
-
-// hashtag
-ipcMain.handle('save-hashtag', async (_: IpcMainInvokeEvent, req: { accountId: number; tag: string }) => {
- await insertTag(db, req.accountId, req.tag)
-})
-
-ipcMain.handle('list-hashtags', async (_: IpcMainInvokeEvent, accountId: number) => {
- const tags = await listTags(db, accountId)
- return tags
-})
-
-ipcMain.handle('remove-hashtag', async (_: IpcMainInvokeEvent, tag: LocalTag) => {
- await removeTag(db, tag)
-})
-
-// Fonts
-ipcMain.handle('list-fonts', async (_: IpcMainInvokeEvent) => {
- const list = await Fonts()
- return list
-})
-
-// Settings
-ipcMain.handle(
- 'get-account-setting',
- async (_: IpcMainInvokeEvent, accountId: number): Promise => {
- const setting = await getSetting(db, accountId)
- return setting
- }
-)
-
-ipcMain.handle(
- 'update-account-setting',
- async (_: IpcMainInvokeEvent, setting: Setting): Promise => {
- console.log(setting)
- const res = await createOrUpdateSetting(db, setting)
- return res
- }
-)
-
-// Cache
-ipcMain.handle('get-cache-hashtags', async (_: IpcMainInvokeEvent) => {
- // TODO:
- return []
-})
-
-ipcMain.handle('insert-cache-hashtags', async (_: IpcMainInvokeEvent) => {
- return null
-})
-
-ipcMain.handle('get-cache-accounts', async (_: IpcMainInvokeEvent) => {
- return []
-})
-
-ipcMain.handle('insert-cache-accounts', async (_: IpcMainInvokeEvent) => {
- return []
-})
-
-// Application control
-ipcMain.on('relaunch', () => {
- app.relaunch()
- app.exit()
-})
-
-/**
- * Auto Updater
- *
- * Uncomment the following code below and install `electron-updater` to
- * support auto updating. Code Signing with a valid certificate is required.
- * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating
- */
-
-/*
-import { autoUpdater } from 'electron-updater'
-
-autoUpdater.on('update-downloaded', () => {
- autoUpdater.quitAndInstall()
-})
-
-app.on('ready', () => {
- if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates()
-})
- */
-
-/**
- * Generate application menu
- */
-const ApplicationMenu = (accountsChange: Array, menu: MenuPreferences, i18n: I18n): Menu => {
- /**
- * For mac menu
- */
- const macGeneralMenu: Array =
- process.platform !== 'darwin'
- ? []
- : [
- {
- type: 'separator'
- },
- {
- label: i18n.t('main_menu.application.services'),
- role: 'services'
- },
- {
- type: 'separator'
- },
- {
- label: i18n.t('main_menu.application.hide'),
- role: 'hide'
- },
- {
- label: i18n.t('main_menu.application.hide_others'),
- role: 'hideOthers'
- },
- {
- label: i18n.t('main_menu.application.show_all'),
- role: 'unhide'
- }
- ]
-
- const macWindowMenu: Array =
- process.platform === 'darwin'
- ? []
- : [
- {
- label: i18n.t('main_menu.window.always_show_menu_bar'),
- type: 'checkbox',
- checked: !menu.autoHideMenu,
- click: item => {
- changeMenuAutoHide(!item.checked)
- }
- },
- {
- type: 'separator'
- }
- ]
-
- const applicationQuitMenu: Array =
- process.platform === 'darwin'
- ? [
- {
- label: i18n.t('main_menu.application.quit'),
- accelerator: 'CmdOrCtrl+Q',
- role: 'quit'
- }
- ]
- : [
- {
- label: i18n.t('main_menu.application.quit'),
- accelerator: 'CmdOrCtrl+Q',
- click: () => {
- mainWindow!.destroy()
- }
- }
- ]
-
- const template: Array = [
- {
- label: i18n.t('main_menu.application.name'),
- submenu: [
- {
- label: i18n.t('main_menu.application.about'),
- role: 'about',
- click: () => {
- openAboutWindow({
- icon_path: path.join(iconBasePath, '256x256.png'),
- copyright: 'Copyright (c) 2021 AkiraFukushima',
- package_json_dir: path.resolve(__dirname, '../../'),
- open_devtools: process.env.NODE_ENV !== 'production'
- })
- }
- },
- {
- type: 'separator'
- },
- {
- label: i18n.t('main_menu.application.preferences'),
- accelerator: 'CmdOrCtrl+,',
- click: () => {
- mainWindow!.webContents.send('open-preferences')
- }
- },
- ...macGeneralMenu,
- {
- type: 'separator'
- },
- ...applicationQuitMenu
- ]
- },
- {
- label: i18n.t('main_menu.edit.name'),
- submenu: [
- {
- label: i18n.t('main_menu.edit.undo'),
- accelerator: 'CmdOrCtrl+Z',
- role: 'undo'
- },
- {
- label: i18n.t('main_menu.edit.redo'),
- accelerator: 'Shift+CmdOrCtrl+Z',
- role: 'redo'
- },
- {
- type: 'separator'
- },
- {
- label: i18n.t('main_menu.edit.cut'),
- accelerator: 'CmdOrCtrl+X',
- role: 'cut'
- },
- {
- label: i18n.t('main_menu.edit.copy'),
- accelerator: 'CmdOrCtrl+C',
- role: 'copy'
- },
- {
- label: i18n.t('main_menu.edit.paste'),
- accelerator: 'CmdOrCtrl+V',
- role: 'paste'
- },
- {
- label: i18n.t('main_menu.edit.select_all'),
- accelerator: 'CmdOrCtrl+A',
- role: 'selectall'
- }
- ] as Array
- },
- {
- label: i18n.t('main_menu.view.name'),
- submenu: [
- {
- label: i18n.t('main_menu.view.toggle_full_screen'),
- role: 'togglefullscreen'
- }
- ]
- },
- {
- label: i18n.t('main_menu.window.name'),
- submenu: [
- ...macWindowMenu,
- {
- label: i18n.t('main_menu.window.close'),
- role: 'close'
- },
- {
- label: i18n.t('main_menu.window.open'),
- enabled: false,
- click: () => {
- reopenWindow()
- }
- },
- {
- label: i18n.t('main_menu.window.minimize'),
- role: 'minimize'
- },
- {
- type: 'separator'
- },
- {
- label: i18n.t('main_menu.window.jump_to'),
- accelerator: 'CmdOrCtrl+K',
- enabled: true,
- click: () => {
- mainWindow!.webContents.send('CmdOrCtrl+K')
- }
- },
- {
- type: 'separator'
- },
- ...accountsChange
- ]
- },
- {
- label: i18n.t('main_menu.help.name'),
- role: 'help',
- submenu: [
- {
- label: i18n.t('main_menu.application.shortcuts'),
- click: () => {
- mainWindow!.webContents.send('open-shortcuts-list')
- }
- },
- {
- label: i18n.t('main_menu.help.thirdparty'),
- click: () => {
- mainWindow?.webContents.send('open-thirdparty-modal')
- }
- }
- ]
- }
- ]
-
- return Menu.buildFromTemplate(template)
-}
-
-const TrayMenu = (accountsChange: Array, i18n: I18n): Menu => {
- const template: Array = [
- ...accountsChange,
- {
- label: i18n.t('main_menu.application.open'),
- click: async () => {
- if (mainWindow) {
- mainWindow.show()
- } else {
- await createWindow()
- }
- }
- },
- {
- label: i18n.t('main_menu.application.quit'),
- click: () => {
- stopAllStreamings()
- mainWindow!.destroy()
- }
- }
- ]
- const menu: Menu = Menu.buildFromTemplate(template)
- return menu
-}
-
-const changeMenuAutoHide = async (autoHide: boolean) => {
- if (mainWindow === null) {
- return null
- }
- mainWindow.autoHideMenuBar = autoHide
- mainWindow.setMenuBarVisibility(!autoHide)
- const preferences = new Preferences(preferencesDBPath)
- preferences.update({
- menu: {
- autoHideMenu: autoHide
- }
- })
- return null
-}
-
-async function reopenWindow() {
- if (mainWindow === null) {
- await createWindow()
- return null
- } else {
- return null
- }
-}
-
-const decodeLanguage = (lang: string): LanguageType => {
- const l = Object.keys(Language).find(k => Language[k].key === lang)
- if (l === undefined) {
- return Language.en
- } else {
- return Language[l]
- }
-}
-
-//----------------------------------------------
-// Streamings
-//----------------------------------------------
-const userStreamings: { [key: number]: UserStreaming } = {}
-const directStreamings: { [key: number]: DirectStreaming } = {}
-const localStreamings: { [key: number]: DirectStreaming } = {}
-const publicStreamings: { [key: number]: DirectStreaming } = {}
-
-const startUserStreaming = async (account: LocalAccount, server: LocalServer, preferences: Preferences) => {
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- userStreamings[account.id] = new UserStreaming(server.sns, account, url, proxy)
- userStreamings[account.id].start(
- async (update: Entity.Status) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`update-user-streamings-${account.id}`, update)
- }
- },
- async (notification: Entity.Notification) => {
- await publishNotification(notification, account.id, preferences)
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`notification-user-streamings-${account.id}`, notification)
- }
- },
- (statusId: string) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`delete-user-streamings-${account.id}`, statusId)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
-}
-
-const startDirectStreaming = async (account: LocalAccount, server: LocalServer) => {
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- directStreamings[account.id] = new DirectStreaming(server.sns, account, url, proxy)
- directStreamings[account.id].start(
- (update: Entity.Status) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`update-direct-streamings-${account.id}`, update)
- }
- },
- (id: string) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`delete-direct-streamings-${account.id}`, id)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
-}
-
-const startLocalStreaming = async (account: LocalAccount, server: LocalServer) => {
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- localStreamings[account.id] = new LocalStreaming(server.sns, account, url, proxy)
- localStreamings[account.id].start(
- (update: Entity.Status) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`update-local-streamings-${account.id}`, update)
- }
- },
- (id: string) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`delete-local-streamings-${account.id}`, id)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
-}
-
-const startPublicStreaming = async (account: LocalAccount, server: LocalServer) => {
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- publicStreamings[account.id] = new PublicStreaming(server.sns, account, url, proxy)
- publicStreamings[account.id].start(
- (update: Entity.Status) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`update-public-streamings-${account.id}`, update)
- }
- },
- (id: string) => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send(`delete-public-streamings-${account.id}`, id)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
-}
-
-const stopAllStreamings = () => {
- Object.keys(userStreamings).forEach((key: string) => {
- userStreamings[parseInt(key)].stop()
- })
- Object.keys(directStreamings).forEach((key: string) => {
- directStreamings[parseInt(key)].stop()
- })
- Object.keys(localStreamings).forEach((key: string) => [localStreamings[parseInt(key)].stop()])
- Object.keys(publicStreamings).forEach((key: string) => {
- publicStreamings[parseInt(key)].stop()
- })
-}
-
-const startUserStreamings = async (accounts: Array<[LocalAccount, LocalServer]>, preferences: Preferences) => {
- accounts.forEach(async ([account, server]) => {
- await startUserStreaming(account, server, preferences)
- })
-
- return userStreamings
-}
-
-const startDirectStreamings = async (accounts: Array<[LocalAccount, LocalServer]>) => {
- accounts.forEach(async ([account, server]) => {
- await startDirectStreaming(account, server)
- })
-}
-
-const startLocalStreamings = async (accounts: Array<[LocalAccount, LocalServer]>) => {
- accounts.forEach(async ([account, server]) => {
- await startLocalStreaming(account, server)
- })
-}
-
-const startPublicStreamings = async (accounts: Array<[LocalAccount, LocalServer]>) => {
- accounts.forEach(async ([account, server]) => {
- await startPublicStreaming(account, server)
- })
-}
-
-const publishNotification = async (notification: Entity.Notification, accountId: number, preferences: Preferences) => {
- const conf = await preferences.load()
- const options = createNotification(notification, conf.notification.notify)
- if (options !== null) {
- const notify = new Notification(options)
- notify.on('click', _ => {
- if (!mainWindow?.webContents.isDestroyed()) {
- mainWindow?.webContents.send('open-notification-tab', accountId)
- }
- })
- notify.show()
- }
- if (process.platform === 'darwin') {
- app.dock.setBadge('•')
- }
-}
-
-const createNotification = (notification: Entity.Notification, notifyConfig: Notify): NotificationConstructorOptions | null => {
- if (!notification.account) return null
- switch (notification.type) {
- case NotificationType.Favourite:
- if (notifyConfig.favourite) {
- return {
- title: i18next.t('notification.favourite.title'),
- body: i18next.t('notification.favourite.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.Follow:
- if (notifyConfig.follow) {
- return {
- title: i18next.t('notification.follow.title'),
- body: i18next.t('notification.follow.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.FollowRequest:
- if (notifyConfig.follow_request) {
- return {
- title: i18next.t('notification.follow_request.title'),
- body: i18next.t('notification.follow_request.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.Mention:
- if (notifyConfig.reply) {
- return {
- title: `${username(notification.status!.account)}`,
- body: sanitizeHtml(notification.status!.content, {
- allowedTags: [],
- allowedAttributes: []
- }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.Reblog:
- if (notifyConfig.reblog) {
- if (notification.status && notification.status.quote) {
- return {
- title: i18next.t('notification.quote.title'),
- body: i18next.t('notification.quote.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- } else {
- return {
- title: i18next.t('notification.reblog.title'),
- body: i18next.t('notification.reblog.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- }
- break
- case NotificationType.EmojiReaction:
- if (notifyConfig.reaction) {
- return {
- title: i18next.t('notification.reaction.title'),
- body: i18next.t('notification.reaction.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.Status:
- if (notifyConfig.status) {
- return {
- title: i18next.t('notification.status.title'),
- body: i18next.t('notification.status.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.PollVote:
- if (notifyConfig.poll_vote) {
- return {
- title: i18next.t('notification.poll_vote.title'),
- body: i18next.t('notification.poll_vote.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- case NotificationType.PollExpired:
- if (notifyConfig.poll_expired) {
- return {
- title: i18next.t('notification.poll_expired.title'),
- body: i18next.t('notification.poll_expired.body', { username: username(notification.account) }),
- silent: false
- } as NotificationConstructorOptions
- }
- break
- default:
- break
- }
- return null
-}
-
-const username = (account: Entity.Account): string => {
- if (account.display_name !== '') {
- return account.display_name
- } else {
- return account.username
- }
-}
-
-//----------------------------------------
-// List streamings
-//----------------------------------------
-const listStreamings: { [key: number]: ListStreaming } = {}
-
-type ListStreamingOpts = {
- listId: string
- accountId: number
-}
-
-ipcMain.on('start-list-streaming', async (event: IpcMainEvent, obj: ListStreamingOpts) => {
- const { listId, accountId } = obj
- try {
- const [account, server] = await getAccount(db, accountId)
-
- // Stop old list streaming
- if (listStreamings[accountId] !== undefined) {
- listStreamings[accountId].stop()
- }
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- listStreamings[accountId] = new ListStreaming(server.sns, account, url, proxy)
- listStreamings[accountId].start(
- listId,
- (update: Entity.Status) => {
- if (!event.sender.isDestroyed()) {
- event.sender.send(`update-list-streamings-${accountId}`, update)
- }
- },
- (id: string) => {
- if (!event.sender.isDestroyed()) {
- event.sender.send(`delete-list-streamings-${accountId}`, id)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
- } catch (err) {
- log.error(err)
- }
-})
-
-//----------------------------------------
-// Tag streamings
-//----------------------------------------
-const tagStreamings: { [key: number]: TagStreaming } = {}
-
-type TagStreamingOpts = {
- tag: string
- accountId: number
-}
-
-ipcMain.on('start-tag-streaming', async (event: IpcMainEvent, obj: TagStreamingOpts) => {
- const { tag, accountId } = obj
- try {
- const [account, server] = await getAccount(db, accountId)
-
- // Stop old tag streaming
- if (tagStreamings[accountId] !== undefined) {
- tagStreamings[accountId].stop()
- }
- const proxy = await proxyConfiguration.forMastodon()
- if (server.sns === 'friendica') return
- const url = await StreamingURL(server.sns, account, server, proxy)
- tagStreamings[accountId] = new TagStreaming(server.sns, account, url, proxy)
- tagStreamings[accountId].start(
- tag,
- (update: Entity.Status) => {
- if (!event.sender.isDestroyed()) {
- event.sender.send(`update-tag-streamings-${accountId}`, update)
- }
- },
- (id: string) => {
- if (!event.sender.isDestroyed()) {
- event.sender.send(`delete-tag-streamings-${accountId}`, id)
- }
- },
- (err: Error) => {
- log.error(err)
- }
- )
- } catch (err) {
- log.error(err)
- }
-})
-
-ipcMain.handle('open-browser', async (_: IpcMainInvokeEvent, url: string) => {
- shell.openExternal(url)
-})
-
-ipcMain.handle('copy-text', async (_: IpcMainInvokeEvent, text: string) => {
- clipboard.writeText(text)
-})
diff --git a/src/main/preferences.ts b/src/main/preferences.ts
deleted file mode 100644
index 51f25cd0..00000000
--- a/src/main/preferences.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import storage from 'electron-json-storage'
-import log from 'electron-log'
-import objectAssignDeep from 'object-assign-deep'
-import { BaseConfig } from '~/src/types/preference'
-import { Base } from '~/src/constants/initializer/preferences'
-
-export default class Preferences {
- private path: string
-
- constructor(path: string) {
- this.path = path
- }
-
- public async load(): Promise {
- try {
- const preferences = await this._get()
- return objectAssignDeep({}, Base, preferences)
- } catch (err) {
- log.error(err)
- return Base
- }
- }
-
- private _get(): Promise {
- return new Promise((resolve, reject) => {
- storage.get(this.path, (err, data) => {
- if (err) return reject(err)
- return resolve(data as BaseConfig)
- })
- })
- }
-
- private _save(data: BaseConfig): Promise {
- return new Promise((resolve, reject) => {
- storage.set(this.path, data, err => {
- if (err) return reject(err)
- return resolve(data)
- })
- })
- }
-
- public async update(obj: any): Promise {
- const current = await this.load()
- const data = objectAssignDeep({}, current, obj)
- const result = await this._save(data)
- return result
- }
-
- public async reset(): Promise {
- return this.update(Base)
- }
-}
diff --git a/src/main/preload.js b/src/main/preload.js
deleted file mode 100644
index be32130b..00000000
--- a/src/main/preload.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const electron = require('electron')
-
-global.ipcRenderer = electron.ipcRenderer
-global.node_env = process.env.NODE_ENV
-global.platform = process.platform
diff --git a/src/main/proxy.ts b/src/main/proxy.ts
deleted file mode 100644
index 76bd102e..00000000
--- a/src/main/proxy.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { ProxyConfig } from 'megalodon'
-import { ProxySource, ManualProxy, ProxyProtocol } from '~/src/types/proxy'
-import Preferences from './preferences'
-
-export default class ProxyConfiguration {
- public preferences: Preferences
- public systemProxy: string | null = null
-
- constructor(preferencesDBPath: string) {
- this.preferences = new Preferences(preferencesDBPath)
- }
-
- public setSystemProxy(proxy: string) {
- this.systemProxy = proxy
- }
-
- public async forMastodon(): Promise {
- const proxy = await this.getConfig()
- if (!proxy) {
- return false
- } else {
- let protocol = ProxyProtocol.http
- if (proxy.protocol !== '') {
- protocol = proxy.protocol
- }
- if (proxy.username.length > 0) {
- return {
- host: proxy.host,
- port: parseInt(proxy.port, 10),
- protocol: protocol,
- auth: {
- username: proxy.username,
- password: proxy.password
- }
- }
- } else {
- return {
- host: proxy.host,
- port: parseInt(proxy.port, 10),
- protocol: protocol
- }
- }
- }
- }
-
- public async getConfig(): Promise {
- const conf = await this.preferences.load()
- const source = conf.proxy.source as ProxySource
- switch (source) {
- case ProxySource.no:
- return false
- case ProxySource.system:
- if (this.systemProxy) {
- return this.parseSystemProxy()
- } else {
- return false
- }
- case ProxySource.manual:
- return conf.proxy.manualProxyConfig
- }
- }
-
- public parseSystemProxy(): ManualProxy | false {
- if (!this.systemProxy) {
- return false
- }
- if (this.systemProxy === 'DIRECT') {
- return false
- }
- const result = this.systemProxy.match(/^([A-Z0-9]+)\s+([a-z0-9-_.]+):([0-9]+)$/)
- if (!result || result.length !== 4) {
- return false
- }
- let protocol = ProxyProtocol.http
- switch (result[1]) {
- case 'PROXY':
- protocol = ProxyProtocol.http
- break
- case 'SOCKS4':
- protocol = ProxyProtocol.socks4
- break
- case 'SOCKS4A':
- protocol = ProxyProtocol.socks4a
- break
- case 'SOCKS5':
- protocol = ProxyProtocol.socks5
- break
- case 'SOCKS5H':
- protocol = ProxyProtocol.socks5h
- break
- case 'SOCKS':
- protocol = ProxyProtocol.socks5
- break
- }
- const manual: ManualProxy = {
- protocol: protocol,
- host: result[2],
- port: result[3],
- username: '',
- password: ''
- }
- return manual
- }
-}
diff --git a/src/main/websocket.ts b/src/main/websocket.ts
deleted file mode 100644
index fb221e20..00000000
--- a/src/main/websocket.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import generator, { MegalodonInterface, WebSocketInterface, Entity, ProxyConfig } from 'megalodon'
-import log from 'electron-log'
-import { LocalAccount } from '~/src/types/localAccount'
-import { LocalServer } from '~src/types/localServer'
-
-const StreamingURL = async (
- sns: 'mastodon' | 'pleroma' | 'firefish',
- account: LocalAccount,
- server: LocalServer,
- proxy: ProxyConfig | false
-): Promise => {
- if (!account.accessToken) {
- throw new Error('access token is empty')
- }
- const client = generator(sns, server.baseURL, account.accessToken, 'Whalebird', proxy)
- const res = await client.getInstance()
- if (res.data.urls) {
- return res.data.urls.streaming_api
- }
- return new Promise((_resolve, reject) => reject('streaming URL does not exist'))
-}
-
-export { StreamingURL }
-
-class WebSocket {
- public client: MegalodonInterface
- public listener: WebSocketInterface | null
-
- constructor(sns: 'mastodon' | 'pleroma' | 'firefish', account: LocalAccount, streamingURL: string, proxy: ProxyConfig | false) {
- const url = streamingURL.replace(/^https:\/\//, 'wss://')
- this.client = generator(sns, url, account.accessToken, 'Whalebird', proxy)
- this.listener = null
- }
-
- public bindListener(updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- if (!this.listener) {
- log.error('listener does not exist')
- return
- }
-
- this.listener.on('update', (status: Entity.Status) => {
- updateCallback(status)
- })
-
- this.listener.on('delete', (id: string) => {
- deleteCallback(id)
- })
-
- this.listener.on('error', (err: Error) => {
- errCallback(err)
- })
-
- this.listener.on('parser-error', (err: Error) => {
- errCallback(err)
- })
- }
-
- public stop() {
- if (this.listener) {
- this.listener.removeAllListeners('connect')
- this.listener.removeAllListeners('update')
- this.listener.removeAllListeners('notification')
- this.listener.removeAllListeners('error')
- this.listener.removeAllListeners('parser-error')
- this.listener.on('error', (e: Error) => {
- log.error(e)
- })
- this.listener.on('parser-error', (e: Error) => {
- log.error(e)
- })
- this.listener.stop()
- log.info('streaming stopped')
- }
- }
-}
-
-export class UserStreaming extends WebSocket {
- public start(updateCallback: Function, notificationCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.userSocket()
-
- this.listener.on('connect', _ => {
- log.info('user streaming is started')
- })
-
- this.listener.on('notification', (notification: Entity.Notification) => {
- notificationCallback(notification)
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
-
-export class DirectStreaming extends WebSocket {
- public start(updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.directSocket()
-
- this.listener.on('connect', _ => {
- log.info('direct streaming is started')
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
-
-export class LocalStreaming extends WebSocket {
- public start(updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.localSocket()
-
- this.listener.on('connect', _ => {
- log.info('local streaming is started')
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
-
-export class PublicStreaming extends WebSocket {
- public start(updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.publicSocket()
-
- this.listener.on('connect', _ => {
- log.info('public streaming is started')
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
-
-export class ListStreaming extends WebSocket {
- public start(listID: string, updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.listSocket(listID)
-
- this.listener.on('connect', _ => {
- log.info('list streaming is started')
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
-
-export class TagStreaming extends WebSocket {
- public start(tag: string, updateCallback: Function, deleteCallback: Function, errCallback: Function) {
- this.listener = this.client.tagSocket(tag)
-
- this.listener.on('connect', _ => {
- log.info('tag streaming is started')
- })
-
- this.bindListener(updateCallback, deleteCallback, errCallback)
- }
-}
diff --git a/src/renderer/App.vue b/src/renderer/App.vue
deleted file mode 100644
index 03c17239..00000000
--- a/src/renderer/App.vue
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/assets/.gitkeep b/src/renderer/assets/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/renderer/assets/fonts/NotoSans-Bold.ttf b/src/renderer/assets/fonts/NotoSans-Bold.ttf
deleted file mode 100644
index ab11d316..00000000
Binary files a/src/renderer/assets/fonts/NotoSans-Bold.ttf and /dev/null differ
diff --git a/src/renderer/assets/fonts/NotoSans-BoldItalic.ttf b/src/renderer/assets/fonts/NotoSans-BoldItalic.ttf
deleted file mode 100644
index 6dfd1e61..00000000
Binary files a/src/renderer/assets/fonts/NotoSans-BoldItalic.ttf and /dev/null differ
diff --git a/src/renderer/assets/fonts/NotoSans-Italic.ttf b/src/renderer/assets/fonts/NotoSans-Italic.ttf
deleted file mode 100644
index 1639ad7d..00000000
Binary files a/src/renderer/assets/fonts/NotoSans-Italic.ttf and /dev/null differ
diff --git a/src/renderer/assets/fonts/NotoSans-Regular.ttf b/src/renderer/assets/fonts/NotoSans-Regular.ttf
deleted file mode 100644
index a1b8994e..00000000
Binary files a/src/renderer/assets/fonts/NotoSans-Regular.ttf and /dev/null differ
diff --git a/src/renderer/assets/fonts/fonts.css b/src/renderer/assets/fonts/fonts.css
deleted file mode 100644
index 911afa79..00000000
--- a/src/renderer/assets/fonts/fonts.css
+++ /dev/null
@@ -1,11 +0,0 @@
-/* === Noto Sans - regular */
-@font-face {
- font-family: 'Noto Sans';
- font-style: normal;
- font-weight: 400;
- src: url("./NotoSans-Regular.ttf");
- src: local("Noto Sans Regular"),
- local("NotoSans-Regular"),
- url("./NotoSans-Regular.ttf") format("truetype");
-}
-
diff --git a/src/renderer/assets/images/loading-spinner-wide.svg b/src/renderer/assets/images/loading-spinner-wide.svg
deleted file mode 100644
index 76847aa2..00000000
--- a/src/renderer/assets/images/loading-spinner-wide.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/renderer/assets/images/loading-spinner.svg b/src/renderer/assets/images/loading-spinner.svg
deleted file mode 100644
index a6673a1b..00000000
--- a/src/renderer/assets/images/loading-spinner.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/renderer/assets/logo.png b/src/renderer/assets/logo.png
deleted file mode 100644
index 63736e2c..00000000
Binary files a/src/renderer/assets/logo.png and /dev/null differ
diff --git a/src/renderer/assets/timeline-transition.scss b/src/renderer/assets/timeline-transition.scss
deleted file mode 100644
index 7561966a..00000000
--- a/src/renderer/assets/timeline-transition.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.timeline-enter-active, .timeline-leave-active {
- transition: all 0.1s;
-}
-.timeline-enter, .timeline-leave-to {
- opacity: 0;
-}
-.timeline-move {
- transition: transform 0.1s;
-}
diff --git a/src/renderer/components/GlobalHeader.vue b/src/renderer/components/GlobalHeader.vue
deleted file mode 100644
index 6cd7e6f4..00000000
--- a/src/renderer/components/GlobalHeader.vue
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Login.vue b/src/renderer/components/Login.vue
deleted file mode 100644
index 2856ce46..00000000
--- a/src/renderer/components/Login.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Login/Authorize.vue b/src/renderer/components/Login/Authorize.vue
deleted file mode 100644
index 98c642b0..00000000
--- a/src/renderer/components/Login/Authorize.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
{{ $t('authorize.manually_1') }}
-
{{ $t('authorize.manually_2') }}
-
{{ $route.query.url }}
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('authorize.submit') }}
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Login/LoginForm.vue b/src/renderer/components/Login/LoginForm.vue
deleted file mode 100644
index abfd2fb1..00000000
--- a/src/renderer/components/Login/LoginForm.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-
-
-
-
-
-
- {{ $t('login.proxy_info') }}{{ $t('login.proxy_here') }}
-
-
-
-
-
-
-
- {{ $t('login.login') }}
-
-
- {{ $t('login.search') }}
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences.vue b/src/renderer/components/Preferences.vue
deleted file mode 100644
index 26bc5417..00000000
--- a/src/renderer/components/Preferences.vue
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Account.vue b/src/renderer/components/Preferences/Account.vue
deleted file mode 100644
index ed0919e6..00000000
--- a/src/renderer/components/Preferences/Account.vue
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
{{ $t('preferences.account.title') }}
-
- {{ $t('preferences.account.connected') }}
-
-
-
-
-
-
- a.id)
- )
- "
- >
-
- {{ $t('preferences.account.remove_association') }}
-
-
-
-
-
-
- a.id)
- )
- "
- >
-
-
-
-
- a.id)
- )
- "
- >
-
-
-
-
-
-
-
-
-
-
- {{ $t('preferences.account.remove_all_associations') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Appearance.vue b/src/renderer/components/Preferences/Appearance.vue
deleted file mode 100644
index ad6580d8..00000000
--- a/src/renderer/components/Preferences/Appearance.vue
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
{{ $t('preferences.appearance.title') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Appearance/ColorPallet.vue b/src/renderer/components/Preferences/Appearance/ColorPallet.vue
deleted file mode 100644
index 99e40797..00000000
--- a/src/renderer/components/Preferences/Appearance/ColorPallet.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Appearance/Toot.vue b/src/renderer/components/Preferences/Appearance/Toot.vue
deleted file mode 100644
index 90acc2bc..00000000
--- a/src/renderer/components/Preferences/Appearance/Toot.vue
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ reblogsCount }}
-
-
-
-
-
- {{ favouritesCount }}
-
-
-
- {{ $t('cards.toot.via', { application: 'Whalebird' }) }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/General.vue b/src/renderer/components/Preferences/General.vue
deleted file mode 100644
index e91c028d..00000000
--- a/src/renderer/components/Preferences/General.vue
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
{{ $t('preferences.general.title') }}
-
- {{ $t('preferences.general.sounds.title') }}
-
- {{ $t('preferences.general.sounds.description') }}
-
-
-
-
-
-
-
-
-
- {{ $t('preferences.general.timeline.title') }}
-
- {{ $t('preferences.general.timeline.description') }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('preferences.general.other.title') }}
-
-
-
-
-
-
-
-
- {{ $t('preferences.general.reset.button') }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Language.vue b/src/renderer/components/Preferences/Language.vue
deleted file mode 100644
index 0692f96f..00000000
--- a/src/renderer/components/Preferences/Language.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
{{ $t('preferences.language.title') }}
-
- {{ $t('preferences.language.language.title') }}
-
-
-
-
-
-
-
- {{ $t('preferences.language.spellchecker.title') }}
-
-
-
-
-
- {{ language.name }}
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Network.vue b/src/renderer/components/Preferences/Network.vue
deleted file mode 100644
index b5d99c12..00000000
--- a/src/renderer/components/Preferences/Network.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
{{ $t('preferences.network.proxy.title') }}
-
-
- {{ $t('preferences.network.proxy.no') }}
-
-
- {{ $t('preferences.network.proxy.system') }}
-
-
- {{ $t('preferences.network.proxy.manual') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('preferences.network.save') }}
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Preferences/Notification.vue b/src/renderer/components/Preferences/Notification.vue
deleted file mode 100644
index e7582909..00000000
--- a/src/renderer/components/Preferences/Notification.vue
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
{{ $t('preferences.notification.title') }}
-
-
- {{ $t('preferences.notification.enable.description') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Settings.vue b/src/renderer/components/Settings.vue
deleted file mode 100644
index e9a577ba..00000000
--- a/src/renderer/components/Settings.vue
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Settings/Filters.vue b/src/renderer/components/Settings/Filters.vue
deleted file mode 100644
index 3ec87c49..00000000
--- a/src/renderer/components/Settings/Filters.vue
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
{{ $t('settings.filters.title') }}
-
-
-
- {{ $t('settings.filters.new.title') }}
-
-
-
-
-
-
-
- {{ filters[scope.$index].context.join(',') }}
-
-
-
-
-
-
-
- {{ $t('settings.filters.edit.title') }}
-
-
-
-
-
-
-
- {{ $t('settings.filters.delete.title') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Settings/Filters/Edit.vue b/src/renderer/components/Settings/Filters/Edit.vue
deleted file mode 100644
index 81548fe7..00000000
--- a/src/renderer/components/Settings/Filters/Edit.vue
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
{{ $t('settings.filters.edit.title') }}
-
-
-
-
-
diff --git a/src/renderer/components/Settings/Filters/New.vue b/src/renderer/components/Settings/Filters/New.vue
deleted file mode 100644
index 1f0e03bb..00000000
--- a/src/renderer/components/Settings/Filters/New.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
{{ $t('settings.filters.new.title') }}
-
-
-
-
-
diff --git a/src/renderer/components/Settings/Filters/form.vue b/src/renderer/components/Settings/Filters/form.vue
deleted file mode 100644
index b8bceb76..00000000
--- a/src/renderer/components/Settings/Filters/form.vue
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('settings.filters.form.irreversible') }}
-
-
- {{ $t('settings.filters.form.whole_word') }}
-
-
- {{ $t('settings.filters.form.submit') }}
- {{ $t('settings.filters.form.cancel') }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Settings/General.vue b/src/renderer/components/Settings/General.vue
deleted file mode 100644
index 4d556812..00000000
--- a/src/renderer/components/Settings/General.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
{{ $t('settings.general.title') }}
-
- {{ $t('settings.general.toot.title') }}
-
-
-
-
-
- {{ $t('settings.general.toot.visibility.notice') }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/Settings/Timeline.vue b/src/renderer/components/Settings/Timeline.vue
deleted file mode 100644
index 6c6e1c4f..00000000
--- a/src/renderer/components/Settings/Timeline.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
{{ $t('settings.timeline.title') }}
-
- {{ $t('settings.timeline.use_marker.title') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace.vue b/src/renderer/components/TimelineSpace.vue
deleted file mode 100644
index 8b72d9ff..00000000
--- a/src/renderer/components/TimelineSpace.vue
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Compose.vue b/src/renderer/components/TimelineSpace/Compose.vue
deleted file mode 100644
index ff68bfbc..00000000
--- a/src/renderer/components/TimelineSpace/Compose.vue
+++ /dev/null
@@ -1,916 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.code }}
-
- {{ item.name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('compose.footer.change_sensitive') }}
-
-
-
-
{{ $t('compose.poll.add_choice') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Compose/Quote.vue b/src/renderer/components/TimelineSpace/Compose/Quote.vue
deleted file mode 100644
index ce4db333..00000000
--- a/src/renderer/components/TimelineSpace/Compose/Quote.vue
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents.vue b/src/renderer/components/TimelineSpace/Contents.vue
deleted file mode 100644
index 4cda5537..00000000
--- a/src/renderer/components/TimelineSpace/Contents.vue
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Bookmarks.vue b/src/renderer/components/TimelineSpace/Contents/Bookmarks.vue
deleted file mode 100644
index a517968d..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Bookmarks.vue
+++ /dev/null
@@ -1,248 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/DirectMessages.vue b/src/renderer/components/TimelineSpace/Contents/DirectMessages.vue
deleted file mode 100644
index def43de5..00000000
--- a/src/renderer/components/TimelineSpace/Contents/DirectMessages.vue
+++ /dev/null
@@ -1,194 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Favourites.vue b/src/renderer/components/TimelineSpace/Contents/Favourites.vue
deleted file mode 100644
index dc2b37ee..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Favourites.vue
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/FollowRequests.vue b/src/renderer/components/TimelineSpace/Contents/FollowRequests.vue
deleted file mode 100644
index 64c74716..00000000
--- a/src/renderer/components/TimelineSpace/Contents/FollowRequests.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Hashtag.vue b/src/renderer/components/TimelineSpace/Contents/Hashtag.vue
deleted file mode 100644
index ce3bd106..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Hashtag.vue
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Hashtag/List.vue b/src/renderer/components/TimelineSpace/Contents/Hashtag/List.vue
deleted file mode 100644
index 60d5a47b..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Hashtag/List.vue
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
- {{ tag.tagName }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Hashtag/Tag.vue b/src/renderer/components/TimelineSpace/Contents/Hashtag/Tag.vue
deleted file mode 100644
index 647298a3..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Hashtag/Tag.vue
+++ /dev/null
@@ -1,267 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Home.vue b/src/renderer/components/TimelineSpace/Contents/Home.vue
deleted file mode 100644
index 5e7c521d..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Home.vue
+++ /dev/null
@@ -1,257 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Lists/Edit.vue b/src/renderer/components/TimelineSpace/Contents/Lists/Edit.vue
deleted file mode 100644
index 9d7ff66b..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Lists/Edit.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Lists/Index.vue b/src/renderer/components/TimelineSpace/Contents/Lists/Index.vue
deleted file mode 100644
index 8165047c..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Lists/Index.vue
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ list.title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Lists/Show.vue b/src/renderer/components/TimelineSpace/Contents/Lists/Show.vue
deleted file mode 100644
index 86b932b1..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Lists/Show.vue
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Local.vue b/src/renderer/components/TimelineSpace/Contents/Local.vue
deleted file mode 100644
index 903ff8b9..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Local.vue
+++ /dev/null
@@ -1,201 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Notifications.vue b/src/renderer/components/TimelineSpace/Contents/Notifications.vue
deleted file mode 100644
index d96ef5a8..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Notifications.vue
+++ /dev/null
@@ -1,241 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Public.vue b/src/renderer/components/TimelineSpace/Contents/Public.vue
deleted file mode 100644
index 9b494177..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Public.vue
+++ /dev/null
@@ -1,231 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Search.vue b/src/renderer/components/TimelineSpace/Contents/Search.vue
deleted file mode 100644
index 2e7b82d9..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Search.vue
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Search/Account.vue b/src/renderer/components/TimelineSpace/Contents/Search/Account.vue
deleted file mode 100644
index cfe7a7eb..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Search/Account.vue
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Search/Tag.vue b/src/renderer/components/TimelineSpace/Contents/Search/Tag.vue
deleted file mode 100644
index 09c8a326..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Search/Tag.vue
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Contents/Search/Toots.vue b/src/renderer/components/TimelineSpace/Contents/Search/Toots.vue
deleted file mode 100644
index 5c33cadd..00000000
--- a/src/renderer/components/TimelineSpace/Contents/Search/Toots.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail.vue b/src/renderer/components/TimelineSpace/Detail.vue
deleted file mode 100644
index 531ca171..00000000
--- a/src/renderer/components/TimelineSpace/Detail.vue
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail/Profile.vue b/src/renderer/components/TimelineSpace/Detail/Profile.vue
deleted file mode 100644
index 39d8226b..00000000
--- a/src/renderer/components/TimelineSpace/Detail/Profile.vue
+++ /dev/null
@@ -1,561 +0,0 @@
-
-
-
-
-
-
- {{ identity.provider }}
-
-
- {{ identity.provider_username }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail/Profile/Followers.vue b/src/renderer/components/TimelineSpace/Detail/Profile/Followers.vue
deleted file mode 100644
index ce73ee66..00000000
--- a/src/renderer/components/TimelineSpace/Detail/Profile/Followers.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail/Profile/Following.vue b/src/renderer/components/TimelineSpace/Detail/Profile/Following.vue
deleted file mode 100644
index b5b94585..00000000
--- a/src/renderer/components/TimelineSpace/Detail/Profile/Following.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail/Profile/Posts.vue b/src/renderer/components/TimelineSpace/Detail/Profile/Posts.vue
deleted file mode 100644
index 0e715a54..00000000
--- a/src/renderer/components/TimelineSpace/Detail/Profile/Posts.vue
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Detail/Status.vue b/src/renderer/components/TimelineSpace/Detail/Status.vue
deleted file mode 100644
index 2029287c..00000000
--- a/src/renderer/components/TimelineSpace/Detail/Status.vue
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/HeaderMenu.vue b/src/renderer/components/TimelineSpace/HeaderMenu.vue
deleted file mode 100644
index a2ff6609..00000000
--- a/src/renderer/components/TimelineSpace/HeaderMenu.vue
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals.vue b/src/renderer/components/TimelineSpace/Modals.vue
deleted file mode 100644
index 0acbeaed..00000000
--- a/src/renderer/components/TimelineSpace/Modals.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/AddListMember.vue b/src/renderer/components/TimelineSpace/Modals/AddListMember.vue
deleted file mode 100644
index 0505cbdd..00000000
--- a/src/renderer/components/TimelineSpace/Modals/AddListMember.vue
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ username(user) }}
-
-
@{{ user.acct }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/ImageViewer.vue b/src/renderer/components/TimelineSpace/Modals/ImageViewer.vue
deleted file mode 100644
index b60d8281..00000000
--- a/src/renderer/components/TimelineSpace/Modals/ImageViewer.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/ImageViewer/Media.vue b/src/renderer/components/TimelineSpace/Modals/ImageViewer/Media.vue
deleted file mode 100644
index 0bdeac79..00000000
--- a/src/renderer/components/TimelineSpace/Modals/ImageViewer/Media.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/Jump.vue b/src/renderer/components/TimelineSpace/Modals/Jump.vue
deleted file mode 100644
index d60372b0..00000000
--- a/src/renderer/components/TimelineSpace/Modals/Jump.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/ListMembership.vue b/src/renderer/components/TimelineSpace/Modals/ListMembership.vue
deleted file mode 100644
index ef33bd79..00000000
--- a/src/renderer/components/TimelineSpace/Modals/ListMembership.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
- {{ list.title }}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/MuteConfirm.vue b/src/renderer/components/TimelineSpace/Modals/MuteConfirm.vue
deleted file mode 100644
index 253a26c5..00000000
--- a/src/renderer/components/TimelineSpace/Modals/MuteConfirm.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/Report.vue b/src/renderer/components/TimelineSpace/Modals/Report.vue
deleted file mode 100644
index 7896aeee..00000000
--- a/src/renderer/components/TimelineSpace/Modals/Report.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/Shortcut.vue b/src/renderer/components/TimelineSpace/Modals/Shortcut.vue
deleted file mode 100644
index cd187231..00000000
--- a/src/renderer/components/TimelineSpace/Modals/Shortcut.vue
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
-
-
-
- Ctrl(Cmd) + 1, 2, 3...
- {{ $t('modals.shortcut.ctrl_number') }}
-
-
- Ctrl(Cmd) + k
- {{ $t('modals.shortcut.ctrl_k') }}
-
-
- Ctrl(Cmd) + Enter
- {{ $t('modals.shortcut.ctrl_enter') }}
-
-
- Ctrl(Cmd) + r
- {{ $t('modals.shortcut.ctrl_r') }}
-
-
- j
- {{ $t('modals.shortcut.j') }}
-
-
- k
- {{ $t('modals.shortcut.k') }}
-
-
- r
- {{ $t('modals.shortcut.r') }}
-
-
- b
- {{ $t('modals.shortcut.b') }}
-
-
- f
- {{ $t('modals.shortcut.f') }}
-
-
- o
- {{ $t('modals.shortcut.o') }}
-
-
- p
- {{ $t('modals.shortcut.p') }}
-
-
- i
- {{ $t('modals.shortcut.i') }}
-
-
- x
- {{ $t('modals.shortcut.x') }}
-
-
- ?
- {{ $t('modals.shortcut.?') }}
-
-
- esc
- {{ $t('modals.shortcut.esc') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/Modals/Thirdparty.vue b/src/renderer/components/TimelineSpace/Modals/Thirdparty.vue
deleted file mode 100644
index 6d8ab066..00000000
--- a/src/renderer/components/TimelineSpace/Modals/Thirdparty.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
- {{ lib.package_name }}
- {{ lib.license }}
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/ReceiveDrop.vue b/src/renderer/components/TimelineSpace/ReceiveDrop.vue
deleted file mode 100644
index d54edac8..00000000
--- a/src/renderer/components/TimelineSpace/ReceiveDrop.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
{{ $t('receive_drop.drop_message') }}
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/TimelineSpace/SideMenu.vue b/src/renderer/components/TimelineSpace/SideMenu.vue
deleted file mode 100644
index f85da4ff..00000000
--- a/src/renderer/components/TimelineSpace/SideMenu.vue
+++ /dev/null
@@ -1,594 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/atoms/FailoverImg.vue b/src/renderer/components/atoms/FailoverImg.vue
deleted file mode 100644
index db07fb16..00000000
--- a/src/renderer/components/atoms/FailoverImg.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/molecules/Tag.vue b/src/renderer/components/molecules/Tag.vue
deleted file mode 100644
index 89bc0e17..00000000
--- a/src/renderer/components/molecules/Tag.vue
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
- {{ tag.name }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/molecules/Toot/LinkPreview.vue b/src/renderer/components/molecules/Toot/LinkPreview.vue
deleted file mode 100644
index 731e6b05..00000000
--- a/src/renderer/components/molecules/Toot/LinkPreview.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
- {{ title }}
- {{ description }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/molecules/Toot/Poll.vue b/src/renderer/components/molecules/Toot/Poll.vue
deleted file mode 100644
index 1dfe2746..00000000
--- a/src/renderer/components/molecules/Toot/Poll.vue
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
- {{ percentage(option.votes_count, poll.votes_count) }}%
- {{ option.title }}
-
-
-
-
-
- {{ option.title }}
-
-
-
- {{
- $t('cards.toot.poll.vote')
- }}
- {{ $t('cards.toot.poll.refresh') }}
- {{ poll.votes_count }} {{ $t('cards.toot.poll.votes_count') }},
- {{ parseDatetime(poll.expires_at, now) }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/molecules/Toot/Quote.vue b/src/renderer/components/molecules/Toot/Quote.vue
deleted file mode 100644
index ff069026..00000000
--- a/src/renderer/components/molecules/Toot/Quote.vue
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/molecules/User.vue b/src/renderer/components/molecules/User.vue
deleted file mode 100644
index 9df5ce0a..00000000
--- a/src/renderer/components/molecules/User.vue
+++ /dev/null
@@ -1,201 +0,0 @@
-
-
-
-
-
-
-
-
-
-
@{{ user.acct }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification.vue b/src/renderer/components/organisms/Notification.vue
deleted file mode 100644
index 309655d3..00000000
--- a/src/renderer/components/organisms/Notification.vue
+++ /dev/null
@@ -1,163 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification/Follow.vue b/src/renderer/components/organisms/Notification/Follow.vue
deleted file mode 100644
index 8243634e..00000000
--- a/src/renderer/components/organisms/Notification/Follow.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification/FollowRequest.vue b/src/renderer/components/organisms/Notification/FollowRequest.vue
deleted file mode 100644
index b74353d3..00000000
--- a/src/renderer/components/organisms/Notification/FollowRequest.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification/Mention.vue b/src/renderer/components/organisms/Notification/Mention.vue
deleted file mode 100644
index d2f06bb1..00000000
--- a/src/renderer/components/organisms/Notification/Mention.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification/Status.vue b/src/renderer/components/organisms/Notification/Status.vue
deleted file mode 100644
index bf4d9ad4..00000000
--- a/src/renderer/components/organisms/Notification/Status.vue
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Notification/StatusReaction.vue b/src/renderer/components/organisms/Notification/StatusReaction.vue
deleted file mode 100644
index 99a1cacd..00000000
--- a/src/renderer/components/organisms/Notification/StatusReaction.vue
+++ /dev/null
@@ -1,489 +0,0 @@
-
-
-
Filtered
-
-
-
-
- {{ message.emoji }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('cards.toot.show_more') }}
-
-
- {{ $t('cards.toot.hide') }}
-
-
-
-
-
-
- {{ $t('cards.toot.sensitive') }}
-
-
-
-
-
-
-
- GIF
- VIDEO
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/StatusLoading.vue b/src/renderer/components/organisms/StatusLoading.vue
deleted file mode 100644
index d1ef685d..00000000
--- a/src/renderer/components/organisms/StatusLoading.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
{{ $t('cards.status_loading.message') }}
-
-
-
-
-
-
-
diff --git a/src/renderer/components/organisms/Toot.vue b/src/renderer/components/organisms/Toot.vue
deleted file mode 100644
index 61d78bd9..00000000
--- a/src/renderer/components/organisms/Toot.vue
+++ /dev/null
@@ -1,1079 +0,0 @@
-
-
-
Filtered
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('cards.toot.show_more') }}
-
-
- {{ $t('cards.toot.hide') }}
-
-
-
-
-
-
-
- {{ $t('cards.toot.sensitive') }}
-
-
-
-
-
-
-
- GIF
- VIDEO
- AUDIO
-
-
-
-
-
-
-
-
- {{ reaction.name }} {{ reaction.count }}
- {{ reaction.name }} {{ reaction.count }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/components/utils/scroll.ts b/src/renderer/components/utils/scroll.ts
deleted file mode 100644
index e2a0bb0a..00000000
--- a/src/renderer/components/utils/scroll.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Scroll to top of the element.
- * @param element a target dom element
- * @param point scroll target point of the element
- **/
-export default function scrollTop(element: HTMLElement, point: number = 0) {
- const start = element.scrollTop
- const range = start - point
- // Progress of scroll: 0 ~ 100
- let progress = 0
- const boost = range > 200 ? range / 200 : 2.0
- /**
- * Scroll calling recursion.
- **/
- const move = function () {
- progress++
- const nextPos = start - range * boost * easeOut(progress / 100)
-
- // Stop the recursion
- if (nextPos <= 0) {
- element.scrollTop = 0
- return
- }
-
- element.scrollTop = nextPos
- requestAnimationFrame(move)
- }
-
- requestAnimationFrame(move)
-}
-
-/**
- * easeOut
- **/
-const easeOut = function (p: number) {
- return p * (2 - p)
-}
diff --git a/src/renderer/errors/fetch.ts b/src/renderer/errors/fetch.ts
deleted file mode 100644
index efded1ff..00000000
--- a/src/renderer/errors/fetch.ts
+++ /dev/null
@@ -1 +0,0 @@
-export class TimelineFetchError extends Error {}
diff --git a/src/renderer/errors/load.ts b/src/renderer/errors/load.ts
deleted file mode 100644
index 6c44bd2b..00000000
--- a/src/renderer/errors/load.ts
+++ /dev/null
@@ -1 +0,0 @@
-export class AccountLoadError extends Error {}
diff --git a/src/renderer/errors/validations.ts b/src/renderer/errors/validations.ts
deleted file mode 100644
index be1665eb..00000000
--- a/src/renderer/errors/validations.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export class NewTootBlockSubmit extends Error {}
-
-export class NewTootTootLength extends Error {}
-
-export class NewTootAttachLength extends Error {}
-
-export class NewTootMediaDescription extends Error {}
-
-export class NewTootPollInvalid extends Error {}
-
-export class NewTootUnknownType extends Error {}
-
-export class AuthenticationError extends Error {}
diff --git a/src/renderer/main.ts b/src/renderer/main.ts
deleted file mode 100644
index 9efcfe7a..00000000
--- a/src/renderer/main.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import { createApp } from 'vue'
-import ElementPlus from 'element-plus'
-import 'element-plus/dist/index.css'
-import { library } from '@fortawesome/fontawesome-svg-core'
-import {
- faAngleDown,
- faAngleUp,
- faAngleRight,
- faAngleLeft,
- faAnglesRight,
- faAnglesLeft,
- faHome,
- faBell,
- faAt,
- faEnvelope,
- faUsers,
- faStar,
- faBookmark,
- faGlobe,
- faHashtag,
- faListUl,
- faCamera,
- faUnlock,
- faLock,
- faEyeSlash,
- faEye,
- faPlus,
- faXmark,
- faSquarePollHorizontal,
- faRetweet,
- faUserPlus,
- faReply,
- faEllipsis,
- faGear,
- faPalette,
- faUser,
- faNetworkWired,
- faLanguage,
- faAlignLeft,
- faFilter,
- faRotate,
- faSliders,
- faUserXmark,
- faHourglass,
- faCheck,
- faQuoteRight,
- faThumbTack,
- faChevronLeft,
- faEllipsisVertical,
- faCircleXmark,
- faMagnifyingGlass,
- faCircleUser,
- faArrowUp,
- faArrowDown,
- faArrowLeft,
- faArrowRight,
- faSpinner,
- faLink
-} from '@fortawesome/free-solid-svg-icons'
-import {
- faFaceSmile as farFaceSmile,
- faPenToSquare as farPenToSquare,
- faTrashCan as farTrashCan,
- faBell as farBell
-} from '@fortawesome/free-regular-svg-icons'
-import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
-import { sync } from 'vuex-router-sync'
-import I18NextVue from 'i18next-vue'
-import 'vue-resize/dist/vue-resize.css'
-import VueResize from 'vue-resize'
-import VueVirtualScroller from 'vue-virtual-scroller'
-import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
-
-import './assets/fonts/fonts.css'
-import App from './App.vue'
-import router from '@/router'
-import store, { key } from './store'
-import i18next from '~/src/config/i18n'
-
-library.add(
- faAngleDown,
- faAngleUp,
- faAngleRight,
- faAngleLeft,
- faAnglesRight,
- faAnglesLeft,
- faHome,
- faBell,
- faAt,
- faEnvelope,
- faUsers,
- faStar,
- faBookmark,
- faGlobe,
- faMagnifyingGlass,
- faHashtag,
- faListUl,
- faCircleXmark,
- faCamera,
- faUnlock,
- faLock,
- faEyeSlash,
- faEye,
- faPlus,
- farFaceSmile,
- faXmark,
- faSquarePollHorizontal,
- faRetweet,
- faUserPlus,
- faReply,
- faEllipsis,
- faGear,
- faPalette,
- faUser,
- faNetworkWired,
- faLanguage,
- faAlignLeft,
- faFilter,
- farPenToSquare,
- faRotate,
- faSliders,
- faXmark,
- faUserXmark,
- faHourglass,
- faUserPlus,
- faCheck,
- faQuoteRight,
- faThumbTack,
- farTrashCan,
- farBell,
- faChevronLeft,
- faEllipsisVertical,
- faCircleUser,
- faArrowUp,
- faArrowDown,
- faArrowLeft,
- faArrowRight,
- faSpinner,
- faLink
-)
-
-const app = createApp(App)
-app.use(store, key)
-app.use(router)
-app.use(ElementPlus)
-app.component('font-awesome-icon', FontAwesomeIcon)
-app.use(VueVirtualScroller)
-app.use(VueResize)
-app.use(I18NextVue, { i18next })
-
-app.directive('focus', {
- mounted(el) {
- el.focus()
- }
-})
-
-sync(store, router)
-
-app.mount('#app')
diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts
deleted file mode 100644
index 4a2707f9..00000000
--- a/src/renderer/router/index.ts
+++ /dev/null
@@ -1,223 +0,0 @@
-import { createRouter, createWebHistory } from 'vue-router'
-
-import Login from '@/components/Login.vue'
-import LoginForm from '@/components/Login/LoginForm.vue'
-import Authorize from '@/components/Login/Authorize.vue'
-import Preferences from '@/components/Preferences.vue'
-import PreferencesGeneral from '@/components/Preferences/General.vue'
-import PreferencesAppearance from '@/components/Preferences/Appearance.vue'
-import PreferencesNotification from '@/components/Preferences/Notification.vue'
-import PreferencesAccount from '@/components/Preferences/Account.vue'
-import PreferencesLanguage from '@/components/Preferences/Language.vue'
-import PreferencesNetwork from '@/components/Preferences/Network.vue'
-import GlobalHeader from '@/components/GlobalHeader.vue'
-import Settings from '@/components/Settings.vue'
-import SettingsGeneral from '@/components/Settings/General.vue'
-import SettingsTimeline from '@/components/Settings/Timeline.vue'
-import SettingsFilters from '@/components/Settings/Filters.vue'
-import SettingsFiltersEdit from '@/components/Settings/Filters/Edit.vue'
-import SettingsFiltersNew from '@/components/Settings/Filters/New.vue'
-import TimelineSpace from '@/components/TimelineSpace.vue'
-import TimelineSpaceContentsHome from '@/components/TimelineSpace/Contents/Home.vue'
-import TimelineSpaceContentsNotifications from '@/components/TimelineSpace/Contents/Notifications.vue'
-import TimelineSpaceContentsFavourites from '@/components/TimelineSpace/Contents/Favourites.vue'
-import TimelineSpaceContentsLocal from '@/components/TimelineSpace/Contents/Local.vue'
-import TimelineSpaceContentsPublic from '@/components/TimelineSpace/Contents/Public.vue'
-import TimelineSpaceContentsHashtag from '@/components/TimelineSpace/Contents/Hashtag.vue'
-import TimelineSpaceContentsHashtagList from '@/components/TimelineSpace/Contents/Hashtag/List.vue'
-import TimelineSpaceContentsHashtagTag from '@/components/TimelineSpace/Contents/Hashtag/Tag.vue'
-import TimelineSpaceContentsSearch from '@/components/TimelineSpace/Contents/Search.vue'
-import TimelineSpaceContentsDirectMessages from '@/components/TimelineSpace/Contents/DirectMessages.vue'
-import TimelineSpaceContentsListsIndex from '@/components/TimelineSpace/Contents/Lists/Index.vue'
-import TimelineSpaceContentsListsEdit from '@/components/TimelineSpace/Contents/Lists/Edit.vue'
-import TimelineSpaceContentsListsShow from '@/components/TimelineSpace/Contents/Lists/Show.vue'
-import TimelineSpaceContentsFollowRequests from '@/components/TimelineSpace/Contents/FollowRequests.vue'
-import TimelineSpaceContentsBookmarks from '@/components/TimelineSpace/Contents/Bookmarks.vue'
-
-const routes = [
- {
- path: '/login/',
- name: 'login',
- component: Login,
- children: [
- {
- path: 'form',
- name: 'login-form',
- component: LoginForm
- },
- {
- path: 'authorize',
- name: 'authorize',
- component: Authorize
- }
- ]
- },
- {
- path: '/preferences/',
- name: 'preferences',
- component: Preferences,
- children: [
- {
- path: 'general',
- name: 'general',
- component: PreferencesGeneral
- },
- {
- path: 'appearance',
- name: 'appearance',
- component: PreferencesAppearance
- },
- {
- path: 'notification',
- name: 'notification',
- component: PreferencesNotification
- },
- {
- path: 'account',
- name: 'account',
- component: PreferencesAccount
- },
- {
- path: 'network',
- name: 'network',
- component: PreferencesNetwork
- },
- {
- path: 'language',
- name: 'language',
- component: PreferencesLanguage
- }
- ]
- },
- {
- path: '/',
- name: 'global-header',
- component: GlobalHeader,
- children: [
- {
- path: ':id/settings/',
- component: Settings,
- children: [
- {
- path: 'general',
- component: SettingsGeneral
- },
- {
- path: 'timeline',
- component: SettingsTimeline
- },
- {
- path: 'filters',
- component: SettingsFilters
- },
- {
- path: 'filters/new',
- component: SettingsFiltersNew
- },
- {
- path: 'filters/:filter_id/edit',
- component: SettingsFiltersEdit,
- props: true
- }
- ]
- },
- {
- path: ':id/',
- name: 'timeline-space',
- component: TimelineSpace,
- children: [
- {
- path: 'home',
- name: 'home',
- component: TimelineSpaceContentsHome
- },
- {
- path: 'notifications',
- name: 'notifications',
- component: TimelineSpaceContentsNotifications
- },
- {
- path: 'follow-requests',
- name: 'follow-requests',
- component: TimelineSpaceContentsFollowRequests
- },
- {
- path: 'favourites',
- name: 'favourites',
- component: TimelineSpaceContentsFavourites
- },
- {
- path: 'bookmarks',
- name: 'bookmarks',
- component: TimelineSpaceContentsBookmarks
- },
- {
- path: 'local',
- name: 'local',
- component: TimelineSpaceContentsLocal
- },
- {
- path: 'public',
- name: 'public',
- component: TimelineSpaceContentsPublic
- },
- {
- path: 'hashtag/',
- component: TimelineSpaceContentsHashtag,
- children: [
- {
- path: '',
- name: 'hashtag-list',
- component: TimelineSpaceContentsHashtagList
- },
- {
- path: ':tag',
- name: 'tag',
- component: TimelineSpaceContentsHashtagTag,
- props: true
- }
- ]
- },
- {
- path: 'search',
- name: 'search',
- component: TimelineSpaceContentsSearch
- },
- {
- path: 'direct-messages',
- name: 'direct-messages',
- component: TimelineSpaceContentsDirectMessages
- },
- {
- path: 'lists',
- name: 'lists',
- component: TimelineSpaceContentsListsIndex
- },
- {
- path: 'lists/:list_id/edit',
- name: 'edit-list',
- component: TimelineSpaceContentsListsEdit,
- props: true
- },
- {
- path: 'lists/:list_id',
- name: 'list',
- component: TimelineSpaceContentsListsShow,
- props: true
- }
- ]
- }
- ]
- },
- {
- path: '/:pathMatch(.*)*',
- redirect: '/'
- }
-]
-
-const router = createRouter({
- history: createWebHistory(),
- routes: routes
-})
-
-export default router
diff --git a/src/renderer/store/App.ts b/src/renderer/store/App.ts
deleted file mode 100644
index 66c5e55c..00000000
--- a/src/renderer/store/App.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-import { MutationTree, ActionTree, Module } from 'vuex'
-import router from '@/router'
-import { LightTheme, DarkTheme, SolarizedLightTheme, SolarizedDarkTheme, KimbieDarkTheme, ThemeColorType } from '~/src/constants/themeColor'
-import DisplayStyle from '~/src/constants/displayStyle'
-import Theme from '~/src/constants/theme'
-import TimeFormat from '~/src/constants/timeFormat'
-import Language from '~/src/constants/language'
-import DefaultFonts from '@/utils/fonts'
-import { RootState } from '@/store'
-import { Notify } from '~/src/types/notify'
-import { BaseConfig } from '~/src/types/preference'
-import { Appearance } from '~/src/types/appearance'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type AppState = {
- theme: ThemeColorType
- fontSize: number
- displayNameStyle: number
- notify: Notify
- timeFormat: number
- language: string
- defaultFonts: Array
- ignoreCW: boolean
- ignoreNSFW: boolean
- hideAllAttachments: boolean
- tootPadding: number
- userAgent: string
-}
-
-const state = (): AppState => ({
- theme: LightTheme,
- fontSize: 14,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- notify: {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true,
- follow_request: true,
- reaction: true,
- status: true,
- poll_vote: true,
- poll_expired: true
- },
- tootPadding: 8,
- timeFormat: TimeFormat.Absolute.value,
- language: Language.en.key,
- defaultFonts: DefaultFonts,
- ignoreCW: false,
- ignoreNSFW: false,
- hideAllAttachments: false,
- userAgent: 'Whalebird'
-})
-
-export const MUTATION_TYPES = {
- UPDATE_THEME: 'updateTheme',
- UPDATE_FONT_SIZE: 'updateFontSize',
- UPDATE_DISPLAY_NAME_STYLE: 'updateDisplayNameStyle',
- UPDATE_NOTIFY: 'updateNotify',
- UPDATE_TOOT_PADDING: 'updateTootPadding',
- UPDATE_TIME_FORMAT: 'updateTimeFormat',
- UPDATE_LANGUAGE: 'updateLanguage',
- ADD_FONT: 'addFont',
- UPDATE_IGNORE_CW: 'updateIgnoreCW',
- UPDATE_IGNORE_NSFW: 'updateIgnoreNSFW',
- UPDATE_HIDE_ALL_ATTACHMENTS: 'updateHideAllAttachments'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_THEME]: (state: AppState, themeColorList: ThemeColorType) => {
- state.theme = themeColorList
- },
- [MUTATION_TYPES.UPDATE_FONT_SIZE]: (state: AppState, value: number) => {
- state.fontSize = value
- },
- [MUTATION_TYPES.UPDATE_DISPLAY_NAME_STYLE]: (state: AppState, value: number) => {
- state.displayNameStyle = value
- },
- [MUTATION_TYPES.UPDATE_NOTIFY]: (state: AppState, notify: Notify) => {
- state.notify = notify
- },
- [MUTATION_TYPES.UPDATE_TOOT_PADDING]: (state: AppState, value: number) => {
- state.tootPadding = value
- },
- [MUTATION_TYPES.UPDATE_TIME_FORMAT]: (state: AppState, format: number) => {
- state.timeFormat = format
- },
- [MUTATION_TYPES.UPDATE_LANGUAGE]: (state: AppState, key: string) => {
- state.language = key
- },
- [MUTATION_TYPES.ADD_FONT]: (state: AppState, font: string) => {
- const list = [font].concat(DefaultFonts)
- state.defaultFonts = Array.from(new Set(list))
- },
- [MUTATION_TYPES.UPDATE_IGNORE_CW]: (state: AppState, cw: boolean) => {
- state.ignoreCW = cw
- },
- [MUTATION_TYPES.UPDATE_IGNORE_NSFW]: (state: AppState, nsfw: boolean) => {
- state.ignoreNSFW = nsfw
- },
- [MUTATION_TYPES.UPDATE_HIDE_ALL_ATTACHMENTS]: (state: AppState, hideAllAttachments: boolean) => {
- state.hideAllAttachments = hideAllAttachments
- }
-}
-
-export const ACTION_TYPES = {
- WATCH_SHORTCUT_EVENTS: 'watchShortcutEvents',
- REMOVE_SHORTCUT_EVENTS: 'removeShortcutEvents',
- LOAD_PREFERENCES: 'loadPreferences',
- UPDATE_THEME: 'updateTheme'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.WATCH_SHORTCUT_EVENTS]: () => {
- win.ipcRenderer.on('open-preferences', () => {
- router.push('/preferences/general')
- })
- },
- [ACTION_TYPES.REMOVE_SHORTCUT_EVENTS]: () => {
- win.ipcRenderer.removeAllListeners('open-preferences')
- },
- [ACTION_TYPES.LOAD_PREFERENCES]: async ({ commit, dispatch }) => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences')
- await dispatch('updateTheme', conf.appearance)
- commit(MUTATION_TYPES.UPDATE_DISPLAY_NAME_STYLE, conf.appearance.displayNameStyle)
- commit(MUTATION_TYPES.UPDATE_FONT_SIZE, conf.appearance.fontSize)
- commit(MUTATION_TYPES.UPDATE_NOTIFY, conf.notification.notify)
- commit(MUTATION_TYPES.UPDATE_TIME_FORMAT, conf.appearance.timeFormat)
- commit(MUTATION_TYPES.UPDATE_LANGUAGE, conf.language.language)
- commit(MUTATION_TYPES.UPDATE_TOOT_PADDING, conf.appearance.tootPadding)
- commit(MUTATION_TYPES.ADD_FONT, conf.appearance.font)
- commit(MUTATION_TYPES.UPDATE_IGNORE_CW, conf.general.timeline.cw)
- commit(MUTATION_TYPES.UPDATE_IGNORE_NSFW, conf.general.timeline.nsfw)
- commit(MUTATION_TYPES.UPDATE_HIDE_ALL_ATTACHMENTS, conf.general.timeline.hideAllAttachments)
- return conf
- },
- [ACTION_TYPES.UPDATE_THEME]: async ({ commit }, appearance: Appearance) => {
- const themeKey: string = appearance.theme
- switch (themeKey) {
- case Theme.System.key: {
- const dark: boolean = await win.ipcRenderer.invoke('system-use-dark-theme')
- if (dark) {
- commit(MUTATION_TYPES.UPDATE_THEME, DarkTheme)
- } else {
- commit(MUTATION_TYPES.UPDATE_THEME, LightTheme)
- }
- break
- }
- case Theme.Light.key:
- commit(MUTATION_TYPES.UPDATE_THEME, LightTheme)
- break
- case Theme.Dark.key:
- commit(MUTATION_TYPES.UPDATE_THEME, DarkTheme)
- break
- case Theme.SolarizedLight.key:
- commit(MUTATION_TYPES.UPDATE_THEME, SolarizedLightTheme)
- break
- case Theme.SolarizedDark.key:
- commit(MUTATION_TYPES.UPDATE_THEME, SolarizedDarkTheme)
- break
- case Theme.KimbieDark.key:
- commit(MUTATION_TYPES.UPDATE_THEME, KimbieDarkTheme)
- break
- case Theme.Custom.key:
- commit(MUTATION_TYPES.UPDATE_THEME, appearance.customThemeColor)
- break
- default:
- commit(MUTATION_TYPES.UPDATE_THEME, LightTheme)
- break
- }
- }
-}
-
-const App: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default App
diff --git a/src/renderer/store/GlobalHeader.ts b/src/renderer/store/GlobalHeader.ts
deleted file mode 100644
index 2dd655a1..00000000
--- a/src/renderer/store/GlobalHeader.ts
+++ /dev/null
@@ -1,171 +0,0 @@
-import router from '@/router'
-import { LocalAccount } from '~/src/types/localAccount'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { MyWindow } from '~/src/types/global'
-import { LocalServer } from '~src/types/localServer'
-import { Entity } from 'megalodon'
-
-const win = window as any as MyWindow
-
-export type GlobalHeaderState = {
- accounts: Array<[LocalAccount, LocalServer]>
- changing: boolean
- hide: boolean
-}
-
-const state = (): GlobalHeaderState => ({
- accounts: [],
- changing: false,
- hide: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_ACCOUNTS: 'updateAccounts',
- UPDATE_CHANGING: 'updateChanging',
- CHANGE_HIDE: 'changeHide'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_ACCOUNTS]: (state: GlobalHeaderState, accounts: Array<[LocalAccount, LocalServer]>) => {
- state.accounts = accounts
- },
- [MUTATION_TYPES.UPDATE_CHANGING]: (state: GlobalHeaderState, value: boolean) => {
- state.changing = value
- },
- [MUTATION_TYPES.CHANGE_HIDE]: (state: GlobalHeaderState, value: boolean) => {
- state.hide = value
- }
-}
-
-export const ACTION_TYPES = {
- INIT_LOAD: 'initLoad',
- START_STREAMINGS: 'startStreamings',
- LIST_ACCOUNTS: 'listAccounts',
- WATCH_SHORTCUT_EVENTS: 'watchShortcutEvents',
- REMOVE_SHORTCUT_EVENTS: 'removeShortcutEvents',
- LOAD_HIDE: 'loadHide',
- SWITCH_HIDE: 'switchHide',
- LOAD_TIMELINES: 'loadTimelines',
- BIND_STREAMINGS: 'bindStreamings',
- BIND_NOTIFICATION: 'bindNotification'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.INIT_LOAD]: async ({ dispatch }): Promise> => {
- // Ignore error
- try {
- await dispatch(ACTION_TYPES.REMOVE_SHORTCUT_EVENTS)
- await dispatch(ACTION_TYPES.LOAD_HIDE)
- dispatch(ACTION_TYPES.WATCH_SHORTCUT_EVENTS)
- } catch (err) {
- console.error(err)
- }
- const accounts = await dispatch(ACTION_TYPES.LIST_ACCOUNTS)
- await dispatch(ACTION_TYPES.LOAD_TIMELINES, accounts)
- await dispatch(ACTION_TYPES.BIND_STREAMINGS, accounts)
- // Block to root path when user use browser-back, like mouse button.
- // Because any contents are not rendered when browser back to / from home.
- router.beforeEach((to, from, next) => {
- if (!(to.fullPath === '/' && from.name)) {
- return next()
- }
- })
- return accounts
- },
- [ACTION_TYPES.LIST_ACCOUNTS]: async ({ commit }): Promise> => {
- const accounts: Array<[LocalAccount, LocalServer]> = await win.ipcRenderer.invoke('list-accounts')
- commit(MUTATION_TYPES.UPDATE_ACCOUNTS, accounts)
- return accounts
- },
- [ACTION_TYPES.WATCH_SHORTCUT_EVENTS]: ({ state, commit, rootState, rootGetters }) => {
- win.ipcRenderer.on('change-account', (_, account: LocalAccount) => {
- if (state.changing) {
- return null
- }
- if ((rootState.route.params.id as string) === account[0].id) {
- return null
- }
- // When the modal window is active, don't change account
- if (rootGetters['TimelineSpace/Modals/modalOpened']) {
- return null
- }
- // changing finish after loading
- commit(MUTATION_TYPES.UPDATE_CHANGING, true)
- router.push(`/${account[0].id}/home`)
- return true
- })
- },
- [ACTION_TYPES.REMOVE_SHORTCUT_EVENTS]: async () => {
- win.ipcRenderer.removeAllListeners('change-account')
- return true
- },
- [ACTION_TYPES.LOAD_HIDE]: async ({ commit }): Promise => {
- const hide: boolean = await win.ipcRenderer.invoke('get-global-header')
- commit(MUTATION_TYPES.CHANGE_HIDE, hide)
- return hide
- },
- [ACTION_TYPES.SWITCH_HIDE]: async ({ dispatch }, hide: boolean): Promise => {
- await win.ipcRenderer.invoke('change-global-header', hide)
- dispatch(ACTION_TYPES.LOAD_HIDE)
- return true
- },
- [ACTION_TYPES.BIND_NOTIFICATION]: () => {
- win.ipcRenderer.removeAllListeners('open-notification-tab')
- win.ipcRenderer.on('open-notification-tab', (_, id: string) => {
- router.push(`/${id}/home`)
- // We have to wait until change el-menu-item
- setTimeout(() => router.push(`/${id}/notifications`), 500)
- })
- },
- [ACTION_TYPES.LOAD_TIMELINES]: async ({ dispatch }, req: Array<[LocalAccount, LocalServer]>) => {
- req.forEach(async ([account, server]) => {
- await dispatch('TimelineSpace/Contents/Home/fetchTimeline', { account, server }, { root: true })
- await dispatch('TimelineSpace/Contents/Notifications/fetchNotifications', { account, server }, { root: true })
- await dispatch('TimelineSpace/Contents/Local/fetchLocalTimeline', { account, server }, { root: true })
- await dispatch('TimelineSpace/Contents/DirectMessages/fetchTimeline', { account, server }, { root: true })
- })
- },
- [ACTION_TYPES.BIND_STREAMINGS]: async ({ commit }, req: Array<[LocalAccount, LocalServer]>) => {
- req.forEach(async ([account, _server]) => {
- win.ipcRenderer.removeAllListeners(`update-user-streamings-${account.id}`)
- win.ipcRenderer.on(`update-user-streamings-${account.id}`, (_, update: Entity.Status) => {
- commit('TimelineSpace/Contents/Home/appendTimeline', { status: update, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`notification-user-streamings-${account.id}`)
- win.ipcRenderer.on(`notification-user-streamings-${account.id}`, (_, notification: Entity.Notification) => {
- commit('TimelineSpace/Contents/Notifications/appendNotifications', { notification, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`delete-user-streamings-${account.id}`)
- win.ipcRenderer.on(`delete-user-streamings-${account.id}`, (_, id: string) => {
- commit('TimelineSpace/Contents/Home/deleteToot', { statusId: id, accountId: account.id }, { root: true })
- commit('TimelineSpace/Contents/Notifications/deleteToot', { statusId: id, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`update-local-streamings-${account.id}`)
- win.ipcRenderer.on(`update-local-streamings-${account.id}`, (_, update: Entity.Status) => {
- commit('TimelineSpace/Contents/Local/appendTimeline', { status: update, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`delete-local-streamings-${account.id}`)
- win.ipcRenderer.on(`delete-local-streamings-${account.id}`, (_, id: string) => {
- commit('TimelineSpace/Contents/Local/deleteToot', { statusId: id, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`update-direct-streamings-${account.id}`)
- win.ipcRenderer.on(`update-direct-streamings-${account.id}`, (_, update: Entity.Status) => {
- commit('TimelineSpace/Contents/DirectMessages/appendTimeline', { status: update, accountId: account.id }, { root: true })
- })
- win.ipcRenderer.removeAllListeners(`delete-direct-streamings-${account.id}`)
- win.ipcRenderer.on(`delete-direct-streamings-${account.id}`, (_, id: string) => {
- commit('TimelineSpace/Contents/DirectMessages/deleteToot', { statusId: id, accountId: account.id }, { root: true })
- })
- })
- }
-}
-
-const GlobalHeader: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default GlobalHeader
diff --git a/src/renderer/store/Preferences.ts b/src/renderer/store/Preferences.ts
deleted file mode 100644
index 79347c54..00000000
--- a/src/renderer/store/Preferences.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import General, { GeneralState } from './Preferences/General'
-import Account, { AccountState } from './Preferences/Account'
-import Language, { LanguageState } from './Preferences/Language'
-import Appearance, { AppearanceState } from './Preferences/Appearance'
-import Notification, { NotificationState } from './Preferences/Notification'
-import Network, { NetworkState } from './Preferences/Network'
-import { Module } from 'vuex'
-import { RootState } from '@/store'
-
-export type PreferencesState = {}
-
-const state = (): PreferencesState => ({})
-
-type PreferencesModule = {
- General: GeneralState
- Account: AccountState
- Language: LanguageState
- Notification: NotificationState
- Appearance: AppearanceState
- Network: NetworkState
-}
-
-export type PreferencesModuleState = PreferencesState & PreferencesModule
-
-const Preferences: Module = {
- namespaced: true,
- modules: {
- General,
- Account,
- Language,
- Notification,
- Appearance,
- Network
- },
- state: state
-}
-
-export default Preferences
diff --git a/src/renderer/store/Preferences/Account.ts b/src/renderer/store/Preferences/Account.ts
deleted file mode 100644
index b8d3f659..00000000
--- a/src/renderer/store/Preferences/Account.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { LocalAccount } from '~/src/types/localAccount'
-import { RootState } from '@/store'
-import { MyWindow } from '~/src/types/global'
-import { LocalServer } from '~src/types/localServer'
-
-const win = (window as any) as MyWindow
-
-export type AccountState = {
- accounts: Array<[LocalAccount, LocalServer]>
- accountLoading: boolean
-}
-
-const state = (): AccountState => ({
- accounts: [],
- accountLoading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_ACCOUNTS: 'updateAccounts',
- UPDATE_ACCOUNT_LOADING: 'updateAccountLoading'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_ACCOUNTS]: (state, accounts: Array<[LocalAccount, LocalServer]>) => {
- state.accounts = accounts
- },
- [MUTATION_TYPES.UPDATE_ACCOUNT_LOADING]: (state, value: boolean) => {
- state.accountLoading = value
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_ACCOUNTS: 'loadAccounts',
- REMOVE_ACCOUNT: 'removeAccount',
- FORWARD_ACCOUNT: 'forwardAccount',
- BACKWARD_ACCOUNT: 'backwardAccount',
- REMOVE_ALL_ACCOUNTS: 'removeAllAccounts'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_ACCOUNTS]: async ({ commit }): Promise> => {
- const accounts: Array<[LocalAccount, LocalServer]> = await win.ipcRenderer.invoke('list-accounts')
- commit(MUTATION_TYPES.UPDATE_ACCOUNTS, accounts)
- return accounts
- },
- [ACTION_TYPES.REMOVE_ACCOUNT]: async (_, id: number) => {
- await win.ipcRenderer.invoke('remove-account', id)
- },
- [ACTION_TYPES.FORWARD_ACCOUNT]: async (_, id: number) => {
- await win.ipcRenderer.invoke('forward-account', id)
- },
- [ACTION_TYPES.BACKWARD_ACCOUNT]: async (_, id: number) => {
- await win.ipcRenderer.invoke('backward-account', id)
- },
- [ACTION_TYPES.REMOVE_ALL_ACCOUNTS]: async () => {
- await win.ipcRenderer.invoke('remove-all-accounts')
- }
-}
-
-const account: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default account
diff --git a/src/renderer/store/Preferences/Appearance.ts b/src/renderer/store/Preferences/Appearance.ts
deleted file mode 100644
index e909787b..00000000
--- a/src/renderer/store/Preferences/Appearance.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-import DisplayStyle from '~/src/constants/displayStyle'
-import Theme from '~/src/constants/theme'
-import TimeFormat from '~/src/constants/timeFormat'
-import { LightTheme, ThemeColorType } from '~/src/constants/themeColor'
-import DefaultFonts from '@/utils/fonts'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { toRaw } from 'vue'
-import { RootState } from '@/store'
-import { Appearance } from '~/src/types/appearance'
-import { BaseConfig } from '~/src/types/preference'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type AppearanceState = {
- appearance: Appearance
- fonts: Array
-}
-
-const state = (): AppearanceState => ({
- appearance: {
- theme: Theme.System.key,
- fontSize: 14,
- displayNameStyle: DisplayStyle.DisplayNameAndUsername.value,
- timeFormat: TimeFormat.Absolute.value,
- customThemeColor: LightTheme,
- font: DefaultFonts[0],
- tootPadding: 8
- },
- fonts: []
-})
-
-export const MUTATION_TYPES = {
- UPDATE_APPEARANCE: 'updateAppearance',
- UPDATE_FONTS: 'updateFonts'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_APPEARANCE]: (state, conf: Appearance) => {
- state.appearance = conf
- },
- [MUTATION_TYPES.UPDATE_FONTS]: (state, fonts: Array) => {
- state.fonts = Array.from(new Set(fonts))
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_APPEARANCE: 'loadAppearance',
- LOAD_FONTS: 'loadFonts',
- UPDATE_THEME: 'updateTheme',
- UPDATE_FONT_SIZE: 'updateFontSize',
- UPDATE_DISPLAY_NAME_STYLE: 'updateDisplayNameStyle',
- UPDATE_TIME_FORMAT: 'updateTimeFormat',
- UPDATE_CUSTOM_THEME_COLOR: 'updateCustomThemeColor',
- UPDATE_FONT: 'updateFont',
- UPDATE_TOOT_PADDING: 'updateTootPadding'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_APPEARANCE]: async ({ commit }) => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences')
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- return conf
- },
- [ACTION_TYPES.LOAD_FONTS]: async ({ commit }) => {
- const fonts: Array = await win.ipcRenderer.invoke('list-fonts')
- commit(MUTATION_TYPES.UPDATE_FONTS, [DefaultFonts[0]].concat(fonts))
- return fonts
- },
- [ACTION_TYPES.UPDATE_THEME]: async ({ dispatch, commit, state }, themeKey: string) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- theme: themeKey
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- dispatch('App/loadPreferences', null, { root: true })
- },
- [ACTION_TYPES.UPDATE_FONT_SIZE]: async ({ dispatch, commit, state }, fontSize: number) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- fontSize: fontSize
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- dispatch('App/loadPreferences', null, { root: true })
- },
- [ACTION_TYPES.UPDATE_DISPLAY_NAME_STYLE]: async ({ dispatch, commit, state }, value: number) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- displayNameStyle: value
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- dispatch('App/loadPreferences', null, { root: true })
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- },
- [ACTION_TYPES.UPDATE_TIME_FORMAT]: async ({ dispatch, commit, state }, value: number) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- timeFormat: value
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- dispatch('App/loadPreferences', null, { root: true })
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- },
- [ACTION_TYPES.UPDATE_CUSTOM_THEME_COLOR]: async ({ dispatch, state, commit }, value: object) => {
- const newCustom: ThemeColorType = Object.assign({}, toRaw(state.appearance.customThemeColor), value)
- const newAppearance: Appearance = Object.assign({}, state.appearance, {
- customThemeColor: newCustom
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- dispatch('App/loadPreferences', null, { root: true })
- },
- [ACTION_TYPES.UPDATE_FONT]: async ({ dispatch, state, commit }, value: string) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- font: value
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- dispatch('App/loadPreferences', null, { root: true })
- },
- [ACTION_TYPES.UPDATE_TOOT_PADDING]: async ({ dispatch, state, commit }, value: number) => {
- const newAppearance: Appearance = Object.assign({}, toRaw(state.appearance), {
- tootPadding: value
- })
- const config = {
- appearance: newAppearance
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_APPEARANCE, conf.appearance)
- dispatch('App/loadPreferences', null, { root: true })
- }
-}
-
-export default {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-} as Module
diff --git a/src/renderer/store/Preferences/General.ts b/src/renderer/store/Preferences/General.ts
deleted file mode 100644
index b6c6a19c..00000000
--- a/src/renderer/store/Preferences/General.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
-import { toRaw } from 'vue'
-import { RootState } from '@/store'
-import { Sound } from '~/src/types/sound'
-import { Timeline } from '~/src/types/timeline'
-import { BaseConfig, General, Other } from '~/src/types/preference'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type GeneralState = {
- general: General
- loading: boolean
-}
-
-const state = (): GeneralState => ({
- general: {
- sound: {
- fav_rb: true,
- toot: true
- },
- timeline: {
- cw: false,
- nsfw: false,
- hideAllAttachments: false
- },
- other: {
- launch: false,
- hideOnLaunch: false
- }
- },
- loading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_GENERAL: 'updateGeneral',
- CHANGE_LOADING: 'changeLoading'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_GENERAL]: (state, conf: General) => {
- state.general = conf
- },
- [MUTATION_TYPES.CHANGE_LOADING]: (state, value: boolean) => {
- state.loading = value
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_GENERAL: 'loadGeneral',
- UPDATE_SOUND: 'updateSound',
- UPDATE_TIMELINE: 'updateTimeline',
- UPDATE_OTHER: 'updateOther',
- RESET: 'reset'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_GENERAL]: async ({ commit }) => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences').finally(() => {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- })
- commit(MUTATION_TYPES.UPDATE_GENERAL, conf.general as General)
- return conf
- },
- [ACTION_TYPES.UPDATE_SOUND]: async ({ commit, state }, sound: object) => {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- const newSound: Sound = Object.assign({}, state.general.sound, sound)
- const newGeneral: General = Object.assign({}, toRaw(state.general), {
- sound: newSound
- })
- const config = {
- general: newGeneral
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config).finally(() => {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- })
- commit(MUTATION_TYPES.UPDATE_GENERAL, conf.general as General)
- },
- [ACTION_TYPES.UPDATE_TIMELINE]: async ({ commit, state, dispatch }, timeline: object) => {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- const newTimeline: Timeline = Object.assign({}, state.general.timeline, timeline)
- const newGeneral: General = Object.assign({}, toRaw(state.general), {
- timeline: newTimeline
- })
- const config = {
- general: newGeneral
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config).finally(() => {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- })
- commit(MUTATION_TYPES.UPDATE_GENERAL, conf.general as General)
- dispatch('App/loadPreferences', null, { root: true })
- },
- [ACTION_TYPES.UPDATE_OTHER]: async ({ commit, state, dispatch }, other: {}) => {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- const newOther: Other = Object.assign({}, state.general.other, other)
- const newGeneral: General = Object.assign({}, toRaw(state.general), {
- other: newOther
- })
- const config = {
- general: newGeneral
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config).finally(() => {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- })
- commit(MUTATION_TYPES.UPDATE_GENERAL, conf.general as General)
- dispatch('App/loadPreferences', null, { root: true })
- await win.ipcRenderer.invoke('change-auto-launch', newOther.launch)
- },
- [ACTION_TYPES.RESET]: async ({ commit, dispatch }): Promise => {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- try {
- const conf: BaseConfig = await win.ipcRenderer.invoke('reset-preferences')
- await dispatch('Preferences/Language/changeLanguage', conf.language.language, { root: true })
- await dispatch('App/loadPreferences', null, { root: true })
- commit(MUTATION_TYPES.UPDATE_GENERAL, conf.general as General)
- return conf.language.language
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- }
-}
-
-const getters: GetterTree = {
- notDarwin: () => {
- return win.platform !== 'darwin'
- }
-}
-
-export default {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions,
- getters: getters
-} as Module
diff --git a/src/renderer/store/Preferences/Language.ts b/src/renderer/store/Preferences/Language.ts
deleted file mode 100644
index 73daad7f..00000000
--- a/src/renderer/store/Preferences/Language.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import Language from '~/src/constants/language'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { Language as LanguageSet } from '~/src/types/language'
-import { BaseConfig } from '~/src/types/preference'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type LanguageState = {
- language: LanguageSet
-}
-
-const state: LanguageState = {
- language: {
- language: Language.en.key,
- spellchecker: {
- enabled: true,
- languages: [Language.en.key]
- }
- }
-}
-
-export const MUTATION_TYPES = {
- UPDATE_LANGUAGE: 'updateLanguage',
- CHANGE_LANGUAGE: 'changeLanguage',
- TOGGLE_SPELLCHECKER: 'toggleSpellchecker',
- UPDATE_SPELLCHECKER_LANGUAGES: 'updateSpellcheckerLanguages'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_LANGUAGE]: (state, conf: LanguageSet) => {
- state.language = conf
- },
- [MUTATION_TYPES.CHANGE_LANGUAGE]: (state, key: string) => {
- state.language.language = key
- },
- [MUTATION_TYPES.TOGGLE_SPELLCHECKER]: (state, enabled: boolean) => {
- state.language.spellchecker.enabled = enabled
- },
- [MUTATION_TYPES.UPDATE_SPELLCHECKER_LANGUAGES]: (state, languages: Array) => {
- state.language.spellchecker.languages = languages
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_LANGUAGE: 'loadLanguage',
- CHANGE_LANGUAGE: 'changeLanguage',
- TOGGLE_SPELLCHECKER: 'toggleSpellchecker',
- UPDATE_SPELLCHECKER_LANGUAGES: 'updateSpellcheckerLanguages'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_LANGUAGE]: async ({ commit }): Promise => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences')
- commit(MUTATION_TYPES.UPDATE_LANGUAGE, conf.language as LanguageSet)
- return conf.language.language
- },
- [ACTION_TYPES.CHANGE_LANGUAGE]: async ({ commit }, key: string): Promise => {
- const value: string = await win.ipcRenderer.invoke('change-language', key)
- commit(MUTATION_TYPES.CHANGE_LANGUAGE, value)
- return value
- },
- [ACTION_TYPES.TOGGLE_SPELLCHECKER]: async ({ commit }, enabled: boolean) => {
- const value: boolean = await win.ipcRenderer.invoke('toggle-spellchecker', enabled)
- commit(MUTATION_TYPES.TOGGLE_SPELLCHECKER, value)
- return value
- },
- [ACTION_TYPES.UPDATE_SPELLCHECKER_LANGUAGES]: async ({ commit }, languages: Array) => {
- const langs: Array = await win.ipcRenderer.invoke('update-spellchecker-languages', languages)
- commit(MUTATION_TYPES.UPDATE_SPELLCHECKER_LANGUAGES, langs)
- return langs
- }
-}
-
-export default {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-} as Module
diff --git a/src/renderer/store/Preferences/Network.ts b/src/renderer/store/Preferences/Network.ts
deleted file mode 100644
index 430ea67f..00000000
--- a/src/renderer/store/Preferences/Network.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
-import { toRaw } from 'vue'
-import { RootState } from '@/store'
-import { BaseConfig } from '~/src/types/preference'
-import { Proxy, ProxySource, ProxyProtocol, ManualProxy } from '~/src/types/proxy'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type NetworkState = {
- source: ProxySource
- proxy: ManualProxy
-}
-
-const state = (): NetworkState => {
- return {
- source: ProxySource.system,
- proxy: {
- protocol: '',
- host: '',
- port: '',
- username: '',
- password: ''
- }
- }
-}
-
-export const MUTATION_TYPES = {
- UPDATE_PROXY: 'updateProxy',
- CHANGE_SOURCE: 'changeSource',
- UPDATE_PROTOCOL: 'updateProtocol',
- UPDATE_HOST: 'updateHost',
- UPDATE_PORT: 'updatePort',
- UPDATE_USERNAME: 'updateUsername',
- UPDATE_PASSWORD: 'updatePassword'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_PROXY]: (state, config: Proxy) => {
- state.source = config.source
- state.proxy = config.manualProxyConfig
- },
- [MUTATION_TYPES.CHANGE_SOURCE]: (state, source: 'no' | 'system' | 'manual') => {
- switch (source) {
- case 'no':
- state.source = ProxySource.no
- break
- case 'system':
- state.source = ProxySource.system
- break
- case 'manual':
- state.source = ProxySource.manual
- break
- }
- },
- [MUTATION_TYPES.UPDATE_PROTOCOL]: (state, protocol: '' | 'http' | 'https' | 'socks4' | 'socks4a' | 'socks5' | 'socks5h') => {
- switch (protocol) {
- case 'http':
- state.proxy.protocol = ProxyProtocol.http
- break
- case 'https':
- state.proxy.protocol = ProxyProtocol.https
- break
- case 'socks4':
- state.proxy.protocol = ProxyProtocol.socks4
- break
- case 'socks4a':
- state.proxy.protocol = ProxyProtocol.socks4a
- break
- case 'socks5':
- state.proxy.protocol = ProxyProtocol.socks5
- break
- case 'socks5h':
- state.proxy.protocol = ProxyProtocol.socks5h
- break
- default:
- state.proxy.protocol = ''
- break
- }
- },
- [MUTATION_TYPES.UPDATE_HOST]: (state, host: string) => {
- state.proxy.host = host
- },
- [MUTATION_TYPES.UPDATE_PORT]: (state, port: string) => {
- state.proxy.port = port
- },
- [MUTATION_TYPES.UPDATE_USERNAME]: (state, username: string) => {
- state.proxy.username = username
- },
- [MUTATION_TYPES.UPDATE_PASSWORD]: (state, password: string) => {
- state.proxy.password = password
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_PROXY: 'loadProxy',
- CHANGE_SOURCE: 'changeSource',
- UPDATE_PROTOCOL: 'updateProtocol',
- UPDATE_HOST: 'updateHost',
- UPDATE_PORT: 'updatePort',
- UPDATE_USERNAME: 'updateUsername',
- UPDATE_PASSWORD: 'updatePassword',
- SAVE_PROXY_CONFIG: 'saveProxyConfig'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_PROXY]: async ({ commit }) => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences')
- commit(MUTATION_TYPES.UPDATE_PROXY, conf.proxy as Proxy)
- return conf
- },
- [ACTION_TYPES.CHANGE_SOURCE]: ({ commit }, source: string) => {
- commit(MUTATION_TYPES.CHANGE_SOURCE, source)
- },
- [ACTION_TYPES.UPDATE_PROTOCOL]: ({ commit }, protocol: string) => {
- commit(MUTATION_TYPES.UPDATE_PROTOCOL, protocol)
- },
- [ACTION_TYPES.UPDATE_HOST]: ({ commit }, host: string) => {
- commit(MUTATION_TYPES.UPDATE_HOST, host)
- },
- [ACTION_TYPES.UPDATE_PORT]: ({ commit }, port: string) => {
- commit(MUTATION_TYPES.UPDATE_PORT, port)
- },
- [ACTION_TYPES.UPDATE_USERNAME]: ({ commit }, username: string) => {
- commit(MUTATION_TYPES.UPDATE_USERNAME, username)
- },
- [ACTION_TYPES.UPDATE_PASSWORD]: ({ commit }, password: string) => {
- commit(MUTATION_TYPES.UPDATE_PASSWORD, password)
- },
- [ACTION_TYPES.SAVE_PROXY_CONFIG]: async ({ state }) => {
- const proxy: Proxy = {
- source: toRaw(state.source),
- manualProxyConfig: toRaw(state.proxy)
- }
- // Originally we have to restart all streamings after user change proxy configuration.
- // But streamings are restart after close preferences.
- // So we don't have to restart streaming here.
- // And we have to update webContents session, but it is care in main process.
- await win.ipcRenderer.invoke('update-proxy-config', proxy)
- }
-}
-
-const getters: GetterTree = {
- manualProxyConfiguration: state => {
- return state.source === 'manual'
- }
-}
-
-export default {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions,
- getters: getters
-} as Module
diff --git a/src/renderer/store/Preferences/Notification.ts b/src/renderer/store/Preferences/Notification.ts
deleted file mode 100644
index 8b9e5b25..00000000
--- a/src/renderer/store/Preferences/Notification.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { Notify } from '~/src/types/notify'
-import { BaseConfig, Notification } from '~/src/types/preference'
-import { MyWindow } from '~/src/types/global'
-
-const win = window as any as MyWindow
-
-export type NotificationState = {
- notification: Notification
-}
-
-const state: NotificationState = {
- notification: {
- notify: {
- reply: true,
- reblog: true,
- favourite: true,
- follow: true,
- follow_request: true,
- reaction: true,
- status: true,
- poll_vote: true,
- poll_expired: true
- }
- }
-}
-
-export const MUTATION_TYPES = {
- UPDATE_NOTIFICATION: 'updateNotification'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_NOTIFICATION]: (state, notification: Notification) => {
- state.notification = notification
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_NOTIFICATION: 'loadNotification',
- UPDATE_NOTIFY: 'updateNotify'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_NOTIFICATION]: async ({ commit }) => {
- const conf: BaseConfig = await win.ipcRenderer.invoke('get-preferences')
- commit(MUTATION_TYPES.UPDATE_NOTIFICATION, conf.notification)
- return conf
- },
- [ACTION_TYPES.UPDATE_NOTIFY]: async ({ commit, state, dispatch }, notify: object) => {
- const newNotify: Notify = Object.assign({}, state.notification.notify, notify)
- const newNotification: Notification = Object.assign({}, state.notification, {
- notify: newNotify
- })
- const config = {
- notification: newNotification
- }
- const conf: BaseConfig = await win.ipcRenderer.invoke('update-preferences', config)
- commit(MUTATION_TYPES.UPDATE_NOTIFICATION, conf.notification)
- dispatch('App/loadPreferences', null, { root: true })
- }
-}
-
-export default {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-} as Module
diff --git a/src/renderer/store/Settings.ts b/src/renderer/store/Settings.ts
deleted file mode 100644
index 9ddcd37a..00000000
--- a/src/renderer/store/Settings.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import General, { GeneralState } from './Settings/General'
-import Timeline, { TimelineState } from './Settings/Timeline'
-import Filters, { FiltersModuleState } from './Settings/Filters'
-import { Module, MutationTree } from 'vuex'
-import { RootState } from '@/store'
-
-export type SettingsState = {
- accountId: number | null
-}
-
-const state = (): SettingsState => ({
- accountId: null
-})
-
-export const MUTATION_TYPES = {
- CHANGE_ACCOUNT_ID: 'changeAccountId'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.CHANGE_ACCOUNT_ID]: (state, id: number) => {
- state.accountId = id
- }
-}
-
-type SettingsModule = {
- General: GeneralState
- Timeline: TimelineState
- Filters: FiltersModuleState
-}
-
-export type SettingsModuleState = SettingsModule & SettingsState
-
-const Settings: Module = {
- namespaced: true,
- modules: {
- General,
- Timeline,
- Filters
- },
- state: state,
- mutations: mutations
-}
-
-export default Settings
diff --git a/src/renderer/store/Settings/Filters.ts b/src/renderer/store/Settings/Filters.ts
deleted file mode 100644
index ab9f3462..00000000
--- a/src/renderer/store/Settings/Filters.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { Module, MutationTree, ActionTree } from 'vuex'
-import generator, { Entity } from 'megalodon'
-import { RootState } from '@/store'
-import EditFilters, { EditFiltersState } from './Filters/Edit'
-import NewFilters, { NewFiltersState } from './Filters/New'
-
-export type FiltersState = {
- filters: Array
- filtersLoading: boolean
-}
-
-const state = (): FiltersState => ({
- filters: [],
- filtersLoading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_FILTERS: 'updateFilters',
- CHANGE_LOADING: 'changeLoading'
-}
-
-export const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_FILTERS]: (state, filters: Array) => {
- state.filters = filters
- },
- [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
- state.filtersLoading = loading
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_FILTERS: 'fetchFilters',
- DELETE_FILTER: 'deleteFilter'
-}
-
-export const actions: ActionTree = {
- [ACTION_TYPES.FETCH_FILTERS]: async ({ commit, rootState }): Promise> => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- try {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- const res = await client.getFilters()
- commit(MUTATION_TYPES.UPDATE_FILTERS, res.data)
- return res.data
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- },
- [ACTION_TYPES.DELETE_FILTER]: async ({ commit, dispatch, rootState }, id: string) => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- try {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- await client.deleteFilter(id)
- await dispatch('fetchFilters')
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- }
-}
-
-type FiltersModule = {
- Edit: EditFiltersState
- New: NewFiltersState
-}
-
-export type FiltersModuleState = FiltersModule & FiltersState
-
-const Filters: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions,
- modules: {
- Edit: EditFilters,
- New: NewFilters
- }
-}
-
-export default Filters
diff --git a/src/renderer/store/Settings/Filters/Edit.ts b/src/renderer/store/Settings/Filters/Edit.ts
deleted file mode 100644
index 60485043..00000000
--- a/src/renderer/store/Settings/Filters/Edit.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-
-export type EditFiltersState = {
- filter: Entity.Filter
- loading: boolean
-}
-
-const state = (): EditFiltersState => ({
- filter: {
- id: '',
- phrase: '',
- expires_at: null,
- context: [],
- irreversible: false,
- whole_word: true
- } as Entity.Filter,
- loading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_FILTER: 'updateFilter',
- CHANGE_LOADING: 'changeLoading'
-}
-
-export const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_FILTER]: (state, filter: Entity.Filter) => {
- state.filter = filter
- },
- [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
- state.loading = loading
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_FILTER: 'fetchFilter',
- EDIT_FILTER: 'editFilter',
- UPDATE_FILTER: 'updateFilter'
-}
-
-export const actions: ActionTree = {
- fetchFilter: async ({ commit, rootState }, id: string): Promise => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- try {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- const res = await client.getFilter(id)
- commit(MUTATION_TYPES.UPDATE_FILTER, res.data)
- return res.data
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- },
- editFilter: ({ commit, state }, filter: any) => {
- const newFilter = Object.assign({}, state.filter, filter)
- commit(MUTATION_TYPES.UPDATE_FILTER, newFilter)
- },
- updateFilter: async ({ commit, state, rootState }): Promise => {
- if (state.filter === null) {
- throw new Error('filter is not set')
- }
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- try {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- let options = {
- irreversible: state.filter.irreversible,
- whole_word: state.filter.whole_word
- }
- if (state.filter.expires_at !== null) {
- options = Object.assign({}, options, {
- expires_in: state.filter.expires_at
- })
- }
- const res = await client.updateFilter(state.filter.id, state.filter.phrase, state.filter.context, options)
- return res.data
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- }
-}
-
-const EditFilters: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default EditFilters
diff --git a/src/renderer/store/Settings/Filters/New.ts b/src/renderer/store/Settings/Filters/New.ts
deleted file mode 100644
index ec2f5908..00000000
--- a/src/renderer/store/Settings/Filters/New.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-
-export type NewFiltersState = {
- filter: Entity.Filter
- loading: boolean
-}
-
-const defaultFilter: Entity.Filter = {
- id: '',
- phrase: '',
- expires_at: null,
- context: [],
- irreversible: false,
- whole_word: true
-}
-
-const state = (): NewFiltersState => ({
- filter: defaultFilter,
- loading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_FILTER: 'updateFilter',
- CHANGE_LOADING: 'changeLoading'
-}
-
-export const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_FILTER]: (state, filter: Entity.Filter) => {
- state.filter = filter
- },
- [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
- state.loading = loading
- }
-}
-
-export const ACTION_TYPES = {
- EDIT_FILTER: 'editFilter',
- RESET_FILTER: 'resetFilter',
- CREATE_FILTER: 'createFilter'
-}
-
-export const actions: ActionTree = {
- [ACTION_TYPES.EDIT_FILTER]: ({ commit, state }, filter: any) => {
- const newFilter = Object.assign({}, state.filter, filter)
- commit(MUTATION_TYPES.UPDATE_FILTER, newFilter)
- },
- [ACTION_TYPES.RESET_FILTER]: ({ commit }) => {
- commit(MUTATION_TYPES.UPDATE_FILTER, defaultFilter)
- },
- [ACTION_TYPES.CREATE_FILTER]: async ({ commit, state, dispatch, rootState }): Promise => {
- if (state.filter === null) {
- throw new Error('filter is not set')
- }
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- try {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- let options = {
- irreversible: state.filter.irreversible,
- whole_word: state.filter.whole_word
- }
- if (state.filter.expires_at !== null) {
- options = Object.assign({}, options, {
- expires_in: state.filter.expires_at
- })
- }
- const res = await client.createFilter(state.filter.phrase, state.filter.context, options)
- dispatch('resetFilter')
- return res.data
- } finally {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- }
- }
-}
-
-const NewFilters: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default NewFilters
diff --git a/src/renderer/store/Settings/General.ts b/src/renderer/store/Settings/General.ts
deleted file mode 100644
index 8f1bfe87..00000000
--- a/src/renderer/store/Settings/General.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import Visibility, { VisibilityType } from '~/src/constants/visibility'
-import { RootState } from '@/store'
-
-export type GeneralState = {
- visibility: number
- sensitive: boolean
-}
-
-const state = (): GeneralState => ({
- visibility: Visibility.Public.value,
- sensitive: false
-})
-
-export const MUTATION_TYPES = {
- CHANGE_VISIBILITY: 'changeVisibility',
- CHANGE_SENSITIVE: 'changeSensitive'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.CHANGE_VISIBILITY]: (state, value: number) => {
- state.visibility = value
- },
- [MUTATION_TYPES.CHANGE_SENSITIVE]: (state, value: boolean) => {
- state.sensitive = value
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_SETTINGS: 'fetchSettings',
- SET_VISIBILITY: 'setVisibility',
- SET_SENSITIVE: 'setSensitive'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.FETCH_SETTINGS]: async ({ commit, rootState }): Promise => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- const res = await client.verifyAccountCredentials()
- const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array).find(v => {
- return v.key === res.data.source!.privacy
- })
- commit(MUTATION_TYPES.CHANGE_VISIBILITY, visibility!.value)
- commit(MUTATION_TYPES.CHANGE_SENSITIVE, res.data.source!.sensitive)
- return res.data
- },
- [ACTION_TYPES.SET_VISIBILITY]: async ({ commit, rootState }, value: number) => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- const visibility: VisibilityType | undefined = (Object.values(Visibility) as Array).find(v => {
- return v.value === value
- })
- const res = await client.updateCredentials({ source: { privacy: visibility!.key } })
- commit(MUTATION_TYPES.CHANGE_VISIBILITY, visibility!.value)
- return res.data
- },
- [ACTION_TYPES.SET_SENSITIVE]: async ({ commit, rootState }, value: boolean) => {
- const client = generator(
- rootState.TimelineSpace.server!.sns,
- rootState.TimelineSpace.server!.baseURL,
- rootState.TimelineSpace.account!.accessToken,
- rootState.App.userAgent
- )
- const res = await client.updateCredentials({ source: { sensitive: value } })
- commit(MUTATION_TYPES.CHANGE_SENSITIVE, value)
- return res.data
- }
-}
-
-const General: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default General
diff --git a/src/renderer/store/Settings/Timeline.ts b/src/renderer/store/Settings/Timeline.ts
deleted file mode 100644
index 7ab5d0c5..00000000
--- a/src/renderer/store/Settings/Timeline.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { MyWindow } from '~/src/types/global'
-import { Setting } from '~src/types/setting'
-import { DefaultSetting } from '~/src/constants/initializer/setting'
-
-const win = (window as any) as MyWindow
-
-export type TimelineState = {
- setting: Setting
-}
-
-const state = (): TimelineState => ({
- setting: DefaultSetting
-})
-
-export const MUTATION_TYPES = {
- UPDATE_TIMELINE_SETTING: 'updateTimelineSetting'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_TIMELINE_SETTING]: (state, setting: Setting) => {
- state.setting = setting
- }
-}
-
-export const ACTION_TYPES = {
- LOAD_TIMELINE_SETTING: 'loadTimelineSetting',
- CHANGE_UNREAD_NOTIFICATION: 'changeUnreadNotification',
- CHANGE_USER_MARKER: 'changeUserMarker'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.LOAD_TIMELINE_SETTING]: async ({ commit, rootState }): Promise => {
- const setting: Setting = await win.ipcRenderer.invoke('get-account-setting', rootState.Settings.accountId)
- commit(MUTATION_TYPES.UPDATE_TIMELINE_SETTING, setting)
- return true
- },
- [ACTION_TYPES.CHANGE_USER_MARKER]: async ({ dispatch, state, rootState }, timeline: { key: boolean }) => {
- const setting: Setting = Object.assign({}, state.setting, timeline)
- setting.accountId = rootState.Settings.accountId!
- console.log(setting)
- await win.ipcRenderer.invoke('update-account-setting', setting)
- dispatch(ACTION_TYPES.LOAD_TIMELINE_SETTING)
- return true
- }
-}
-
-const Timeline: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default Timeline
diff --git a/src/renderer/store/TimelineSpace.ts b/src/renderer/store/TimelineSpace.ts
deleted file mode 100644
index 3ab9c303..00000000
--- a/src/renderer/store/TimelineSpace.ts
+++ /dev/null
@@ -1,218 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import SideMenu, { SideMenuState } from './TimelineSpace/SideMenu'
-import HeaderMenu, { HeaderMenuState } from './TimelineSpace/HeaderMenu'
-import Modals, { ModalsModuleState } from './TimelineSpace/Modals'
-import Contents, { ContentsModuleState } from './TimelineSpace/Contents'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { LocalAccount } from '~/src/types/localAccount'
-import { RootState } from '@/store'
-import { AccountLoadError } from '@/errors/load'
-import { MyWindow } from '~/src/types/global'
-import { LocalServer } from '~/src/types/localServer'
-import { Setting } from '~/src/types/setting'
-import { DefaultSetting } from '~/src/constants/initializer/setting'
-import Compose, { ComposeState } from './TimelineSpace/Compose'
-
-const win = (window as any) as MyWindow
-
-export type TimelineSpaceState = {
- account: LocalAccount | null
- server: LocalServer | null
- loading: boolean
- emojis: Array
- tootMax: number
- filters: Array
- setting: Setting
-}
-
-const state = (): TimelineSpaceState => ({
- account: null,
- server: null,
- loading: false,
- emojis: [],
- tootMax: 500,
- filters: [],
- setting: DefaultSetting
-})
-
-export const MUTATION_TYPES = {
- UPDATE_ACCOUNT: 'updateAccount',
- UPDATE_SERVER: 'updateServer',
- CHANGE_LOADING: 'changeLoading',
- UPDATE_EMOJIS: 'updateEmojis',
- UPDATE_TOOT_MAX: 'updateTootMax',
- UPDATE_FILTERS: 'updateFilters',
- UPDATE_SETTING: 'updateSetting'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.UPDATE_ACCOUNT]: (state, account: LocalAccount) => {
- state.account = account
- },
- [MUTATION_TYPES.UPDATE_SERVER]: (state, server: LocalServer) => {
- state.server = server
- },
- [MUTATION_TYPES.CHANGE_LOADING]: (state, value: boolean) => {
- state.loading = value
- },
- [MUTATION_TYPES.UPDATE_EMOJIS]: (state, emojis: Array) => {
- state.emojis = emojis
- },
- [MUTATION_TYPES.UPDATE_TOOT_MAX]: (state, value: number | null) => {
- if (value) {
- state.tootMax = value
- } else {
- state.tootMax = 500
- }
- },
- [MUTATION_TYPES.UPDATE_FILTERS]: (state, filters: Array) => {
- state.filters = filters
- },
- [MUTATION_TYPES.UPDATE_SETTING]: (state, setting: Setting) => {
- state.setting = setting
- }
-}
-
-export const ACTION_TYPES = {
- INIT_LOAD: 'initLoad',
- PREPARE_SPACE: 'prepareSpace',
- LOCAL_ACCOUNT: 'localAccount',
- CLEAR_ACCOUNT: 'clearAccount',
- WATCH_SHORTCUT_EVENTS: 'watchShortcutEvents',
- REMOVE_SHORTCUT_EVENTS: 'removeShortcutEvents',
- CLEAR_UNREAD: 'clearUnread',
- FETCH_EMOJIS: 'fetchEmojis',
- FETCH_FILTERS: 'fetchFilters',
- FETCH_INSTANCE: 'fetchInstance',
- LOAD_SETTING: 'loadSetting'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.INIT_LOAD]: async ({ dispatch, commit }, accountId: string): Promise<[LocalAccount, LocalServer]> => {
- commit(MUTATION_TYPES.CHANGE_LOADING, true)
- dispatch(ACTION_TYPES.WATCH_SHORTCUT_EVENTS)
- const account: [LocalAccount, LocalServer] = await dispatch(ACTION_TYPES.LOCAL_ACCOUNT, accountId).catch(_ => {
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- throw new AccountLoadError()
- })
-
- await dispatch(ACTION_TYPES.LOAD_SETTING)
- await dispatch(ACTION_TYPES.FETCH_FILTERS)
- commit(MUTATION_TYPES.CHANGE_LOADING, false)
- return account
- },
- [ACTION_TYPES.PREPARE_SPACE]: async ({ dispatch }) => {
- await dispatch(ACTION_TYPES.FETCH_EMOJIS)
- await dispatch(ACTION_TYPES.FETCH_INSTANCE)
- },
- // -------------------------------------------------
- // Accounts
- // -------------------------------------------------
- [ACTION_TYPES.LOCAL_ACCOUNT]: async ({ commit }, id: number): Promise<[LocalAccount, LocalServer]> => {
- const account: [LocalAccount, LocalServer] = await win.ipcRenderer.invoke('get-local-account', id)
- commit(MUTATION_TYPES.UPDATE_ACCOUNT, account[0])
- commit(MUTATION_TYPES.UPDATE_SERVER, account[1])
- return account
- },
- [ACTION_TYPES.CLEAR_ACCOUNT]: async ({ commit }) => {
- commit(MUTATION_TYPES.UPDATE_ACCOUNT, null)
- return true
- },
- // -----------------------------------------------
- // Shortcuts
- // -----------------------------------------------
- [ACTION_TYPES.WATCH_SHORTCUT_EVENTS]: ({ commit, rootGetters }) => {
- win.ipcRenderer.on('CmdOrCtrl+K', () => {
- commit('TimelineSpace/Modals/Jump/changeModal', true, { root: true })
- })
- win.ipcRenderer.on('open-shortcuts-list', () => {
- const modalOpened = rootGetters['TimelineSpace/Modals/modalOpened']
- if (!modalOpened) {
- commit('TimelineSpace/Modals/Shortcut/changeModal', true, { root: true })
- }
- })
- },
- [ACTION_TYPES.REMOVE_SHORTCUT_EVENTS]: async () => {
- win.ipcRenderer.removeAllListeners('CmdOrCtrl+N')
- win.ipcRenderer.removeAllListeners('CmdOrCtrl+K')
- return true
- },
- /**
- * clearUnread
- */
- [ACTION_TYPES.CLEAR_UNREAD]: async ({ dispatch }) => {
- dispatch('TimelineSpace/SideMenu/clearUnread', {}, { root: true })
- },
- /**
- * fetchEmojis
- */
- [ACTION_TYPES.FETCH_EMOJIS]: async ({ commit, state, rootState }): Promise> => {
- if (!state.server) {
- return []
- }
- const client = generator(state.server.sns, state.server.baseURL, null, rootState.App.userAgent)
- const res = await client.getInstanceCustomEmojis()
- commit(MUTATION_TYPES.UPDATE_EMOJIS, res.data)
- return res.data
- },
- [ACTION_TYPES.LOAD_SETTING]: async ({ commit, state }) => {
- const setting: Setting = await win.ipcRenderer.invoke('get-account-setting', state.account!.id)
- commit(MUTATION_TYPES.UPDATE_SETTING, setting)
- },
- /**
- * fetchFilters
- */
- [ACTION_TYPES.FETCH_FILTERS]: async ({ commit, state, rootState }): Promise> => {
- if (!state.server || !state.account) {
- return []
- }
- try {
- const client = generator(state.server.sns, state.server.baseURL, state.account.accessToken, rootState.App.userAgent)
- const res = await client.getFilters()
- commit(MUTATION_TYPES.UPDATE_FILTERS, res.data)
- return res.data
- } catch {
- return []
- }
- },
- /**
- * fetchInstance
- */
- [ACTION_TYPES.FETCH_INSTANCE]: async ({ commit, state, rootState }) => {
- if (!state.server) {
- return false
- }
- const client = generator(state.server.sns, state.server.baseURL, null, rootState.App.userAgent)
- const res = await client.getInstance()
- if (res.data.configuration) {
- commit(MUTATION_TYPES.UPDATE_TOOT_MAX, res.data.configuration.statuses.max_characters)
- }
- return true
- }
-}
-
-type TimelineSpaceModule = {
- SideMenu: SideMenuState
- HeaderMenu: HeaderMenuState
- Modals: ModalsModuleState
- Contents: ContentsModuleState
- Compose: ComposeState
-}
-
-export type TimelineSpaceModuleState = TimelineSpaceModule & TimelineSpaceState
-
-const TimelineSpace: Module = {
- namespaced: true,
- modules: {
- SideMenu,
- HeaderMenu,
- Modals,
- Contents,
- Compose
- },
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default TimelineSpace
diff --git a/src/renderer/store/TimelineSpace/Compose.ts b/src/renderer/store/TimelineSpace/Compose.ts
deleted file mode 100644
index 2efcfa9b..00000000
--- a/src/renderer/store/TimelineSpace/Compose.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Module, MutationTree } from 'vuex'
-import { RootState } from '@/store'
-import { Entity } from 'megalodon'
-
-export type ComposeState = {
- inReplyTo: Entity.Status | null
- quoteTo: Entity.Status | null
-}
-
-const state = (): ComposeState => ({
- inReplyTo: null,
- quoteTo: null
-})
-
-export const MUTATION_TYPES = {
- SET_REPLY_TO_ID: 'setReplyToId',
- CLEAR_REPLY_TO_ID: 'clearReplyToId',
- SET_QUOTE_TO: 'setQuoteTo',
- CLEAR_QUOTE_TO: 'clearQuoteTo'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.SET_REPLY_TO_ID]: (state, inReplyTo: Entity.Status) => {
- state.inReplyTo = inReplyTo
- },
- [MUTATION_TYPES.CLEAR_REPLY_TO_ID]: state => {
- state.inReplyTo = null
- },
- [MUTATION_TYPES.SET_QUOTE_TO]: (state, quoteTo: Entity.Status) => {
- state.quoteTo = quoteTo
- },
- [MUTATION_TYPES.CLEAR_QUOTE_TO]: state => {
- state.quoteTo = null
- }
-}
-
-const Compose: Module = {
- namespaced: true,
- state: state,
- mutations: mutations
-}
-
-export default Compose
diff --git a/src/renderer/store/TimelineSpace/Contents.ts b/src/renderer/store/TimelineSpace/Contents.ts
deleted file mode 100644
index 7263f6f1..00000000
--- a/src/renderer/store/TimelineSpace/Contents.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import Home, { HomeState } from './Contents/Home'
-import Notifications, { NotificationsState } from './Contents/Notifications'
-import Local, { LocalState } from './Contents/Local'
-import DirectMessages, { DirectMessagesState } from './Contents/DirectMessages'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-
-export type ContentsState = {
- loading: boolean
-}
-
-type ContentsModule = {
- Home: HomeState
- Notifications: NotificationsState
- DirectMessages: DirectMessagesState
- Local: LocalState
-}
-
-export type ContentsModuleState = ContentsModule & ContentsState
-
-const state = (): ContentsState => ({
- loading: false
-})
-
-export const MUTATION_TYPES = {
- CHANGE_LOADING: 'changeLoading'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.CHANGE_LOADING]: (state, loading: boolean) => {
- state.loading = loading
- }
-}
-
-export const ACTION_TYPES = {
- CHANGE_LOADING: 'changeLoading'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.CHANGE_LOADING]: ({ commit }, loading) => {
- commit(MUTATION_TYPES.CHANGE_LOADING, loading)
- }
-}
-
-const Contents: Module = {
- namespaced: true,
- state: state,
- modules: {
- Home,
- Notifications,
- Local,
- DirectMessages
- },
- mutations: mutations,
- actions: actions
-}
-
-export default Contents
diff --git a/src/renderer/store/TimelineSpace/Contents/DirectMessages.ts b/src/renderer/store/TimelineSpace/Contents/DirectMessages.ts
deleted file mode 100644
index fe9f1be1..00000000
--- a/src/renderer/store/TimelineSpace/Contents/DirectMessages.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { LocalAccount } from '~/src/types/localAccount'
-import { LocalServer } from '~/src/types/localServer'
-
-export type DirectMessagesState = {
- timeline: { [key: number]: Array }
-}
-
-const state = (): DirectMessagesState => ({
- timeline: {}
-})
-
-export const MUTATION_TYPES = {
- APPEND_TIMELINE: 'appendTimeline',
- REPLACE_TIMELINE: 'replaceTimeline',
- INSERT_TIMELINE: 'insertTimeline',
- UPDATE_TOOT: 'updateToot',
- DELETE_TOOT: 'deleteToot'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.APPEND_TIMELINE]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [obj.status, ...state.timeline[obj.accountId]]
- } else {
- state.timeline[obj.accountId] = [obj.status]
- }
- },
- [MUTATION_TYPES.REPLACE_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- state.timeline[obj.accountId] = obj.statuses
- },
- [MUTATION_TYPES.INSERT_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [...state.timeline[obj.accountId], ...obj.statuses]
- } else {
- state.timeline[obj.accountId] = obj.statuses
- }
- },
- [MUTATION_TYPES.UPDATE_TOOT]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- // Replace target message in DirectMessagesTimeline and notifications
- state.timeline[obj.accountId] = state.timeline[obj.accountId].map(toot => {
- if (toot.id === obj.status.id) {
- return obj.status
- } else if (toot.reblog !== null && toot.reblog.id === obj.status.id) {
- // When user reblog/favourite a reblogged toot, target message is a original toot.
- // So, a message which is received now is original toot.
- const reblog = {
- reblog: obj.status
- }
- return Object.assign(toot, reblog)
- } else {
- return toot
- }
- })
- },
- [MUTATION_TYPES.DELETE_TOOT]: (state, obj: { statusId: string; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- state.timeline[obj.accountId] = state.timeline[obj.accountId].filter(toot => {
- if (toot.reblog !== null && toot.reblog.id === obj.statusId) {
- return false
- } else {
- return toot.id !== obj.statusId
- }
- })
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_TIMELINE: 'fetchTimeline',
- LAZY_FETCH_TIMELINE: 'lazyFetchTimeline'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.FETCH_TIMELINE]: async (
- { commit, rootState },
- req: { account: LocalAccount; server: LocalServer }
- ): Promise> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- try {
- const res = await client.getConversationTimeline({ limit: 20 })
- const statuses: Array = res.data.map(con => con.last_status!)
- commit(MUTATION_TYPES.REPLACE_TIMELINE, { statuses, accountId: req.account.id }) // eslint-disable-line @typescript-eslint/no-non-null-assertion
- return statuses
- } catch (err) {
- console.error(err)
- return []
- }
- },
- [ACTION_TYPES.LAZY_FETCH_TIMELINE]: async (
- { commit, rootState },
- req: { lastStatus: Entity.Status; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- return client.getConversationTimeline({ max_id: req.lastStatus.id, limit: 20 }).then(res => {
- const statuses: Array = res.data.map(con => con.last_status!) // eslint-disable-line @typescript-eslint/no-non-null-assertion
- commit(MUTATION_TYPES.INSERT_TIMELINE, { statuses, accountId: req.account.id })
- return statuses
- })
- }
-}
-
-const DirectMessages: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default DirectMessages
diff --git a/src/renderer/store/TimelineSpace/Contents/Home.ts b/src/renderer/store/TimelineSpace/Contents/Home.ts
deleted file mode 100644
index 041f72ed..00000000
--- a/src/renderer/store/TimelineSpace/Contents/Home.ts
+++ /dev/null
@@ -1,245 +0,0 @@
-import generator, { Entity, FilterContext } from 'megalodon'
-import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
-import { RootState } from '@/store'
-import { LoadingCard } from '@/types/loading-card'
-import { LocalServer } from '~/src/types/localServer'
-import { LocalAccount } from '~/src/types/localAccount'
-
-export type HomeState = {
- timeline: { [key: number]: Array }
-}
-
-const state = (): HomeState => ({
- timeline: {}
-})
-
-export const MUTATION_TYPES = {
- APPEND_TIMELINE: 'appendTimeline',
- REPLACE_TIMELINE: 'replaceTimeline',
- INSERT_TIMELINE: 'insertTimeline',
- UPDATE_TOOT: 'updateToot',
- DELETE_TOOT: 'deleteToot',
- APPEND_TIMELINE_AFTER_LOADING_CARD: 'appendTimelineAfterLoadingCard'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.APPEND_TIMELINE]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [obj.status, ...state.timeline[obj.accountId]]
- } else {
- state.timeline[obj.accountId] = [obj.status]
- }
- },
- [MUTATION_TYPES.REPLACE_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- state.timeline[obj.accountId] = obj.statuses
- },
- [MUTATION_TYPES.INSERT_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [...state.timeline[obj.accountId], ...obj.statuses]
- } else {
- state.timeline[obj.accountId] = obj.statuses
- }
- },
- [MUTATION_TYPES.UPDATE_TOOT]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- // Replace target message in homeTimeline and notifications
- state.timeline[obj.accountId] = state.timeline[obj.accountId].map(status => {
- if (status.id === 'loading-card') {
- return status
- }
- const toot = status as Entity.Status
- if (toot.id === obj.status.id) {
- return obj.status
- } else if (toot.reblog !== null && toot.reblog.id === obj.status.id) {
- // When user reblog/favourite a reblogged toot, target message is a original toot.
- // So, a message which is received now is original toot.
- const reblog = {
- reblog: obj.status
- }
- return Object.assign(toot, reblog)
- } else {
- return toot
- }
- })
- },
- [MUTATION_TYPES.DELETE_TOOT]: (state, obj: { statusId: string; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- state.timeline[obj.accountId] = state.timeline[obj.accountId].filter(status => {
- if (status.id === 'loading-card') {
- return true
- }
- const toot = status as Entity.Status
- if (toot.reblog !== null && toot.reblog.id === obj.statusId) {
- return false
- } else {
- return toot.id !== obj.statusId
- }
- })
- },
- [MUTATION_TYPES.APPEND_TIMELINE_AFTER_LOADING_CARD]: (
- state,
- obj: { statuses: Array; accountId: number }
- ) => {
- if (!state.timeline[obj.accountId]) return
- const tl = state.timeline[obj.accountId].flatMap(status => {
- if (status.id !== 'loading-card') {
- return status
- } else {
- return obj.statuses
- }
- })
- // Reject duplicated status in timeline
- state.timeline[obj.accountId] = Array.from(new Set(tl))
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_TIMELINE: 'fetchTimeline',
- LAZY_FETCH_TIMELINE: 'lazyFetchTimeline',
- FETCH_TIMELINE_SINCE: 'fetchTimelineSince',
- GET_MARKER: 'getMarker',
- SAVE_MARKER: 'saveMarker'
-}
-
-const actions: ActionTree = {
- // vue
- [ACTION_TYPES.FETCH_TIMELINE]: async ({ dispatch, commit, rootState }, req: { account: LocalAccount; server: LocalServer }) => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- const marker: Entity.Marker | null = await dispatch(ACTION_TYPES.GET_MARKER, req).catch(err => {
- console.error(err)
- })
-
- if (rootState.TimelineSpace.setting.markerHome && marker !== null && marker.home) {
- const last = await client.getStatus(marker.home.last_read_id)
- const lastReadStatus = last.data
-
- let timeline: Array = [lastReadStatus]
- const card: LoadingCard = {
- type: 'middle-load',
- since_id: lastReadStatus.id,
- // We don't need to fill this field in the first fetching.
- // Because in most cases there is no new statuses at the first fetching.
- // After new statuses are received, if the number of unread statuses is more than 20, max_id is not necessary.
- // We can fill max_id when calling fetchTimelineSince.
- // If the number of unread statuses is less than 20, max_id is necessary, but it is enough to reject duplicated statuses.
- // So we do it in mutation.
- max_id: null,
- id: 'loading-card',
- uri: 'loading-card'
- }
-
- const res = await client.getHomeTimeline({ limit: 20, max_id: lastReadStatus.id })
- // Make sure whether new statuses exist or not.
- const nextResponse = await client.getHomeTimeline({ limit: 1, min_id: lastReadStatus.id })
- if (nextResponse.data.length > 0) {
- timeline = ([card] as Array).concat(timeline).concat(res.data)
- } else {
- timeline = timeline.concat(res.data)
- }
- commit(MUTATION_TYPES.REPLACE_TIMELINE, { statuses: timeline, accountId: req.account.id })
- return res.data
- } else {
- const res = await client.getHomeTimeline({ limit: 20 })
- commit(MUTATION_TYPES.REPLACE_TIMELINE, { statuses: res.data, accountId: req.account.id })
- return res.data
- }
- },
- [ACTION_TYPES.LAZY_FETCH_TIMELINE]: async (
- { commit, rootState },
- req: { lastStatus: Entity.Status; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- return client.getHomeTimeline({ max_id: req.lastStatus.id, limit: 20 }).then(res => {
- commit(MUTATION_TYPES.INSERT_TIMELINE, { statuses: res.data, accountId: req.account.id })
- return res.data
- })
- },
- [ACTION_TYPES.FETCH_TIMELINE_SINCE]: async (
- { state, rootState, commit },
- req: { sinceId: string; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- const cardIndex = state.timeline[req.account.id].findIndex(s => {
- if (s.id === 'loading-card') {
- return true
- }
- return false
- })
- let maxID: string | null = null
- if (cardIndex > 0) {
- maxID = state.timeline[req.account.id][cardIndex - 1].id
- }
- // Memo: What happens when we specify both of max_id and min_id?
- // What is the difference between max_id & since_id and max_id & min_id?
- // The max_id & since_id:
- // We can get statuses which are older than max_id and newer than since_id.
- // If the number of statuses exceeds the limit, it truncates older statuses.
- // That means, the status immediately after since_id is not included in the response.
- // The max_id & min_id:
- // Also, we can get statuses which are older than max_id and newer than min_id.
- // If the number of statuses exceeds the limit, it truncates newer statuses.
- // That means, the status immediately before max_id is not included in the response.
- let params = { min_id: req.sinceId, limit: 20 }
- if (maxID !== null) {
- params = Object.assign({}, params, {
- max_id: maxID
- })
- }
-
- const res = await client.getHomeTimeline(params)
- if (res.data.length >= 20) {
- const card: LoadingCard = {
- type: 'middle-load',
- since_id: res.data[0].id,
- max_id: maxID,
- id: 'loading-card',
- uri: 'loading-card'
- }
- let timeline: Array = [card]
- timeline = timeline.concat(res.data)
- commit(MUTATION_TYPES.APPEND_TIMELINE_AFTER_LOADING_CARD, { statuses: timeline, accountId: req.account.id })
- } else {
- commit(MUTATION_TYPES.APPEND_TIMELINE_AFTER_LOADING_CARD, { statuses: res.data, accountId: req.account.id })
- }
- return res.data
- },
- [ACTION_TYPES.GET_MARKER]: async ({ rootState }, req: { account: LocalAccount; server: LocalServer }): Promise => {
- if (!rootState.TimelineSpace.setting.markerHome) {
- return null
- }
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- let serverMarker: Entity.Marker | {} = {}
- try {
- const res = await client.getMarkers(['home'])
- serverMarker = res.data
- } catch (err) {
- console.warn(err)
- }
- return serverMarker
- },
- [ACTION_TYPES.SAVE_MARKER]: async ({ state, rootState }, req: { account: LocalAccount; server: LocalServer }) => {
- const timeline = state.timeline[req.account.id]
- if (timeline.length === 0 || timeline[0].id === 'loading-card') {
- return
- }
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- const res = await client.saveMarkers({ home: { last_read_id: timeline[0].id } })
- return res.data
- }
-}
-
-const getters: GetterTree = {
- filters: (_state, _getters, rootState) => {
- return rootState.TimelineSpace.filters.filter(f => f.context.includes(FilterContext.Home) && !f.irreversible)
- }
-}
-
-const Home: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions,
- getters: getters
-}
-
-export default Home
diff --git a/src/renderer/store/TimelineSpace/Contents/Local.ts b/src/renderer/store/TimelineSpace/Contents/Local.ts
deleted file mode 100644
index 4fcb4726..00000000
--- a/src/renderer/store/TimelineSpace/Contents/Local.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import { LocalAccount } from '~src/types/localAccount'
-import { LocalServer } from '~src/types/localServer'
-
-export type LocalState = {
- timeline: { [key: number]: Array }
-}
-
-const state = (): LocalState => ({
- timeline: {}
-})
-
-export const MUTATION_TYPES = {
- APPEND_TIMELINE: 'appendTimeline',
- REPLACE_TIMELINE: 'replaceTimeline',
- INSERT_TIMELINE: 'insertTimeline',
- UPDATE_TOOT: 'updateToot',
- DELETE_TOOT: 'deleteToot'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.APPEND_TIMELINE]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [obj.status, ...state.timeline[obj.accountId]]
- } else {
- state.timeline[obj.accountId] = [obj.status]
- }
- },
- [MUTATION_TYPES.REPLACE_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- state.timeline[obj.accountId] = obj.statuses
- },
- [MUTATION_TYPES.INSERT_TIMELINE]: (state, obj: { statuses: Array; accountId: number }) => {
- if (state.timeline[obj.accountId]) {
- state.timeline[obj.accountId] = [...state.timeline[obj.accountId], ...obj.statuses]
- } else {
- state.timeline[obj.accountId] = obj.statuses
- }
- },
- [MUTATION_TYPES.UPDATE_TOOT]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- state.timeline[obj.accountId] = state.timeline[obj.accountId].map(toot => {
- if (toot.id === obj.status.id) {
- return obj.status
- } else if (toot.reblog !== null && toot.reblog.id === obj.status.id) {
- // When user reblog/favourite a reblogged toot, target message is a original toot.
- // So, a message which is received now is original toot.
- const reblog = {
- reblog: obj.status
- }
- return Object.assign(toot, reblog)
- } else {
- return toot
- }
- })
- },
- [MUTATION_TYPES.DELETE_TOOT]: (state, obj: { statusId: string; accountId: number }) => {
- if (!state.timeline[obj.accountId]) return
- state.timeline[obj.accountId] = state.timeline[obj.accountId].filter(toot => {
- if (toot.reblog !== null && toot.reblog.id === obj.statusId) {
- return false
- } else {
- return toot.id !== obj.statusId
- }
- })
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_LOCAL_TIMELINE: 'fetchLocalTimeline',
- LAZY_FETCH_TIMELINE: 'lazyFetchTimeline'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.FETCH_LOCAL_TIMELINE]: async (
- { commit, rootState },
- req: { account: LocalAccount; server: LocalServer }
- ): Promise> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
-
- try {
- const res = await client.getLocalTimeline({ limit: 20 })
- commit(MUTATION_TYPES.REPLACE_TIMELINE, { statuses: res.data, accountId: req.account.id })
- return res.data
- } catch (err) {
- console.error(err)
- return []
- }
- },
- [ACTION_TYPES.LAZY_FETCH_TIMELINE]: async (
- { commit, rootState },
- req: { lastStatus: Entity.Status; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- return client.getLocalTimeline({ max_id: req.lastStatus.id, limit: 20 }).then(res => {
- commit(MUTATION_TYPES.INSERT_TIMELINE, { statuses: res.data, accountId: req.account.id })
- return res.data
- })
- }
-}
-
-const Local: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions
-}
-
-export default Local
diff --git a/src/renderer/store/TimelineSpace/Contents/Notifications.ts b/src/renderer/store/TimelineSpace/Contents/Notifications.ts
deleted file mode 100644
index 673c9e21..00000000
--- a/src/renderer/store/TimelineSpace/Contents/Notifications.ts
+++ /dev/null
@@ -1,241 +0,0 @@
-import generator, { Entity, FilterContext } from 'megalodon'
-import { Module, MutationTree, ActionTree, GetterTree } from 'vuex'
-import { RootState } from '@/store'
-import { MyWindow } from '~/src/types/global'
-import { LoadingCard } from '@/types/loading-card'
-import { LocalServer } from '~/src/types/localServer'
-import { LocalAccount } from '~/src/types/localAccount'
-
-const win = (window as any) as MyWindow
-
-export type NotificationsState = {
- notifications: { [key: number]: Array }
-}
-
-const state = (): NotificationsState => ({
- notifications: {}
-})
-
-export const MUTATION_TYPES = {
- APPEND_NOTIFICATIONS: 'appendNotifications',
- REPLACE_NOTIFICATIONS: 'updateNotifications',
- INSERT_NOTIFICATIONS: 'insertNotifications',
- UPDATE_TOOT: 'updateToot',
- DELETE_TOOT: 'deleteToot',
- APPEND_NOTIFICATIONS_AFTER_LOADING_CARD: 'appendNotificationsAfterLoadingCard'
-}
-
-const mutations: MutationTree = {
- [MUTATION_TYPES.APPEND_NOTIFICATIONS]: (state, obj: { notification: Entity.Notification; accountId: number }) => {
- if (state.notifications[obj.accountId]) {
- state.notifications[obj.accountId] = [obj.notification, ...state.notifications[obj.accountId]]
- } else {
- state.notifications[obj.accountId] = [obj.notification]
- }
- },
- [MUTATION_TYPES.REPLACE_NOTIFICATIONS]: (state, obj: { notifications: Array; accountId: number }) => {
- state.notifications[obj.accountId] = obj.notifications
- },
- [MUTATION_TYPES.INSERT_NOTIFICATIONS]: (state, obj: { notifications: Array; accountId: number }) => {
- if (state.notifications[obj.accountId]) {
- state.notifications[obj.accountId] = [...state.notifications[obj.accountId], ...obj.notifications]
- } else {
- state.notifications[obj.accountId] = obj.notifications
- }
- },
- [MUTATION_TYPES.UPDATE_TOOT]: (state, obj: { status: Entity.Status; accountId: number }) => {
- if (!state.notifications[obj.accountId]) return
- state.notifications[obj.accountId] = state.notifications[obj.accountId].map(notification => {
- // I want to update toot only mention.
- // Because Toot component don't use status information when other patterns.
- if (notification.type === 'mention' && notification.status && notification.status.id === obj.status.id) {
- const status = {
- status: obj.status
- }
- return Object.assign(notification, status)
- } else {
- return notification
- }
- })
- },
- [MUTATION_TYPES.DELETE_TOOT]: (state, obj: { statusId: string; accountId: number }) => {
- if (!state.notifications[obj.accountId]) return
- state.notifications[obj.accountId] = state.notifications[obj.accountId].filter(notify => {
- if (notify.id === 'loading-card') {
- return true
- }
- const notification = notify as Entity.Notification
- if (notification.status) {
- if (notification.status.reblog && notification.status.reblog.id === obj.statusId) {
- return false
- } else {
- return notification.status.id !== obj.statusId
- }
- } else {
- return true
- }
- })
- },
- [MUTATION_TYPES.APPEND_NOTIFICATIONS_AFTER_LOADING_CARD]: (
- state,
- obj: { notifications: Array; accountId: number }
- ) => {
- if (!state.notifications[obj.accountId]) return
- const n = state.notifications[obj.accountId].flatMap(notify => {
- if (notify.id !== 'loading-card') {
- return notify
- } else {
- return obj.notifications
- }
- })
- // Reject duplicated status in timeline
- state.notifications[obj.accountId] = Array.from(new Set(n))
- }
-}
-
-export const ACTION_TYPES = {
- FETCH_NOTIFICATIONS: 'fetchNotifications',
- LAZY_FETCH_NOTIFICATIONS: 'lazyFetchNotifications',
- FETCH_NOTIFICATIONS_SINCE: 'fetchNotificationsSince',
- RESET_BADGE: 'resetBadge',
- GET_MARKER: 'getMarker',
- SAVE_MARKER: 'saveMarker'
-}
-
-const actions: ActionTree = {
- [ACTION_TYPES.FETCH_NOTIFICATIONS]: async (
- { dispatch, commit, rootState },
- req: { account: LocalAccount; server: LocalServer }
- ): Promise> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
-
- const marker: Entity.Marker | null = await dispatch(ACTION_TYPES.GET_MARKER, req).catch(err => {
- console.error(err)
- })
-
- if (rootState.TimelineSpace.setting.markerNotifications && marker !== null && marker.notifications) {
- // The result does not contain max_id's notification, when we specify max_id parameter in get notifications.
- // So we need to get max_id's notification.
- const nextResponse = await client.getNotifications({ limit: 1, min_id: marker.notifications.last_read_id })
- if (nextResponse.data.length > 0) {
- const card: LoadingCard = {
- type: 'middle-load',
- since_id: marker.notifications.last_read_id,
- // We don't need to fill this field in the first fetching.
- // Because in most cases there is no new statuses at the first fetching.
- // After new statuses are received, if the number of unread statuses is more than 30, max_id is not necessary.
- // We can fill max_id when calling fetchTimelineSince.
- // If the number of unread statuses is less than 30, max_id is necessary, but it is enough to reject duplicated statuses.
- // So we do it in mutation.
- max_id: null,
- id: 'loading-card',
- uri: 'loading-card'
- }
- let notifications: Array = [card]
- const res = await client.getNotifications({ limit: 30, max_id: nextResponse.data[0].id })
- notifications = notifications.concat(res.data)
- commit(MUTATION_TYPES.REPLACE_NOTIFICATIONS, { notifications, accountId: req.account.id })
- commit('TimelineSpace/SideMenu/changeUnreadNotifications', true, { root: true })
- return res.data
- }
- }
- const res = await client.getNotifications({ limit: 30 })
- commit(MUTATION_TYPES.REPLACE_NOTIFICATIONS, { notifications: res.data, accountId: req.account.id })
- return res.data
- },
- [ACTION_TYPES.LAZY_FETCH_NOTIFICATIONS]: async (
- { commit, rootState },
- req: { lastNotification: Entity.Notification; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- return client.getNotifications({ max_id: req.lastNotification.id, limit: 30 }).then(res => {
- commit(MUTATION_TYPES.INSERT_NOTIFICATIONS, { notifications: res.data, accountId: req.account.id })
- return res.data
- })
- },
- [ACTION_TYPES.FETCH_NOTIFICATIONS_SINCE]: async (
- { state, rootState, commit },
- req: { sinceId: string; account: LocalAccount; server: LocalServer }
- ): Promise | null> => {
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- const cardIndex = state.notifications[req.account.id].findIndex(s => {
- if (s.id === 'loading-card') {
- return true
- }
- return false
- })
- let maxID: string | null = null
- if (cardIndex > 0) {
- maxID = state.notifications[req.account.id][cardIndex - 1].id
- }
- let params = { min_id: req.sinceId, limit: 30 }
- if (maxID !== null) {
- params = Object.assign({}, params, {
- max_id: maxID
- })
- }
-
- const res = await client.getNotifications(params)
- if (res.data.length >= 30) {
- const card: LoadingCard = {
- type: 'middle-load',
- since_id: res.data[0].id,
- max_id: maxID,
- id: 'loading-card',
- uri: 'loading-card'
- }
- let notifications: Array = [card]
- notifications = notifications.concat(res.data)
- commit(MUTATION_TYPES.APPEND_NOTIFICATIONS_AFTER_LOADING_CARD, { notifications, accountId: req.account.id })
- } else {
- commit(MUTATION_TYPES.APPEND_NOTIFICATIONS_AFTER_LOADING_CARD, { notifications: res.data, accountId: req.account.id })
- }
- return res.data
- },
- [ACTION_TYPES.RESET_BADGE]: () => {
- win.ipcRenderer.send('reset-badge')
- },
- [ACTION_TYPES.GET_MARKER]: async ({ rootState }, req: { account: LocalAccount; server: LocalServer }): Promise => {
- if (!rootState.TimelineSpace.setting.markerNotifications) {
- return null
- }
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- let serverMarker: Entity.Marker | {} = {}
- try {
- const res = await client.getMarkers(['notifications'])
- serverMarker = res.data
- } catch (err) {
- console.warn(err)
- }
- return serverMarker
- },
- [ACTION_TYPES.SAVE_MARKER]: async ({ state, rootState }, req: { account: LocalAccount; server: LocalServer }) => {
- const notifications = state.notifications[req.account.id]
- if (notifications.length === 0 || notifications[0].id === 'loading-card') {
- return
- }
-
- const client = generator(req.server.sns, req.server.baseURL, req.account.accessToken, rootState.App.userAgent)
- const res = await client.saveMarkers({ notifications: { last_read_id: notifications[0].id } })
- if (rootState.TimelineSpace.server!.sns === 'pleroma') {
- await client.readNotifications({ max_id: notifications[0].id })
- }
- return res.data
- }
-}
-
-const getters: GetterTree = {
- filters: (_state, _getters, rootState) => {
- return rootState.TimelineSpace.filters.filter(f => f.context.includes(FilterContext.Notifications) && !f.irreversible)
- }
-}
-
-const Notifications: Module = {
- namespaced: true,
- state: state,
- mutations: mutations,
- actions: actions,
- getters: getters
-}
-
-export default Notifications
diff --git a/src/renderer/store/TimelineSpace/HeaderMenu.ts b/src/renderer/store/TimelineSpace/HeaderMenu.ts
deleted file mode 100644
index db5f9e68..00000000
--- a/src/renderer/store/TimelineSpace/HeaderMenu.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import generator, { Entity } from 'megalodon'
-import { Module, MutationTree, ActionTree } from 'vuex'
-import { RootState } from '@/store'
-import AxiosLoading from '@/utils/axiosLoading'
-
-export type HeaderMenuState = {
- title: string
- reload: boolean
- loading: boolean
-}
-
-const state = (): HeaderMenuState => ({
- title: 'Home',
- reload: false,
- loading: false
-})
-
-export const MUTATION_TYPES = {
- UPDATE_TITLE: 'updateTitle',
- CHANGE_RELOAD: 'changeReload',
- CHANGE_LOADING: 'changeLoading'
-}
-
-const mutations: MutationTree