1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 09:46:22 +00:00

Merge branch 'master' into delete_dialog

This commit is contained in:
William Grant
2018-04-14 20:20:17 +02:00
37 changed files with 2321 additions and 653 deletions

View File

@@ -5,7 +5,7 @@
"presets": ["react-hmre"]
},
"test": {
"presets": ["react", "es2015"],
"presets": ["env" ,"react", "es2015"],
"plugins": [
[ "babel-plugin-webpack-alias", { "config": "${PWD}/webpack.config.js" } ]
]

View File

@@ -23,6 +23,7 @@
"lineNumber": true
},
"sortBy": "UPDATED_AT",
"sortTagsBy": "ALPHABETICAL",
"ui": {
"defaultNote": "ALWAYS_ASK",
"disableDirectWrite": false,

View File

@@ -1,10 +1,25 @@
# Current behavior
<!--
Please paste some **screenshots** with the **developer tool** open (console tab) when you report a bug.
If your issue is regarding boostnote mobile, move to https://github.com/BoostIO/boostnote-mobile.
-->
# Expected behavior
# Steps to reproduce
1.
2.
3.
# Environment
- Version :
- OS Version and name :
<!--
Love Boostnote? Please consider supporting us via OpenCollective:
👉 https://opencollective.com/boostnoteio
-->
-->

7
__mocks__/electron.js Normal file
View File

@@ -0,0 +1,7 @@
module.exports = {
require: jest.genMockFunction(),
match: jest.genMockFunction(),
app: jest.genMockFunction(),
remote: jest.genMockFunction(),
dialog: jest.genMockFunction()
}

View File

@@ -109,6 +109,8 @@ export default class CodeEditor extends React.Component {
scrollPastEnd: this.props.scrollPastEnd,
inputStyle: 'textarea',
dragDrop: false,
foldGutter: true,
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
autoCloseBrackets: true,
extraKeys: {
Tab: function (cm) {
@@ -275,11 +277,16 @@ export default class CodeEditor extends React.Component {
handleDropImage (e) {
e.preventDefault()
const imagePath = e.dataTransfer.files[0].path
const filename = path.basename(imagePath)
const ValidImageTypes = ['image/gif', 'image/jpeg', 'image/png']
copyImage(imagePath, this.props.storageKey).then((imagePath) => {
const imageMd = `![${filename}](${path.join('/:storage', imagePath)})`
const file = e.dataTransfer.files[0]
const filePath = file.path
const filename = path.basename(filePath)
const fileType = file['type']
copyImage(filePath, this.props.storageKey).then((imagePath) => {
var showPreview = ValidImageTypes.indexOf(fileType) > 0
const imageMd = `${showPreview ? '!' : ''}[${filename}](${path.join('/:storage', imagePath)})`
this.insertImageMd(imageMd)
})
}

View File

@@ -13,6 +13,7 @@ import htmlTextHelper from 'browser/lib/htmlTextHelper'
import copy from 'copy-to-clipboard'
import mdurl from 'mdurl'
import exportNote from 'browser/main/lib/dataApi/exportNote'
import {escapeHtmlCharacters} from 'browser/lib/utils'
const { remote } = require('electron')
const { app } = remote
@@ -208,7 +209,7 @@ export default class MarkdownPreview extends React.Component {
const {fontFamily, fontSize, codeBlockFontFamily, lineNumber, codeBlockTheme} = this.getStyleParams()
const inlineStyles = buildStyle(fontFamily, fontSize, codeBlockFontFamily, lineNumber, codeBlockTheme, lineNumber)
const body = this.markdown.render(noteContent)
const body = this.markdown.render(escapeHtmlCharacters(noteContent))
const files = [this.GetCodeThemeLink(codeBlockTheme), ...CSS_FILES]
files.forEach((file) => {
@@ -394,6 +395,9 @@ export default class MarkdownPreview extends React.Component {
_.forEach(this.refs.root.contentWindow.document.querySelectorAll('a'), (el) => {
this.fixDecodedURI(el)
el.href = this.markdown.normalizeLinkText(el.href)
if (!/\/:storage/.test(el.href)) return
el.href = `file:///${this.markdown.normalizeLinkText(path.join(storagePath, 'images', path.basename(el.href)))}`
el.addEventListener('click', this.anchorClickHandler)
})

View File

@@ -10,8 +10,8 @@ import CSSModules from 'browser/lib/CSSModules'
* @param {Array} storgaeList
*/
const StorageList = ({storageList}) => (
<div styleName='storageList'>
const StorageList = ({storageList, isFolded}) => (
<div styleName={isFolded ? 'storageList-folded' : 'storageList'}>
{storageList.length > 0 ? storageList : (
<div styleName='storgaeList-empty'>No storage mount.</div>
)}

View File

@@ -4,6 +4,10 @@
top 180px
overflow-y auto
.storageList-folded
@extend .storageList
width 44px
.storageList-empty
padding 0 10px
margin-top 15px

View File

@@ -1,8 +1,15 @@
const path = require('path')
const { remote } = require('electron')
const { app } = remote
// load package for localization
const i18n = new (require('i18n-2'))({
// setup some locales - other locales default to the first locale
locales: ['en', 'sq', 'zh-CN', 'zh-TW', 'da', 'fr', 'de', 'hu', 'ja', 'ko', 'no', 'pl', 'pt', 'es'],
locales: ['en', 'sq', 'zh-CN', 'zh-TW', 'da', 'fr', 'de', 'hu', 'ja', 'ko', 'no', 'pl', 'pt', 'es-ES'],
extension: '.json',
directory: process.env.NODE_ENV === 'production'
? path.join(app.getAppPath(), './locales')
: path.resolve('./locales'),
devMode: false
})

View File

@@ -4,39 +4,28 @@ export default function searchFromNotes (notes, search) {
if (search.trim().length === 0) return []
const searchBlocks = search.split(' ').filter(block => { return block !== '' })
let foundNotes = findByWord(notes, searchBlocks[0])
let foundNotes = notes
searchBlocks.forEach((block) => {
foundNotes = findByWord(foundNotes, block)
if (block.match(/^#.+/)) {
foundNotes = foundNotes.concat(findByTag(notes, block))
}
foundNotes = findByWordOrTag(foundNotes, block)
})
return foundNotes
}
function findByTag (notes, block) {
const tag = block.match(/#(.+)/)[1]
const regExp = new RegExp(_.escapeRegExp(tag), 'i')
function findByWordOrTag (notes, block) {
let tag = block
if (tag.match(/^#.+/)) {
tag = tag.match(/#(.+)/)[1]
}
const tagRegExp = new RegExp(_.escapeRegExp(tag), 'i')
const wordRegExp = new RegExp(_.escapeRegExp(block), 'i')
return notes.filter((note) => {
if (!_.isArray(note.tags)) return false
return note.tags.some((_tag) => {
return _tag.match(regExp)
})
})
}
function findByWord (notes, block) {
const regExp = new RegExp(_.escapeRegExp(block), 'i')
return notes.filter((note) => {
if (_.isArray(note.tags) && note.tags.some((_tag) => {
return _tag.match(regExp)
})) {
if (_.isArray(note.tags) && note.tags.some((_tag) => _tag.match(tagRegExp))) {
return true
}
if (note.type === 'SNIPPET_NOTE') {
return note.description.match(regExp)
return note.description.match(wordRegExp)
} else if (note.type === 'MARKDOWN_NOTE') {
return note.content.match(regExp)
return note.content.match(wordRegExp)
}
return false
})

View File

@@ -6,6 +6,55 @@ export function lastFindInArray (array, callback) {
}
}
export default {
lastFindInArray
export function escapeHtmlCharacters (text) {
const matchHtmlRegExp = /["'&<>]/
const str = '' + text
const match = matchHtmlRegExp.exec(str)
if (!match) {
return str
}
let escape
let html = ''
let index = 0
let lastIndex = 0
for (index = match.index; index < str.length; index++) {
switch (str.charCodeAt(index)) {
case 34: // "
escape = '&quot;'
break
case 38: // &
escape = '&amp;'
break
case 39: // '
escape = '&#39;'
break
case 60: // <
escape = '&lt;'
break
case 62: // >
escape = '&gt;'
break
default:
continue
}
if (lastIndex !== index) {
html += str.substring(lastIndex, index)
}
lastIndex = index + 1
html += escape
}
return lastIndex !== index
? html + str.substring(lastIndex, index)
: html
}
export default {
lastFindInArray,
escapeHtmlCharacters
}

View File

@@ -140,43 +140,37 @@ class Main extends React.Component {
componentDidMount () {
const { dispatch, config } = this.props
if (config.ui.theme === 'dark') {
document.body.setAttribute('data-theme', 'dark')
} else if (config.ui.theme === 'white') {
document.body.setAttribute('data-theme', 'white')
} else if (config.ui.theme === 'solarized-dark') {
document.body.setAttribute('data-theme', 'solarized-dark')
const supportedThemes = [
'dark',
'white',
'solarized-dark'
]
if (supportedThemes.indexOf(config.ui.theme) !== -1) {
document.body.setAttribute('data-theme', config.ui.theme)
} else {
document.body.setAttribute('data-theme', 'default')
}
if (config.ui.language === 'sq') {
i18n.setLocale('sq')
} else if (config.ui.language === 'zh-CN') {
i18n.setLocale('zh-CN')
} else if (config.ui.language === 'zh-TW') {
i18n.setLocale('zh-TW')
} else if (config.ui.language === 'da') {
i18n.setLocale('da')
} else if (config.ui.language === 'fr') {
i18n.setLocale('fr')
} else if (config.ui.language === 'de') {
i18n.setLocale('de')
} else if (config.ui.language === 'hu') {
i18n.setLocale('hu')
} else if (config.ui.language === 'ja') {
i18n.setLocale('ja')
} else if (config.ui.language === 'ko') {
i18n.setLocale('ko')
} else if (config.ui.language === 'no') {
i18n.setLocale('no')
} else if (config.ui.language === 'pl') {
i18n.setLocale('pl')
} else if (config.ui.language === 'pt') {
i18n.setLocale('pt')
} else if (config.ui.language === 'ru') {
i18n.setLocale('ru')
} else if (config.ui.language === 'es') {
i18n.setLocale('es')
const supportedLanguages = [
'sq',
'zh-CN',
'zh-TW',
'da',
'fr',
'de',
'hu',
'ja',
'ko',
'no',
'pl',
'pt',
'ru',
'es-ES'
]
if (supportedLanguages.indexOf(config.ui.language) !== -1) {
i18n.setLocale(config.ui.language)
} else {
i18n.setLocale('en')
}

View File

@@ -327,8 +327,10 @@ class NoteList extends React.Component {
}
if (location.pathname.match(/\/searched/)) {
const searchInputText = document.getElementsByClassName('searchInput')[0].value
if (searchInputText === '') {
const searchInputText = params.searchword
const allNotes = data.noteMap.map((note) => note)
this.contextNotes = allNotes
if (searchInputText === undefined || searchInputText === '') {
return this.sortByPin(this.contextNotes)
}
return searchFromNotes(this.contextNotes, searchInputText)
@@ -482,50 +484,53 @@ class NoteList extends React.Component {
const openBlogLabel = i18n.__('Open Blog')
const menu = new Menu()
if (!location.pathname.match(/\/starred|\/trash/)) {
menu.append(new MenuItem({
label: pinLabel,
click: this.pinToTop
}))
}
if (location.pathname.match(/\/trash/)) {
menu.append(new MenuItem({
label: restoreNote,
click: this.restoreNote
}))
}
menu.append(new MenuItem({
label: deleteLabel,
click: this.deleteNote
}))
menu.append(new MenuItem({
label: cloneNote,
click: this.cloneNote.bind(this)
}))
menu.append(new MenuItem({
label: copyNoteLink,
click: this.copyNoteLink(note)
}))
if (note.type === 'MARKDOWN_NOTE') {
if (note.blog && note.blog.blogLink && note.blog.blogId) {
menu.append(new MenuItem({
label: deleteLabel,
click: this.deleteNote
}))
} else {
if (!location.pathname.match(/\/starred/)) {
menu.append(new MenuItem({
label: updateLabel,
click: this.publishMarkdown.bind(this)
}))
menu.append(new MenuItem({
label: openBlogLabel,
click: () => this.openBlog.bind(this)(note)
}))
} else {
menu.append(new MenuItem({
label: publishLabel,
click: this.publishMarkdown.bind(this)
label: pinLabel,
click: this.pinToTop
}))
}
menu.append(new MenuItem({
label: deleteLabel,
click: this.deleteNote
}))
menu.append(new MenuItem({
label: cloneNote,
click: this.cloneNote.bind(this)
}))
menu.append(new MenuItem({
label: copyNoteLink,
click: this.copyNoteLink(note)
}))
if (note.type === 'MARKDOWN_NOTE') {
if (note.blog && note.blog.blogLink && note.blog.blogId) {
menu.append(new MenuItem({
label: updateLabel,
click: this.publishMarkdown.bind(this)
}))
menu.append(new MenuItem({
label: openBlogLabel,
click: () => this.openBlog.bind(this)(note)
}))
} else {
menu.append(new MenuItem({
label: publishLabel,
click: this.publishMarkdown.bind(this)
}))
}
}
}
menu.popup()
}

View File

@@ -30,11 +30,33 @@
display flex
flex-direction column
.tag-title
padding-left 15px
padding-bottom 13px
p
color $ui-button-default-color
.tag-control
display flex
height 30px
line-height 25px
overflow hidden
.tag-control-title
padding-left 15px
padding-bottom 13px
flex 1
p
color $ui-button-default-color
.tag-control-sortTagsBy
user-select none
font-size 12px
color $ui-inactive-text-color
margin-left 12px
margin-right 12px
.tag-control-sortTagsBy-select
appearance: none;
margin-left 5px
color $ui-inactive-text-color
padding 0
border none
background-color transparent
outline none
cursor pointer
font-size 12px
.tagList
overflow-y auto

View File

@@ -82,7 +82,7 @@ class SideNav extends React.Component {
}
SideNavComponent (isFolded, storageList) {
const { location, data } = this.props
const { location, data, config } = this.props
const isHomeActive = !!location.pathname.match(/^\/home$/)
const isStarredActive = !!location.pathname.match(/^\/starred$/)
@@ -108,15 +108,30 @@ class SideNav extends React.Component {
handleFilterButtonContextMenu={this.handleFilterButtonContextMenu.bind(this)}
/>
<StorageList storageList={storageList} />
<StorageList storageList={storageList} isFolded={isFolded} />
<NavToggleButton isFolded={isFolded} handleToggleButtonClick={this.handleToggleButtonClick.bind(this)} />
</div>
)
} else {
component = (
<div styleName='tabBody'>
<div styleName='tag-title'>
<p>{i18n.__('Tags')}</p>
<div styleName='tag-control'>
<div styleName='tag-control-title'>
<p>{i18n.__('Tags')}</p>
</div>
<div styleName='tag-control-sortTagsBy'>
<i className='fa fa-angle-down' />
<select styleName='tag-control-sortTagsBy-select'
title={i18n.__('Select filter mode')}
value={config.sortTagsBy}
onChange={(e) => this.handleSortTagsByChange(e)}
>
<option title='Sort alphabetically'
value='ALPHABETICAL'>{i18n.__('Alphabetically')}</option>
<option title='Sort by update time'
value='COUNTER'>{i18n.__('Counter')}</option>
</select>
</div>
</div>
<div styleName='tagList'>
{this.tagListComponent(data)}
@@ -129,17 +144,21 @@ class SideNav extends React.Component {
}
tagListComponent () {
const { data, location } = this.props
const tagList = _.sortBy(data.tagNoteMap.map((tag, name) => {
return { name, size: tag.size }
}), ['name'])
const { data, location, config } = this.props
let tagList = _.sortBy(data.tagNoteMap.map(
(tag, name) => ({name, size: tag.size})),
['name']
)
if (config.sortTagsBy === 'COUNTER') {
tagList = _.sortBy(tagList, item => (0 - item.size))
}
return (
tagList.map(tag => {
return (
<TagListItem
name={tag.name}
handleClickTagListItem={this.handleClickTagListItem.bind(this)}
isActive={this.getTagActive(location.pathname, tag)}
isActive={this.getTagActive(location.pathname, tag.name)}
key={tag.name}
count={tag.size}
/>
@@ -159,6 +178,20 @@ class SideNav extends React.Component {
router.push(`/tags/${name}`)
}
handleSortTagsByChange (e) {
const { dispatch } = this.props
const config = {
sortTagsBy: e.target.value
}
ConfigManager.set(config)
dispatch({
type: 'SET_CONFIG',
config
})
}
emptyTrash (entries) {
const { dispatch } = this.props
const deletionPromises = entries.map((note) => {

View File

@@ -28,6 +28,14 @@ class TopBar extends React.Component {
}
componentDidMount () {
const { params } = this.props
const searchWord = params.searchword
if (searchWord !== undefined) {
this.setState({
search: searchWord,
isSearching: true
})
}
ee.on('top:focus-search', this.focusSearchHandler)
ee.on('code:init', this.codeInitHandler)
}
@@ -97,9 +105,10 @@ class TopBar extends React.Component {
this.setState({
isConfirmTranslation: true
})
router.push('/searched')
const keyword = this.refs.searchInput.value
router.push(`/searched/${encodeURIComponent(keyword)}`)
this.setState({
search: this.refs.searchInput.value
search: keyword
})
}
}
@@ -108,7 +117,7 @@ class TopBar extends React.Component {
const { router } = this.context
const keyword = this.refs.searchInput.value
if (this.state.isAlphabet || this.state.isConfirmTranslation) {
router.push('/searched')
router.push(`/searched/${encodeURIComponent(keyword)}`)
} else {
e.preventDefault()
}

View File

@@ -108,6 +108,21 @@ body[data-theme="dark"]
background #B1D7FE
::selection
background #B1D7FE
.CodeMirror-foldmarker
font-family: arial
.CodeMirror-foldgutter
width: .7em
.CodeMirror-foldgutter-open,
.CodeMirror-foldgutter-folded
cursor: pointer
.CodeMirror-foldgutter-open:after
content: "\25BE"
.CodeMirror-foldgutter-folded:after
content: "\25B8"
.sortableItemHelper
z-index modalZIndex + 5

View File

@@ -64,7 +64,9 @@ ReactDOM.render((
<IndexRedirect to='/home' />
<Route path='home' />
<Route path='starred' />
<Route path='searched' />
<Route path='searched'>
<Route path=':searchword' />
</Route>
<Route path='trashed' />
<Route path='alltags' />
<Route path='tags'>

View File

@@ -16,6 +16,7 @@ export const DEFAULT_CONFIG = {
listWidth: 280,
navWidth: 200,
sortBy: 'UPDATED_AT', // 'CREATED_AT', 'UPDATED_AT', 'APLHABETICAL'
sortTagsBy: 'ALPHABETICAL', // 'ALPHABETICAL', 'COUNTER'
listStyle: 'DEFAULT', // 'DEFAULT', 'SMALL'
amaEnabled: true,
hotkey: {
@@ -138,37 +139,7 @@ function set (updates) {
document.body.setAttribute('data-theme', 'default')
}
if (newConfig.ui.language === 'sq') {
i18n.setLocale('sq')
} else if (newConfig.ui.language === 'zh-CN') {
i18n.setLocale('zh-CN')
} else if (newConfig.ui.language === 'zh-TW') {
i18n.setLocale('zh-TW')
} else if (newConfig.ui.language === 'da') {
i18n.setLocale('da')
} else if (newConfig.ui.language === 'fr') {
i18n.setLocale('fr')
} else if (newConfig.ui.language === 'de') {
i18n.setLocale('de')
} else if (newConfig.ui.language === 'hu') {
i18n.setLocale('hu')
} else if (newConfig.ui.language === 'ja') {
i18n.setLocale('ja')
} else if (newConfig.ui.language === 'ko') {
i18n.setLocale('ko')
} else if (newConfig.ui.language === 'no') {
i18n.setLocale('no')
} else if (newConfig.ui.language === 'pl') {
i18n.setLocale('pl')
} else if (newConfig.ui.language === 'pt') {
i18n.setLocale('pt')
} else if (newConfig.ui.language === 'ru') {
i18n.setLocale('ru')
} else if (newConfig.ui.language === 'es') {
i18n.setLocale('es')
} else {
i18n.setLocale('en')
}
i18n.setLocale(newConfig.ui.language)
let editorTheme = document.getElementById('editorTheme')
if (editorTheme == null) {

View File

@@ -27,9 +27,12 @@ function resolveStorageNotes (storage) {
data.storage = storage.key
return data
} catch (err) {
console.error(notePath)
console.error(`error on note path: ${notePath}, error: ${err}`)
}
})
.filter(function filterOnlyNoteObject (noteObj) {
return typeof noteObj === 'object'
})
return Promise.resolve(notes)
}

View File

@@ -40,7 +40,7 @@ mainWindow.webContents.sendInputEvent({
keyCode: '\u0008'
})
if (process.platform === 'darwin' || process.env.DESKTOP_SESSION === 'cinnamon') {
if (process.platform === 'darwin') {
mainWindow.on('close', function (e) {
e.preventDefault()
if (mainWindow.isFullScreen()) {

View File

@@ -85,6 +85,7 @@
<script src="../extra_scripts/boost/boostNewLineIndentContinueMarkdownList.js"></script>
<script src="../node_modules/codemirror/addon/edit/closebrackets.js"></script>
<script src="../node_modules/codemirror/addon/edit/matchbrackets.js"></script>
<script src="../node_modules/codemirror/addon/search/search.js"></script>
<script src="../node_modules/codemirror/addon/search/searchcursor.js"></script>
@@ -92,6 +93,11 @@
<script src="../node_modules/codemirror/addon/scroll/scrollpastend.js"></script>
<script src="../node_modules/codemirror/addon/search/matchesonscrollbar.js"></script>
<script src="../node_modules/codemirror/addon/search/jump-to-line.js"></script>
<script src="../node_modules/codemirror/addon/fold/brace-fold.js"></script>
<script src="../node_modules/codemirror/addon/fold/foldgutter.js"></script>
<script src="../node_modules/codemirror/addon/fold/foldcode.js"></script>
<script src="../node_modules/codemirror/addon/dialog/dialog.js"></script>
<script src="../node_modules/codemirror/addon/display/rulers.js"></script>

View File

@@ -111,6 +111,7 @@
"Updated": "Updated",
"Created": "Created",
"Alphabetically": "Alphabetically",
"Counter": "Counter",
"Default View": "Default View",
"Compressed View": "Compressed View",
"Search": "Search",

153
locales/es-ES.json Normal file
View File

@@ -0,0 +1,153 @@
{
"Notes": "Notas",
"Tags": "Etiquetas",
"Preferences": "Preferencias",
"Make a note": "Tomar una nota",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
"to create a new note": "para crear una nueva nota",
"Toggle Mode": "Alternar modo",
"Trash": "Basura",
"MODIFICATION DATE": "FECHA DE MODIFICACIÓN",
"Words": "Palabras",
"Letters": "Letras",
"STORAGE": "ALMACENAMIENTO",
"FOLDER": "CARPETA",
"CREATION DATE": "FECHA DE CREACIÓN",
"NOTE LINK": "ENLACE A LA NOTA",
".md": ".md",
".txt": ".txt",
".html": ".html",
"Print": "Imprimir",
"Your preferences for Boostnote": "Tus preferencias para Boostnote",
"Storages": "Almacenamientos",
"Add Storage Location": "Añadir ubicación de almacenamiento",
"Add Folder": "Añadir carpeta",
"Open Storage folder": "Añadir carpeta de almacenamiento",
"Unlink": "Desvincular",
"Edit": "Editar",
"Delete": "Eliminar",
"Interface": "Interfaz",
"Interface Theme": "Tema de la interfaz",
"Default": "Por defecto",
"White": "Blanco",
"Solarized Dark": "Solarizado oscuro",
"Dark": "Oscuro",
"Show a confirmation dialog when deleting notes": "Requerir confirmación al eliminar nota",
"Editor Theme": "Tema del editor",
"Editor Font Size": "Tamaño de fuente del editor",
"Editor Font Family": "Fuente del editor",
"Editor Indent Style": "Estilo de indentado del editor",
"Spaces": "Espacios",
"Tabs": "Tabulación",
"Switch to Preview": "Cambiar a Previsualización",
"When Editor Blurred": "Cuando el editor pierde el foco",
"When Editor Blurred, Edit On Double Click": "Cuando el editor pierde el foco, editar con doble clic",
"On Right Click": "Al hacer clic derecho",
"Editor Keymap": "Mapeo de teclas del editor",
"default": "por defecto",
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Reinicie boostnote después de cambiar el mapeo de teclas",
"Show line numbers in the editor": "Mostrar números de línea en el editor",
"Allow editor to scroll past the last line": "Permitir al editor desplazarse más allá de la última línea",
"Bring in web page title when pasting URL on editor": "Al pegar una URL en el editor, insertar el título de la web automáticamente",
"Preview": "Previsualización",
"Preview Font Size": "Previsualizar tamaño de la fuente",
"Preview Font Family": "Previsualizar fuente",
"Code block Theme": "Tema de los bloques de código",
"Allow preview to scroll past the last line": "Permitir a la previsualización desplazarse más allá de la última línea",
"Show line numbers for preview code blocks": "Mostar números de línea al previsualizar bloques de código",
"LaTeX Inline Open Delimiter": "Delimitador de apertura LaTeX en línea",
"LaTeX Inline Close Delimiter": "Delimitador de cierre LaTeX en línea",
"LaTeX Block Open Delimiter": "Delimitado de apertura bloque LaTeX",
"LaTeX Block Close Delimiter": "Delimitador de cierre bloque LaTeX",
"Community": "Comunidad",
"Subscribe to Newsletter": "Suscribirse al boletín",
"GitHub": "GitHub",
"Blog": "Blog",
"Facebook Group": "Grupo de Facebook",
"Twitter": "Twitter",
"About": "Sobre",
"Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "Una aplicación para tomar notas de código abieto para programadores como tú.",
"Website": "Página web",
"Development": "Desarrollo",
" : Development configurations for Boostnote.": " : Configuraciones de desarrollo para Boostnote.",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "Licencia: GPL v3",
"Analytics": "Analítica",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote recopila datos anónimos con el único propósito de mejorar la aplicación. No recopila ninguna información personal, como puede ser el contenido de sus notas.",
"You can see how it works on ": "Puedes ver cómo funciona en ",
"You can choose to enable or disable this option.": "Puedes elegir activar o desactivar esta opción.",
"Enable analytics to help improve Boostnote": "Activa analítica para ayudar a mejorar Boostnote",
"Crowdfunding": "Crowdfunding",
"Dear everyone,": "Hola a todos,",
"Thank you for using Boostnote!": "Gracias por usar Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote es utilizado en alrededor de 200 países y regiones diferentes por una increíble comunidad de desarrolladores.",
"To continue supporting this growth, and to satisfy community expectations,": "Para continuar apoyando este crecimiento y satisfacer las expectativas de la comunidad,",
"we would like to invest more time and resources in this project.": "nos gustaría invertir más tiempo y recursos en este proyecto.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Si te gusta este proyecto y ves potencial en él, ¡puedes ayudar apoyándonos en OpenCollective!",
"Thanks,": "Gracias,",
"Boostnote maintainers": "Equipo de Boostnote",
"Support via OpenCollective": "Contribuir vía OpenCollective",
"Language": "Idioma",
"English": "Inglés",
"German": "Alemán",
"French": "Francés",
"Show \"Saved to Clipboard\" notification when copying": "Mostrar la notificaión \"Guardado en Portapapeles\" al copiar",
"All Notes": "Todas las notas",
"Starred": "Destacado",
"Are you sure to ": "Estás seguro de ",
" delete": " eliminar",
"this folder?": "esta carpeta?",
"Confirm": "Confirmar",
"Cancel": "Cancelar",
"Markdown Note": "Nota Markdown",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "Formato para crear documentos de texto. Permite utilizar listas, bloques de código y LaTeX.",
"Snippet Note": "Nota Snippet",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "Formato para fragmentos de código. Múltiples fragmentos se pueden agrupar en una sola nota.",
"Tab to switch format": "Tabulador para cambiar formato",
"Updated": "Actualizado",
"Created": "Creado",
"Alphabetically": "Alfabéticamente",
"Default View": "Vista por defecto",
"Compressed View": "Vista comprimida",
"Search": "Buscar",
"Blog Type": "Tipo de blog",
"Blog Address": "Dirección del blog",
"Save": "Guardar",
"Auth": "Auth",
"Authentication Method": "Método de autentificación",
"JWT": "JWT",
"USER": "USUARIO",
"Token": "Token",
"Storage": "Almacenamiento",
"Hotkeys": "Atajos de teclado",
"Show/Hide Boostnote": "Mostrar/Ocultar Boostnote",
"Restore": "Restaurar",
"Permanent Delete": "Eliminar permanentemente",
"Confirm note deletion": "Confirmar eliminación de nota",
"This will permanently remove this note.": "La nota se eliminará permanentemente.",
"Successfully applied!": "Aplicado con éxito!",
"Albanian": "Albanés",
"Chinese (zh-CN)": "Chino - China",
"Chinese (zh-TW)": "Chino - Taiwan",
"Danish": "Danés",
"Japanese": "Japonés",
"Korean": "Coreano",
"Norwegian": "Noruego",
"Polish": "Polaco",
"Portuguese": "Portugues",
"Spanish": "Español",
"You have to save!": "Tienes que guardar!",
"Russian": "Ruso",
"Command(⌘)": "Command(⌘)",
"Editor Rulers": "Reglas del editor",
"Enable": "Activar",
"Disable": "Desactivar",
"Sanitization": "Saneamiento",
"Only allow secure html tags (recommended)": "Solo permitir etiquetas html seguras (recomendado)",
"Allow styles": "Permitir estilos",
"Allow dangerous html tags": "Permitir etiques html peligrosas"
}

View File

@@ -1,153 +0,0 @@
{
"Notes": "Notes",
"Tags": "Tags",
"Preferences": "Preferences",
"Make a note": "Make a note",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
"to create a new note": "to create a new note",
"Toggle Mode": "Toggle Mode",
"Trash": "Trash",
"MODIFICATION DATE": "MODIFICATION DATE",
"Words": "Words",
"Letters": "Letters",
"STORAGE": "STORAGE",
"FOLDER": "FOLDER",
"CREATION DATE": "CREATION DATE",
"NOTE LINK": "NOTE LINK",
".md": ".md",
".txt": ".txt",
".html": ".html",
"Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages",
"Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder",
"Unlink": "Unlink",
"Edit": "Edit",
"Delete": "Delete",
"Interface": "Interface",
"Interface Theme": "Interface Theme",
"Default": "Default",
"White": "White",
"Solarized Dark": "Solarized Dark",
"Dark": "Dark",
"Show a confirmation dialog when deleting notes": "Show a confirmation dialog when deleting notes",
"Editor Theme": "Editor Theme",
"Editor Font Size": "Editor Font Size",
"Editor Font Family": "Editor Font Family",
"Editor Indent Style": "Editor Indent Style",
"Spaces": "Spaces",
"Tabs": "Tabs",
"Switch to Preview": "Switch to Preview",
"When Editor Blurred": "When Editor Blurred",
"When Editor Blurred, Edit On Double Click": "When Editor Blurred, Edit On Double Click",
"On Right Click": "On Right Click",
"Editor Keymap": "Editor Keymap",
"default": "default",
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Please restart boostnote after you change the keymap",
"Show line numbers in the editor": "Show line numbers in the editor",
"Allow editor to scroll past the last line": "Allow editor to scroll past the last line",
"Bring in web page title when pasting URL on editor": "Bring in web page title when pasting URL on editor",
"Preview": "Preview",
"Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line",
"Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
"LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter",
"LaTeX Block Open Delimiter": "LaTeX Block Open Delimiter",
"LaTeX Block Close Delimiter": "LaTeX Block Close Delimiter",
"Community": "Community",
"Subscribe to Newsletter": "Subscribe to Newsletter",
"GitHub": "GitHub",
"Blog": "Blog",
"Facebook Group": "Facebook Group",
"Twitter": "Twitter",
"About": "About",
"Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "An open source note-taking app made for programmers just like you.",
"Website": "Website",
"Development": "Development",
" : Development configurations for Boostnote.": " : Development configurations for Boostnote.",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "License: GPL v3",
"Analytics": "Analytics",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.",
"You can see how it works on ": "You can see how it works on ",
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.",
"Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote is used in about 200 different countries and regions by an awesome community of developers.",
"To continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,",
"we would like to invest more time and resources in this project.": "we would like to invest more time and resources in this project.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!",
"Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers",
"Support via OpenCollective": "Support via OpenCollective",
"Language": "Language",
"English": "English",
"German": "German",
"French": "French",
"Show \"Saved to Clipboard\" notification when copying": "Show \"Saved to Clipboard\" notification when copying",
"All Notes": "All Notes",
"Starred": "Starred",
"Are you sure to ": "Are you sure to ",
" delete": " delete",
"this folder?": "this folder?",
"Confirm": "Confirm",
"Cancel": "Cancel",
"Markdown Note": "Markdown Note",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.",
"Snippet Note": "Snippet Note",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "This format is for creating code snippets. Multiple snippets can be grouped into a single note.",
"Tab to switch format": "Tab to switch format",
"Updated": "Updated",
"Created": "Created",
"Alphabetically": "Alphabetically",
"Default View": "Default View",
"Compressed View": "Compressed View",
"Search": "Search",
"Blog Type": "Blog Type",
"Blog Address": "Blog Address",
"Save": "Save",
"Auth": "Auth",
"Authentication Method": "Authentication Method",
"JWT": "JWT",
"USER": "USER",
"Token": "Token",
"Storage": "Storage",
"Hotkeys": "Hotkeys",
"Show/Hide Boostnote": "Show/Hide Boostnote",
"Restore": "Restore",
"Permanent Delete": "Permanent Delete",
"Confirm note deletion": "Confirm note deletion",
"This will permanently remove this note.": "This will permanently remove this note.",
"Successfully applied!": "Successfully applied!",
"Albanian": "Albanian",
"Chinese (zh-CN)": "Chinese (zh-CN)",
"Chinese (zh-TW)": "Chinese (zh-TW)",
"Danish": "Danish",
"Japanese": "Japanese",
"Korean": "Korean",
"Norwegian": "Norwegian",
"Polish": "Polish",
"Portuguese": "Portuguese",
"Spanish": "Spanish",
"You have to save!": "You have to save!",
"Russian": "Russian",
"Command(⌘)": "Command(⌘)",
"Editor Rulers": "Editor Rulers",
"Enable": "Enable",
"Disable": "Disable",
"Sanitization": "Sanitization",
"Only allow secure html tags (recommended)": "Only allow secure html tags (recommended)",
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags"
}

View File

@@ -111,6 +111,7 @@
"Updated": "Módosítás",
"Created": "Létrehozás",
"Alphabetically": "Ábécé sorrendben",
"Counter": "Számláló",
"Default View": "Alapértelmezett Nézet",
"Compressed View": "Tömörített Nézet",
"Search": "Keresés",

152
locales/pt-BR.json Normal file
View File

@@ -0,0 +1,152 @@
{
"Notes": "Notas",
"Tags": "Etiquetas",
"Preferences": "Preferências",
"Make a note": "Fazer uma nota",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
"to create a new note": "para criar uma nova nota",
"Toggle Mode": "Modo de alternância",
"Trash": "Lixeira",
"MODIFICATION DATE": "DATA DE MODIFICAÇÃO",
"Words": "Palavras",
"Letters": "Letras",
"STORAGE": "ARMAZENAMENTO",
"FOLDER": "PASTA",
"CREATION DATE": "DATA DE CRIAÇÃO",
"NOTE LINK": "VÍNCULO DA NOTA",
".md": ".md",
".txt": ".txt",
".html": ".html",
"Print": "Imprimir",
"Your preferences for Boostnote": "Suas preferências para o Boostnote",
"Storages": "Armazenamentos",
"Add Storage Location": "Adicionar Local de Armazenamento",
"Add Folder": "Adicionar Pasta",
"Open Storage folder": "Abrir Local de Armazenamento",
"Unlink": "Desvincular",
"Edit": "Editar",
"Delete": "Apagar",
"Interface": "Interface",
"Interface Theme": "Tema da Interface",
"Default": "Padrão",
"White": "Branco",
"Solarized Dark": "Escuro Solarizado",
"Dark": "Escuro",
"Show a confirmation dialog when deleting notes": "Mostrar um diálogo de confirmação ao escluir notas",
"Editor Theme": "Tema do Editor",
"Editor Font Size": "Tamanho da Fonte do Editor",
"Editor Font Family": "Família da Fonte do Editor",
"Editor Indent Style": "Estílo de Indentação do Editor",
"Spaces": "Espaços",
"Tabs": "Tabulação",
"Switch to Preview": "Mudar para a Pré-Visualização",
"When Editor Blurred": "Quando o Editor Obscurece",
"When Editor Blurred, Edit On Double Click": "Quando o Editor Obscurece, Editar com Duplo Clique",
"On Right Click": "Ao Clicar Com o Botão Direito",
"Editor Keymap": "Mapa de Teclado do Editor",
"default": "padrão",
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Por favor, reinicie o boostnote depois de alterar o mapa de teclado",
"Show line numbers in the editor": "Mostrar os números das linhas no editor",
"Allow editor to scroll past the last line": "Permitir ao editor rolar além da última linha",
"Bring in web page title when pasting URL on editor": "Trazer o título da página da Web ao colar a URL no editor",
"Preview": "Pré-Visualização",
"Preview Font Size": "Tamanho da Fonte da Pré-Visualização",
"Preview Font Family": "Família da Fonte da Pré-Visualização",
"Code block Theme": "Tema do Bloco de Código",
"Allow preview to scroll past the last line": "Permitir à pré-visualização rolar além da última linha",
"Show line numbers for preview code blocks": "Mostrar os números das linhas na pré-visualização dos blocos de código",
"LaTeX Inline Open Delimiter": "Delimitador em Linha Aberto do LaTeX",
"LaTeX Inline Close Delimiter": "Delimitador em Linha Fechado do LaTeX",
"LaTeX Block Open Delimiter": "Delimitador de Bloco Aberto do LaTeX",
"LaTeX Block Close Delimiter": "Delimitador de Bloco Fechado do LaTeX",
"Community": "Comunidade",
"Subscribe to Newsletter": "Subscrever à Newsletter",
"GitHub": "GitHub",
"Blog": "Blog",
"Facebook Group": "Grupo do Facebook",
"Twitter": "Twitter",
"About": "Sobre",
"Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "Um aplicativo de anotações de código aberto feito para programadores como você.",
"Website": "Website",
"Development": "Desenvolvimento",
" : Development configurations for Boostnote.": " : Configurações de desenvolvimento para o Boostnote.",
"Copyright (C) 2017 - 2018 BoostIO": "Direitos Autorais (C) 2017 - 2018 BoostIO",
"License: GPL v3": "Licença: GPL v3",
"Analytics": "Técnicas analíticas",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "O Boostnote coleta dados anônimos com o único propósito de melhorar o aplicativo e de modo algum coleta qualquer informação pessoal, bem como o conteúdo de suas anotações.",
"You can see how it works on ": "Você pode ver como funciona ",
"You can choose to enable or disable this option.": "Você pode optar por ativar ou desativar essa opção.",
"Enable analytics to help improve Boostnote": "Ativar técnicas analíticas para ajudar a melhorar o Boostnote",
"Crowdfunding": "Financiamento Coletivo",
"Dear everyone,": "Caros(as),",
"Thank you for using Boostnote!": "Obrigado por usar o Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "O Boostnote é usado em cerca de 200 países e regiões diferentes por uma incrível comunidade de desenvolvedores.",
"To continue supporting this growth, and to satisfy community expectations,": "Para continuar apoiando o crescimento e satisfazer as expectativas da comunidade,",
"we would like to invest more time and resources in this project.": "gostaríamos de investir mais tempo e recursos neste projeto.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Se você gosta deste projeto e vê o seu potencial, você pode nos ajudar apoiando-nos no OpenCollective!",
"Thanks,": "Obrigado,",
"Boostnote maintainers": "Mantenedores do Boostnote",
"Support via OpenCollective": "Suporte via OpenCollective",
"Language": "Idioma",
"English": "Inglês",
"German": "Alemão",
"French": "Francês",
"Show \"Saved to Clipboard\" notification when copying": "Mostrar a notificação \"Armazenado na Área de Transferência\" ao copiar",
"All Notes": "Todas as Notas",
"Starred": "Com Estrela",
"Are you sure to ": "Tem certeza que gostaría de ",
" delete": " apagar",
"this folder?": "essa pasta?",
"Confirm": "Confirmar",
"Cancel": "Cancelar",
"Markdown Note": "Nota em Markdown",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "Este formato permite a criação de documentos de texto. Listas de verificação, blocos de código e blocos Latex estão disponíveis.",
"Snippet Note": "Fragmento de Nota",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "Este formato é para criar trechos de código. Vários trechos podem ser agrupados em uma única nota.",
"Tab to switch format": "Tabule para mudar o formato",
"Updated": "Atualizado",
"Created": "Criado",
"Alphabetically": "Alfabeticamente",
"Default View": "Visualização Padrão",
"Compressed View": "Visualização Comprimida",
"Search": "Procura",
"Blog Type": "Tipo do Blog",
"Blog Address": "Endereço do Blog",
"Save": "Salvar",
"Auth": "Auth",
"Authentication Method": "Método de Autenticação",
"JWT": "JWT",
"USER": "USUÁRIO",
"Token": "Token",
"Storage": "Armazenamento",
"Hotkeys": "Teclas de Atalho",
"Show/Hide Boostnote": "Esconder/Mostrar Boostnote",
"Restore": "Restaurar",
"Permanent Delete": "Excluir Permanentemente",
"Confirm note deletion": "Confirmar exclusão da nota",
"This will permanently remove this note.": "Isso irá excluir a nota permanentemente.",
"Successfully applied!": "Aplicado com Sucesso!",
"Albanian": "Albanês",
"Chinese (zh-CN)": "Chinês (zh-CN)",
"Chinese (zh-TW)": "Chinês (zh-TW)",
"Danish": "Dinamarquês",
"Japanese": "Japonês",
"Korean": "Coreano",
"Norwegian": "Norueguês",
"Polish": "Polonês",
"Portuguese": "Português (pt-BR)",
"Spanish": "Espanhol",
"You have to save!": "Você precisa salvar!",
"Russian": "Russo",
"Editor Rulers": "Réguas do Editor",
"Enable": "Habilitado",
"Disable": "Desabilitado",
"Sanitization": "Sanitização",
"Only allow secure html tags (recommended)": "Permitir apenas tags html seguras (recomendado)",
"Allow styles": "Permitir estilos",
"Allow dangerous html tags": "Permitir tags html perigosas"
}

232
locales/zh-CN.json Normal file → Executable file
View File

@@ -1,138 +1,138 @@
{
"Notes": "Notes",
"Tags": "Tags",
"Preferences": "Preferences",
"Make a note": "Make a note",
"Notes": "笔记",
"Tags": "标签",
"Preferences": "首选项",
"Make a note": "新建笔记",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
"to create a new note": "to create a new note",
"Toggle Mode": "Toggle Mode",
"Trash": "Trash",
"MODIFICATION DATE": "MODIFICATION DATE",
"Words": "Words",
"Letters": "Letters",
"STORAGE": "STORAGE",
"FOLDER": "FOLDER",
"CREATION DATE": "CREATION DATE",
"NOTE LINK": "NOTE LINK",
"to create a new note": "新建笔记",
"Toggle Mode": "切换模式",
"Trash": "废纸篓",
"MODIFICATION DATE": "更改时间",
"Words": "单词",
"Letters": "字数",
"STORAGE": "本地存储",
"FOLDER": "文件夹",
"CREATION DATE": "创建时间",
"NOTE LINK": "笔记链接",
".md": ".md",
".txt": ".txt",
".html": ".html",
"Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages",
"Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder",
"Unlink": "Unlink",
"Edit": "Edit",
"Delete": "Delete",
"Interface": "Interface",
"Interface Theme": "Interface Theme",
"Default": "Default",
"Print": "打印",
"Your preferences for Boostnote": "个性设置",
"Storages": "本地存储",
"Add Storage Location": "添加一个本地存储位置",
"Add Folder": "新建文件夹",
"Open Storage folder": "打开本地存储位置",
"Unlink": "取消链接",
"Edit": "编辑",
"Delete": "删除",
"Interface": "界面",
"Interface Theme": "主题",
"Default": "默认",
"White": "White",
"Solarized Dark": "Solarized Dark",
"Dark": "Dark",
"Show a confirmation dialog when deleting notes": "Show a confirmation dialog when deleting notes",
"Editor Theme": "Editor Theme",
"Editor Font Size": "Editor Font Size",
"Editor Font Family": "Editor Font Family",
"Editor Indent Style": "Editor Indent Style",
"Spaces": "Spaces",
"Show a confirmation dialog when deleting notes": "删除笔记的时候,显示确认框",
"Editor Theme": "编辑器主题",
"Editor Font Size": "编辑器字号",
"Editor Font Family": "编辑器字体",
"Editor Indent Style": "缩进风格",
"Spaces": "空格",
"Tabs": "Tabs",
"Switch to Preview": "Switch to Preview",
"When Editor Blurred": "When Editor Blurred",
"When Editor Blurred, Edit On Double Click": "When Editor Blurred, Edit On Double Click",
"On Right Click": "On Right Click",
"Editor Keymap": "Editor Keymap",
"default": "default",
"Switch to Preview": "快速切换到预览界面",
"When Editor Blurred": "当编辑器失去焦点的时候,切换到预览界面",
"When Editor Blurred, Edit On Double Click": "当编辑器失去焦点的时候预览,双击切换到编辑界面",
"On Right Click": "右键点击切换两个界面",
"Editor Keymap": "编辑器 Keymap",
"default": "默认",
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Please restart boostnote after you change the keymap",
"Show line numbers in the editor": "Show line numbers in the editor",
"Allow editor to scroll past the last line": "Allow editor to scroll past the last line",
"Bring in web page title when pasting URL on editor": "Bring in web page title when pasting URL on editor",
"Preview": "Preview",
"Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line",
"Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
"LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter",
"LaTeX Block Open Delimiter": "LaTeX Block Open Delimiter",
"LaTeX Block Close Delimiter": "LaTeX Block Close Delimiter",
"Community": "Community",
"Subscribe to Newsletter": "Subscribe to Newsletter",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ 设置好快捷键后记得重启boostnote",
"Show line numbers in the editor": "在编辑器中显示行号",
"Allow editor to scroll past the last line": "允许编辑器滚动到最后一行",
"Bring in web page title when pasting URL on editor": "粘贴网页链接的时候,显示为网页标题",
"Preview": "预览器",
"Preview Font Size": "预览器字号",
"Preview Font Family": "预览器字体",
"Code block Theme": "代码块主题",
"Allow preview to scroll past the last line": "允许预览器滚动到最后一行",
"Show line numbers for preview code blocks": "在预览器中显示行号",
"LaTeX Inline Open Delimiter": "LaTeX 单行开头分隔符",
"LaTeX Inline Close Delimiter": "LaTeX 单行结尾分隔符",
"LaTeX Block Open Delimiter": "LaTeX 多行开头分隔符",
"LaTeX Block Close Delimiter": "LaTeX 多行结尾分隔符",
"Community": "社区",
"Subscribe to Newsletter": "订阅邮件",
"GitHub": "GitHub",
"Blog": "Blog",
"Blog": "博客",
"Facebook Group": "Facebook Group",
"Twitter": "Twitter",
"About": "About",
"About": "关于",
"Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "An open source note-taking app made for programmers just like you.",
"Website": "Website",
"Development": "Development",
" : Development configurations for Boostnote.": " : Development configurations for Boostnote.",
"An open source note-taking app made for programmers just like you.": "一款专门为程序员朋友量身打造的开源笔记",
"Website": "官网",
"Development": "开发",
" : Development configurations for Boostnote.": " : Boostnote的开发配置",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "License: GPL v3",
"Analytics": "Analytics",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.",
"You can see how it works on ": "You can see how it works on ",
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.",
"Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote is used in about 200 different countries and regions by an awesome community of developers.",
"To continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,",
"we would like to invest more time and resources in this project.": "we would like to invest more time and resources in this project.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!",
"Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers",
"Support via OpenCollective": "Support via OpenCollective",
"Language": "Language",
"Analytics": "分析",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote 收集匿名数据只为了提升软件使用体验,绝对不收集任何个人信息(包括笔记内容)",
"You can see how it works on ": "你可以看看它的源码是如何运作的 ",
"You can choose to enable or disable this option.": "你可以选择开启或不开启这个功能",
"Enable analytics to help improve Boostnote": "允许对数据进行分析,帮助我们改进Boostnote",
"Crowdfunding": "众筹",
"Dear everyone,": "亲爱的用户:",
"Thank you for using Boostnote!": "谢谢你使用Boostnote",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大约有200个不同的国家和地区的优秀开发者们都在使用Boostnote",
"To continue supporting this growth, and to satisfy community expectations,": "为了继续支持这种发展,和满足社区的期待,",
"we would like to invest more time and resources in this project.": "我们非常愿意投入更多的时间和资源到这个项目中。",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "如果你喜欢这款软件并且看好它的潜力, 请在OpenCollective上支持我们!",
"Thanks,": "十分感谢!",
"Boostnote maintainers": "Boostnote的维护人员",
"Support via OpenCollective": "OpenCollective上支持我们",
"Language": "语言",
"English": "English",
"German": "German",
"French": "French",
"Show \"Saved to Clipboard\" notification when copying": "Show \"Saved to Clipboard\" notification when copying",
"All Notes": "All Notes",
"Starred": "Starred",
"Are you sure to ": "Are you sure to ",
" delete": " delete",
"this folder?": "this folder?",
"Confirm": "Confirm",
"Cancel": "Cancel",
"Markdown Note": "Markdown Note",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.",
"Snippet Note": "Snippet Note",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "This format is for creating code snippets. Multiple snippets can be grouped into a single note.",
"Tab to switch format": "Tab to switch format",
"Updated": "Updated",
"Created": "Created",
"Alphabetically": "Alphabetically",
"Default View": "Default View",
"Compressed View": "Compressed View",
"Search": "Search",
"Blog Type": "Blog Type",
"Blog Address": "Blog Address",
"Save": "Save",
"Show \"Saved to Clipboard\" notification when copying": "复制的时候,显示 \"已复制\" 提示",
"All Notes": "所有笔记",
"Starred": "星标收藏",
"Are you sure to ": "你确定要",
" delete": " 删除",
"this folder?": "这个文件夹?",
"Confirm": "确认",
"Cancel": "取消",
"Markdown Note": "Markdown笔记",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "创建文档清单代码块甚至是Latex格式文档",
"Snippet Note": "代码笔记",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "创建代码片段,支持多种语法代码片段",
"Tab to switch format": "使用Tab键切换格式",
"Updated": "更新时间",
"Created": "创建时间",
"Alphabetically": "A~Z排序",
"Default View": "默认视图",
"Compressed View": "列表视图",
"Search": "搜索",
"Blog Type": "博客类型",
"Blog Address": "博客地址",
"Save": "保存",
"Auth": "Auth",
"Authentication Method": "Authentication Method",
"Authentication Method": "认证方法",
"JWT": "JWT",
"USER": "USER",
"Token": "Token",
"Storage": "Storage",
"Hotkeys": "Hotkeys",
"Show/Hide Boostnote": "Show/Hide Boostnote",
"Restore": "Restore",
"Permanent Delete": "Permanent Delete",
"Confirm note deletion": "Confirm note deletion",
"This will permanently remove this note.": "This will permanently remove this note.",
"Successfully applied!": "Successfully applied!",
"Storage": "本地存储",
"Hotkeys": "快捷键",
"Show/Hide Boostnote": "显示/隐藏 Boostnote",
"Restore": "恢复",
"Permanent Delete": "永久删除",
"Confirm note deletion": "确认删除笔记",
"This will permanently remove this note.": "永久地删除这条笔记",
"Successfully applied!": "设置成功",
"Albanian": "Albanian",
"Chinese (zh-CN)": "Chinese (zh-CN)",
"Chinese (zh-TW)": "Chinese (zh-TW)",
"Chinese (zh-CN)": "简体中文",
"Chinese (zh-TW)": "繁體中文",
"Danish": "Danish",
"Japanese": "Japanese",
"Korean": "Korean",
@@ -140,13 +140,13 @@
"Polish": "Polish",
"Portuguese": "Portuguese",
"Spanish": "Spanish",
"You have to save!": "You have to save!",
"You have to save!": "你必须保存一下!",
"Russian": "Russian",
"Editor Rulers": "Editor Rulers",
"Enable": "Enable",
"Disable": "Disable",
"Sanitization": "Sanitization",
"Only allow secure html tags (recommended)": "Only allow secure html tags (recommended)",
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags"
"Enable": "开启",
"Disable": "关闭",
"Sanitization": "代码处理",
"Only allow secure html tags (recommended)": "只允许安全的html标签(推荐)",
"Allow styles": "允许样式",
"Allow dangerous html tags": "允许危险的html标签"
}

232
locales/zh-TW.json Normal file → Executable file
View File

@@ -1,138 +1,138 @@
{
"Notes": "Notes",
"Tags": "Tags",
"Preferences": "Preferences",
"Make a note": "Make a note",
"Notes": "筆記",
"Tags": "標籤",
"Preferences": "首選項",
"Make a note": "新建筆記",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
"to create a new note": "to create a new note",
"Toggle Mode": "Toggle Mode",
"Trash": "Trash",
"MODIFICATION DATE": "MODIFICATION DATE",
"Words": "Words",
"Letters": "Letters",
"STORAGE": "STORAGE",
"FOLDER": "FOLDER",
"CREATION DATE": "CREATION DATE",
"NOTE LINK": "NOTE LINK",
"to create a new note": "新建筆記",
"Toggle Mode": "切換模式",
"Trash": "廢紙簍",
"MODIFICATION DATE": "更改時間",
"Words": "單詞",
"Letters": "字數",
"STORAGE": "本地儲存",
"FOLDER": "資料夾",
"CREATION DATE": "創建時間",
"NOTE LINK": "筆記鏈接",
".md": ".md",
".txt": ".txt",
".html": ".html",
"Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages",
"Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder",
"Unlink": "Unlink",
"Edit": "Edit",
"Delete": "Delete",
"Interface": "Interface",
"Interface Theme": "Interface Theme",
"Default": "Default",
"Print": "列印",
"Your preferences for Boostnote": "個性設置",
"Storages": "本地儲存",
"Add Storage Location": "添加一個本地儲存位置",
"Add Folder": "新建資料夾",
"Open Storage folder": "打開一個本地儲存位置",
"Unlink": "取消鏈接",
"Edit": "編輯",
"Delete": "刪除",
"Interface": "界面",
"Interface Theme": "主題",
"Default": "默認",
"White": "White",
"Solarized Dark": "Solarized Dark",
"Dark": "Dark",
"Show a confirmation dialog when deleting notes": "Show a confirmation dialog when deleting notes",
"Editor Theme": "Editor Theme",
"Editor Font Size": "Editor Font Size",
"Editor Font Family": "Editor Font Family",
"Editor Indent Style": "Editor Indent Style",
"Spaces": "Spaces",
"Show a confirmation dialog when deleting notes": "刪除筆記的時候,顯示確認框",
"Editor Theme": "編輯器主題",
"Editor Font Size": "編輯器字型大小",
"Editor Font Family": "編輯器字體",
"Editor Indent Style": "縮進風格",
"Spaces": "空格",
"Tabs": "Tabs",
"Switch to Preview": "Switch to Preview",
"When Editor Blurred": "When Editor Blurred",
"When Editor Blurred, Edit On Double Click": "When Editor Blurred, Edit On Double Click",
"On Right Click": "On Right Click",
"Editor Keymap": "Editor Keymap",
"default": "default",
"Switch to Preview": "快速切換到預覽界面",
"When Editor Blurred": "當編輯器失去焦點的時候,切換到預覽界面",
"When Editor Blurred, Edit On Double Click": "當編輯器失去焦點的時候預覽,雙擊切換到編輯界面",
"On Right Click": "右鍵點擊切換兩個界面",
"Editor Keymap": "編輯器 Keymap",
"default": "默認",
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Please restart boostnote after you change the keymap",
"Show line numbers in the editor": "Show line numbers in the editor",
"Allow editor to scroll past the last line": "Allow editor to scroll past the last line",
"Bring in web page title when pasting URL on editor": "Bring in web page title when pasting URL on editor",
"Preview": "Preview",
"Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line",
"Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
"LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter",
"LaTeX Block Open Delimiter": "LaTeX Block Open Delimiter",
"LaTeX Block Close Delimiter": "LaTeX Block Close Delimiter",
"Community": "Community",
"Subscribe to Newsletter": "Subscribe to Newsletter",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ 設置好快捷鍵後記得重啟设置好快捷键后记得重启boostnote",
"Show line numbers in the editor": "在編輯器中顯示行號",
"Allow editor to scroll past the last line": "允許編輯器滾動到最後一行",
"Bring in web page title when pasting URL on editor": "粘貼網頁鏈接的時候,顯示為網頁標題",
"Preview": "預覽器",
"Preview Font Size": "預覽器字型大小",
"Preview Font Family": "預覽器字體",
"Code block Theme": "代碼塊主題",
"Allow preview to scroll past the last line": "允許預覽器滾動到最後一行",
"Show line numbers for preview code blocks": "在預覽器中顯示行號",
"LaTeX Inline Open Delimiter": "LaTeX 單行開頭分隔符",
"LaTeX Inline Close Delimiter": "LaTeX 單行結尾分隔符",
"LaTeX Block Open Delimiter": "LaTeX 多行開頭分隔符",
"LaTeX Block Close Delimiter": "LaTeX 多行結尾分隔符",
"Community": "社區",
"Subscribe to Newsletter": "訂閱郵件",
"GitHub": "GitHub",
"Blog": "Blog",
"Blog": "部落格",
"Facebook Group": "Facebook Group",
"Twitter": "Twitter",
"About": "About",
"About": "關於",
"Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "An open source note-taking app made for programmers just like you.",
"Website": "Website",
"Development": "Development",
" : Development configurations for Boostnote.": " : Development configurations for Boostnote.",
"An open source note-taking app made for programmers just like you.": "一款專門為程式員朋友量身打造的開源筆記",
"Website": "官網",
"Development": "開發",
" : Development configurations for Boostnote.": " : Boostnote的開發配置",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "License: GPL v3",
"Analytics": "Analytics",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.",
"You can see how it works on ": "You can see how it works on ",
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.",
"Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote is used in about 200 different countries and regions by an awesome community of developers.",
"To continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,",
"we would like to invest more time and resources in this project.": "we would like to invest more time and resources in this project.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!",
"Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers",
"Support via OpenCollective": "Support via OpenCollective",
"Language": "Language",
"Analytics": "分析",
"Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote 收集匿名數據只為了提升軟體使用體驗,絕對不收集任何個人信息(包括筆記內容)",
"You can see how it works on ": "你可以看看它的源碼是如何運作的 ",
"You can choose to enable or disable this option.": "你可以選擇開啟或不開啟這個功能",
"Enable analytics to help improve Boostnote": "允許對數據進行分析,幫助我們改進Boostnote",
"Crowdfunding": "眾籌",
"Dear everyone,": "親愛的用戶:",
"Thank you for using Boostnote!": "謝謝你使用Boostnote",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大約有200個不同的國家和地區的優秀開發者們都在使用Boostnote",
"To continue supporting this growth, and to satisfy community expectations,": "為了繼續支持這種發展,和滿足社區的期待,",
"we would like to invest more time and resources in this project.": "我們非常願意投入更多的時間和資源到這個專案中。",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "如果你喜歡這款軟體並且看好它的潛力, 請在OpenCollective上支持我們!",
"Thanks,": "十分感謝!",
"Boostnote maintainers": "Boostnote的維護人員",
"Support via OpenCollective": "OpenCollective上支持我們",
"Language": "語言",
"English": "English",
"German": "German",
"French": "French",
"Show \"Saved to Clipboard\" notification when copying": "Show \"Saved to Clipboard\" notification when copying",
"All Notes": "All Notes",
"Starred": "Starred",
"Are you sure to ": "Are you sure to ",
" delete": " delete",
"this folder?": "this folder?",
"Confirm": "Confirm",
"Cancel": "Cancel",
"Markdown Note": "Markdown Note",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.",
"Snippet Note": "Snippet Note",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "This format is for creating code snippets. Multiple snippets can be grouped into a single note.",
"Tab to switch format": "Tab to switch format",
"Updated": "Updated",
"Created": "Created",
"Alphabetically": "Alphabetically",
"Default View": "Default View",
"Compressed View": "Compressed View",
"Search": "Search",
"Blog Type": "Blog Type",
"Blog Address": "Blog Address",
"Save": "Save",
"Show \"Saved to Clipboard\" notification when copying": "複製的時候,顯示 \"已複製\" 提示",
"All Notes": "所有筆記",
"Starred": "星標收藏",
"Are you sure to ": "你確定要 ",
" delete": " 刪除",
"this folder?": "這個資料夾嗎?",
"Confirm": "確認",
"Cancel": "取消",
"Markdown Note": "Markdown筆記",
"This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "創建文檔清單代碼塊甚至是Latex格式文檔",
"Snippet Note": "代碼筆記",
"This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "創建代碼片段,支持多種語法代碼片段",
"Tab to switch format": "使用Tab鍵切換格式",
"Updated": "更新時間",
"Created": "創建時間",
"Alphabetically": "A~Z排序",
"Default View": "默認視圖",
"Compressed View": "列表視圖",
"Search": "搜索",
"Blog Type": "部落格類型",
"Blog Address": "部落格地址",
"Save": "保存",
"Auth": "Auth",
"Authentication Method": "Authentication Method",
"Authentication Method": "認證方法",
"JWT": "JWT",
"USER": "USER",
"Token": "Token",
"Storage": "Storage",
"Hotkeys": "Hotkeys",
"Show/Hide Boostnote": "Show/Hide Boostnote",
"Restore": "Restore",
"Permanent Delete": "Permanent Delete",
"Confirm note deletion": "Confirm note deletion",
"This will permanently remove this note.": "This will permanently remove this note.",
"Successfully applied!": "Successfully applied!",
"Storage": "本地儲存",
"Hotkeys": "快捷鍵",
"Show/Hide Boostnote": "顯示/隱藏 Boostnote",
"Restore": "恢復",
"Permanent Delete": "永久刪除",
"Confirm note deletion": "確認刪除筆記",
"This will permanently remove this note.": "永久地刪除這條筆記",
"Successfully applied!": "設置成功",
"Albanian": "Albanian",
"Chinese (zh-CN)": "Chinese (zh-CN)",
"Chinese (zh-TW)": "Chinese (zh-TW)",
"Chinese (zh-CN)": "简体中文",
"Chinese (zh-TW)": "繁體中文",
"Danish": "Danish",
"Japanese": "Japanese",
"Korean": "Korean",
@@ -140,13 +140,13 @@
"Polish": "Polish",
"Portuguese": "Portuguese",
"Spanish": "Spanish",
"You have to save!": "You have to save!",
"You have to save!": "你必須儲存一下!",
"Russian": "Russian",
"Editor Rulers": "Editor Rulers",
"Enable": "Enable",
"Disable": "Disable",
"Sanitization": "Sanitization",
"Only allow secure html tags (recommended)": "Only allow secure html tags (recommended)",
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags"
"Enable": "開啟",
"Disable": "關閉",
"Sanitization": "代碼處理",
"Only allow secure html tags (recommended)": "只允許安全的html標籤(推薦)",
"Allow styles": "允許樣式",
"Allow dangerous html tags": "允許危險的html標籤"
}

View File

@@ -1,7 +1,7 @@
{
"name": "boost",
"productName": "Boostnote",
"version": "0.11.3",
"version": "0.11.4",
"main": "index.js",
"description": "Boostnote",
"license": "GPL-3.0",
@@ -11,6 +11,7 @@
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
"compile": "grunt compile",
"test": "PWD=$(pwd) NODE_ENV=test ava --serial",
"jest": "jest",
"fix": "npm run lint --fix",
"lint": "eslint .",
"dev-start": "concurrently --kill-others \"npm run webpack\" \"npm run hot\""
@@ -96,11 +97,13 @@
"devDependencies": {
"ava": "^0.25.0",
"babel-core": "^6.14.0",
"babel-jest": "^22.4.3",
"babel-loader": "^6.2.0",
"babel-plugin-react-transform": "^2.0.0",
"babel-plugin-webpack-alias": "^2.1.1",
"babel-preset-env": "^1.6.1",
"babel-preset-es2015": "^6.3.13",
"babel-preset-react": "^6.3.13",
"babel-preset-react": "^6.24.1",
"babel-preset-react-hmre": "^1.0.1",
"babel-register": "^6.11.6",
"browser-env": "^3.2.5",
@@ -120,6 +123,9 @@
"grunt": "^0.4.5",
"grunt-electron-installer": "2.1.0",
"history": "^1.17.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^22.4.3",
"jest-localstorage-mock": "^2.2.0",
"jsdom": "^9.4.2",
"json-loader": "^0.5.4",
"merge-stream": "^1.0.0",
@@ -130,6 +136,7 @@
"react-input-autosize": "^1.1.0",
"react-router": "^2.4.0",
"react-router-redux": "^4.0.4",
"react-test-renderer": "^15.6.2",
"standard": "^8.4.0",
"style-loader": "^0.12.4",
"stylus": "^0.52.4",
@@ -152,5 +159,15 @@
"./tests/helpers/setup-electron-mock.js"
],
"babel": "inherit"
},
"jest": {
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less|styl)$": "identity-obj-proxy"
},
"setupFiles": [
"<rootDir>/tests/jest.js",
"jest-localstorage-mock"
]
}
}

View File

@@ -0,0 +1,9 @@
import React from 'react'
import renderer from 'react-test-renderer'
import TagListItem from 'browser/components/TagListItem'
it('TagListItem renders correctly', () => {
const tagListItem = renderer.create(<TagListItem name='Test' handleClickTagListItem={jest.fn()} />)
expect(tagListItem.toJSON()).toMatchSnapshot()
})

View File

@@ -0,0 +1,19 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`TagListItem renders correctly 1`] = `
<button
className="tagList-item"
onClick={[Function]}
>
<span
className="tagList-item-name"
>
# Test
<span
className="tagList-item-count"
>
</span>
</span>
</button>
`;

12
tests/jest.js Normal file
View File

@@ -0,0 +1,12 @@
// Here you can mock the libraries connected through direct insertion <script src="" >
global.Raphael = {
setWindow: jest.fn(),
registerFont: jest.fn(),
fn: function () {
return {}
}
}
global._ = {
extend: jest.genMockFunction()
}

View File

@@ -23,6 +23,7 @@
"lineNumber": true
},
"sortBy": "UPDATED_AT",
"sortTagsBy": "ALPHABETICAL",
"ui": {
"defaultNote": "ALWAYS_ASK",
"disableDirectWrite": false,

View File

@@ -20,18 +20,25 @@ test.before(t => {
notes = [note1, note2, note3]
})
test('it can find notes by tags or words', t => {
test('it can find notes by tags and words', t => {
// [input, expected content (Array)]
const testCases = [
const testWithTags = [
['#tag1', [note1.content, note2.content, note3.content]],
['#tag1 #tag2', [note2.content]],
['#tag2 #tag1', [note2.content]],
['#tag1 #tag2 #tag3', []],
['content1', [note1.content, note2.content]],
['content1 content2', [note2.content]],
['content1 content2 content3', []],
['#content4', [note3.content]]
['#content4', [note3.content]],
['#tag2 content1', [note2.content]],
['content1 #tag2', [note2.content]]
]
const testWithTagsWithoutHash = testWithTags.map(function (testCase) {
return [testCase[0].replace(/#/g, ''), testCase[1]]
})
const testCases = testWithTags.concat(testWithTagsWithoutHash)
testCases.forEach((testCase) => {
const [input, expectedContents] = testCase
const results = searchFromNotes(notes, input)

1520
yarn.lock

File diff suppressed because it is too large Load Diff