code:
{
  'switch-ui-left-right': {
    hint: 'Button that switches layout from left to right, to accommodate left handed & right handed visitors.',
    original: 'Switch left/right UI',
    value: '向左/右切换'
  },
  'toggle-show-tools': {
    hint: 'Button that hides/shows the toolbar.',
    original: 'Show/Hide Tools',
    value: '显示/隐藏工具'
  },
  scroll: {
    hint: 'Verb. As in scrolling a page.',
    original: 'Scroll',
    value: '上滑/下滑'
  },
  donate: {
    original: 'Donate',
    value: '赞助'
  },
  home: {
    hint: 'button with logo, top left of tools',
    original: 'Home',
    value: '主页'
  },
  'modal-new-tab': {
    hint: 'as in browser tab',
    original: 'Open in new tab',
    value: '在新页面打开'
  },
  'tab-edit': {
    hint: 'label for a tab that offer filters for making color adjustments, cropping, transforming, etc.',
    original: 'Edit',
    value: '编辑'
  },
  'tab-file': {
    hint: 'label for a tab that lets user save the image, import, upload, etc.',
    original: 'File',
    value: '文件'
  },
  'tool-brush': {
    hint: 'tool that lets user paint (like in ms paint or photoshop)',
    original: 'Brush',
    value: '画笔工具'
  },
  'tool-paint-bucket': {
    original: 'Paint Bucket',
    value: '油漆桶'
  },
  'tool-gradient': {
    original: 'Gradient',
    value: '渐变'
  },
  'tool-shape': {
    hint: 'Tool for drawing rectangles, circles, lines',
    original: 'Shape',
    value: '形状'
  },
  'tool-text': {
    hint: 'Tool for placing text on canvas',
    original: 'Text',
    value: '文本'
  },
  'tool-hand': {
    hint: 'Tool for navigating (or scrolling around) the canvas. Same name in Photoshop.',
    original: 'Hand Tool',
    value: '手型工具'
  },
  'tool-zoom': {
    original: 'Zoom',
    value: '缩放工具'
  },
  undo: {
    original: 'Undo',
    value: '撤销'
  },
  redo: {
    original: 'Redo',
    value: '重做'
  },
  'brush-pen': {
    hint: 'Generic "brush" that feels a bit like a pen or marker, as opposed to a paint brush.',
    original: 'Pen',
    value: '画笔'
  },
  'brush-blend': {
    hint: 'brush with watercolor feel. Makes colors blend/bleed into each other. Different from smudging though.',
    original: 'Blend',
    value: '水彩刷'
  },
  'brush-sketchy': {
    hint: 'Made up brush name. Pictures drawn with this brush often look like sketches.',
    original: 'Sketchy',
    value: '素描笔'
  },
  'brush-pixel': {
    original: 'Pixel',
    value: '像素化'
  },
  'brush-chemy': {
    hint: 'Made up brush name, derived from drawing applications "Webchemy" and "Alchemy"',
    original: 'Chemy',
    value: '异形图形'
  },
  'brush-smudge': {
    hint: 'Common brush/tool in image editing software. Smudges colors around canvas.',
    original: 'Smudge',
    value: '晕染'
  },
  'brush-size': {
    original: 'Size',
    value: '画笔大小'
  },
  'brush-blending': {
    hint: 'Wetness. How much colors will bleed into each other.',
    original: 'Blending',
    value: '晕染'
  },
  'brush-toggle-pressure': {
    hint: 'google "pressure sensitivity". Feature of Wacom tablets, Apple Pencil, XP Pen, etc.',
    original: 'Toggle Pressure Sensitivity',
    value: '笔压敏度'
  },
  'brush-pen-circle': {
    hint: 'as in circle shape',
    original: 'Circle',
    value: '圆形'
  },
  'brush-pen-chalk': {
    hint: 'as in chalk texture',
    original: 'Chalk',
    value: '粉笔'
  },
  'brush-pen-calligraphy': {
    hint: 'like a "chisel tip marker"',
    original: 'Calligraphy',
    value: '斜角笔'
  },
  'brush-pen-square': {
    hint: 'as in square shape',
    original: 'Square',
    value: '方形'
  },
  'brush-sketchy-scale': {
    hint: 'How far the connecting lines of sketchy brush can reach.',
    original: 'Scale',
    value: '网格长度'
  },
  'brush-pixel-dither': {
    hint: 'Dithering/halftone pattern',
    original: 'Dither',
    value: '像素抖动'
  },
  'brush-chemy-fill': {
    hint: 'Like in MS Paint. A shape can have be outlined, and filled.',
    original: 'Fill',
    value: '填充'
  },
  'brush-chemy-stroke': {
    original: 'Stroke',
    value: '线条'
  },
  'brush-chemy-mirror-x': {
    original: 'Horizontal Symmetry',
    value: '水平对称'
  },
  'brush-chemy-mirror-y': {
    original: 'Vertical Symmetry',
    value: '垂直对称'
  },
  'brush-chemy-gradient': {
    hint: 'as in color gradient',
    original: 'Gradient',
    value: '渐变'
  },
  'brush-eraser-transparent-bg': {
    hint: 'as in transparent background/bottom layer',
    original: 'Transparent Background',
    value: '底层透明度'
  },
  stabilizer: {
    hint: 'Common feature in drawing software to make lines smoother',
    original: 'Stabilizer',
    value: '抖动修正'
  },
  'stabilizer-title': {
    hint: '-title keys are usually more verbose description. shown as a tooltip.',
    original: 'Stroke Stabilizer',
    value: '抖动修正线条'
  },
  eyedropper: {
    original: 'Eyedropper',
    value: '颜色选取'
  },
  'secondary-color': {
    hint: 'or sometimes called "background" color. Photoshop, MS Paint, etc. allow user to switch between two colors.',
    original: 'Secondary Color',
    value: '二级色'
  },
  'manual-color-input': {
    hint: 'A dialog where users can manually type the color, each channel a number. "mci" keys all related to this dialog.',
    original: 'Manual Color Input',
    value: '手动输入颜色'
  },
  'mci-hex': {
    hint: 'as in hex code. Hex representation of color. „#f00“ → red',
    original: 'Hex',
    value: '16进制'
  },
  'mci-copy': {
    hint: 'verb',
    original: 'Copy',
    value: '复制'
  },
  'modal-ok': {
    hint: 'main confirmation button in dialogs. Can be to confirm an action, not just acknowledge information.',
    original: 'Ok',
    value: 'Ok'
  },
  'modal-cancel': {
    original: 'Cancel',
    value: '取消'
  },
  'modal-close': {
    hint: 'as in close a dialog box',
    original: 'Close',
    value: '关闭'
  },
  'layers-active-layer': {
    hint: 'currently selected layer that user is drawing on',
    original: 'Active Layer',
    value: '当前图层'
  },
  'layers-layer': {
    original: 'Layer',
    value: '图层'
  },
  'layers-copy': {
    hint: 'noun',
    original: 'copy',
    value: '副本'
  },
  'layers-blending': {
    hint: 'Common feature in image editing & drawing software. All layers-blend- keys relate to this. https://en.wikipedia.org/wiki/Blend_modes',
    original: 'Blending',
    value: '混合模式'
  },
  'layers-new': {
    hint: 'action',
    original: 'New Layer',
    value: '新建图层'
  },
  'layers-remove': {
    hint: 'action',
    original: 'Remove Layer',
    value: '删除图层'
  },
  'layers-duplicate': {
    hint: 'action',
    original: 'Duplicate Layer',
    value: '复制图层'
  },
  'layers-merge': {
    hint: 'action',
    original: 'Merge with layer below',
    value: '向下合并'
  },
  'layers-rename': {
    hint: 'action',
    original: 'Rename',
    value: '重命名'
  },
  'layers-active-layer-visible': {
    original: 'Active layer is visible',
    value: '当前图层可见'
  },
  'layers-active-layer-hidden': {
    original: 'Active layer is hidden',
    value: '当前图层隐藏'
  },
  'layers-visibility-toggle': {
    original: 'Layer Visibility',
    value: '图层可见性'
  },
  'layers-blend-normal': {
    original: 'normal',
    value: '正常'
  },
  'layers-blend-darken': {
    original: 'darken',
    value: '变暗'
  },
  'layers-blend-multiply': {
    original: 'multiply',
    value: '正片叠底'
  },
  'layers-blend-color-burn': {
    original: 'color burn',
    value: '颜色加深'
  },
  'layers-blend-lighten': {
    original: 'lighten',
    value: '变亮'
  },
  'layers-blend-screen': {
    original: 'screen',
    value: '滤色'
  },
  'layers-blend-color-dodge': {
    original: 'color dodge',
    value: '颜色减淡'
  },
  'layers-blend-overlay': {
    original: 'overlay',
    value: '叠加'
  },
  'layers-blend-soft-light': {
    original: 'soft light',
    value: '柔光'
  },
  'layers-blend-hard-light': {
    original: 'hard light',
    value: '强光'
  },
  'layers-blend-difference': {
    original: 'difference',
    value: '差值'
  },
  'layers-blend-exclusion': {
    original: 'exclusion',
    value: '排除'
  },
  'layers-blend-hue': {
    original: 'hue',
    value: '色相'
  },
  'layers-blend-saturation': {
    original: 'saturation',
    value: '饱和度'
  },
  'layers-blend-color': {
    original: 'color',
    value: '颜色'
  },
  'layers-blend-luminosity': {
    original: 'luminosity',
    value: '明度'
  },
  'layers-rename-title': {
    hint: '-title in code usually means it shows up in a tooltip, or it’s the header of a dialog box, so it can be a little bit longer.',
    original: 'Rename Layer',
    value: '重命名图层'
  },
  'layers-rename-name': {
    hint: 'noun',
    original: 'Name',
    value: '重命名'
  },
  'layers-rename-clear': {
    hint: 'aka action of deleting entered name',
    original: 'Clear Name',
    value: '清除'
  },
  'layers-rename-sketch': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Sketch',
    value: '草图'
  },
  'layers-rename-colors': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Colors',
    value: '色彩'
  },
  'layers-rename-shading': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Shading',
    value: '阴影'
  },
  'layers-rename-lines': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Lines',
    value: '线条'
  },
  'layers-rename-effects': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Effects',
    value: '视觉效果'
  },
  'layers-rename-foreground': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Foreground',
    value: '前景'
  },
  'layers-merge-modal-title': {
    original: 'Merge/Mix Layers',
    value: '向下合并'
  },
  'layers-merge-description': {
    hint: 'After ":" a list of mix/blend modes is shown.',
    original: 'Merges the selected layer with the one underneath. Select the mix mode:',
    value: '选中层与底下一层合并。选择混合模式：'
  },
  'file-no-autosave': {
    hint: "let user know they can't autosave, and there's no cloud storage. Keep short so fits on one line",
    original: 'No autosave, no cloud storage',
    value: '不能自动保存，没有云存储'
  },
  'file-new': {
    hint: 'action',
    original: 'New',
    value: '新建'
  },
  'file-import': {
    hint: 'action',
    original: 'Import',
    value: '打开'
  },
  'file-save': {
    hint: 'action',
    original: 'Save',
    value: '保存'
  },
  'file-format': {
    original: 'File Format',
    value: '文件格式'
  },
  'file-copy': {
    hint: 'verb',
    original: 'Copy',
    value: '复制'
  },
  'file-copy-title': {
    original: 'Copy To Clipboard',
    value: '复制到剪贴板'
  },
  'file-share': {
    hint: 'Common feature on phones. Pressing share button allows to send data to a different app, e.g. as a text message to someone.',
    original: 'Share',
    value: '分享'
  },
  'file-storage': {
    hint: 'Made up term. Allows users to store drawing in the browser. (not synced across devices)',
    original: 'Browser Storage',
    value: '保存至浏览器'
  },
  'file-storage-thumb-title': {
    hint: 'when reopening or reloading',
    original: 'Restores when reopening page',
    value: '重新打开页面时恢复'
  },
  'file-storage-about': {
    hint: 'link to Browser Storage help/user manual',
    original: 'About Browser Storage',
    value: '关于保存至浏览器'
  },
  'file-storage-cant-access': {
    hint: 'an error. Can’t access the storage.',
    original: "Can't access",
    value: '无法获取'
  },
  'file-storage-empty': {
    hint: 'nothing stored',
    original: 'Empty',
    value: '无内容'
  },
  'file-storage-store': {
    hint: 'verb',
    original: 'Store',
    value: '保存'
  },
  'file-storage-clear': {
    original: 'Clear',
    value: '清除'
  },
  'file-storage-storing': {
    hint: 'while it is in the process of storing',
    original: 'Storing',
    value: '保存中'
  },
  'file-storage-overwrite': {
    hint: 'overwrite what is already stored',
    original: 'Overwrite',
    value: '覆盖'
  },
  'file-storage-min-ago': {
    hint: "{x} <- needs to stay, it's a placeholder.",
    original: '{x}min ago',
    value: '{x}分钟前'
  },
  'file-storage-hours-ago': {
    original: '{x}h ago',
    value: '{x}小时前'
  },
  'file-storage-days-ago': {
    original: '{x}d ago',
    value: '{x}天前'
  },
  'file-storage-month-ago': {
    original: '> 1month ago',
    value: '>一个月前'
  },
  'file-storage-restored': {
    original: 'Restored from Browser Storage',
    value: '从浏览器内存中恢复'
  },
  'file-storage-stored': {
    original: 'Stored to Browser Storage',
    value: '保存至浏览器内存'
  },
  'file-storage-failed': {
    original: 'Failed to store to Browser Storage',
    value: '保存失败'
  },
  'file-storage-failed-1': {
    original: 'Failed to store. Possible causes:',
    value: '保存失败。可能是由于：'
  },
  'file-storage-failed-2': {
    original: 'Out of disk space',
    value: '磁盘空间不足'
  },
  'file-storage-failed-3': {
    original: 'Storage disabled in incognito tab',
    value: '隐身页面中禁用存储功能'
  },
  'file-storage-failed-4': {
    hint: 'as in: unsupported feature',
    original: "Browser doesn't support storage",
    value: '浏览器不支持'
  },
  'file-storage-failed-clear': {
    original: 'Failed to clear.',
    value: '清除失败'
  },
  'file-upload': {
    hint: 'verb',
    original: 'Upload',
    value: '上传'
  },
  'cleared-layer': {
    hint: 'the layer has been cleared. It is now empty',
    original: 'Cleared layer',
    value: '图层已清除'
  },
  filled: {
    hint: 'layer got filled with a color',
    original: 'Filled',
    value: '图层已填充'
  },
  'new-title': {
    original: 'New Image',
    value: '新建项目'
  },
  'new-current': {
    hint: 'as in "reuse the current image resolution"',
    original: 'Current',
    value: '当前大小'
  },
  'new-fit': {
    hint: 'make dimensions of image fit your window size',
    original: 'Fit',
    value: '适应页面'
  },
  'new-oversize': {
    hint: 'like oversized clothes.',
    original: 'Oversize',
    value: '大画布'
  },
  'new-square': {
    hint: 'square image format',
    original: 'Square',
    value: '正方形'
  },
  'new-landscape': {
    hint: 'https://en.wikipedia.org/wiki/Page_orientation',
    original: 'Landscape',
    value: '横向尺寸'
  },
  'new-portrait': {
    original: 'Portrait',
    value: '纵向尺寸'
  },
  'new-screen': {
    hint: 'resolution of computer screen',
    original: 'Screen',
    value: '显示分辨率'
  },
  'new-video': {
    hint: 'dimensions of a video (usually 16:9)',
    original: 'Video',
    value: '视频'
  },
  'new-din-paper': {
    hint: 'https://en.wikipedia.org/wiki/Paper_size',
    original: 'DIN Paper',
    value: '纸张大小'
  },
  'new-px': {
    hint: 'abbreviation of pixel',
    original: 'px',
    value: '像素'
  },
  'new-ratio': {
    hint: 'aspect ratio',
    original: 'Ratio',
    value: '比例'
  },
  'upload-title': {
    hint: '"Imgur" is a website name.',
    original: 'Upload to Imgur',
    value: '上传到Imgur'
  },
  'upload-link-notice': {
    hint: 'Explaining to user even though their upload is unlisted, they should be careful who they share the link with. No password protection.',
    original: 'Anyone with the link to your uploaded image will be able to view it.',
    value: '他人可以通过生成的图片链接查看你的作品。'
  },
  'upload-name': {
    hint: 'noun',
    original: 'Title',
    value: '标题'
  },
  'upload-title-untitled': {
    original: 'Untitled',
    value: '未命名'
  },
  'upload-caption': {
    hint: 'as in image caption / description',
    original: 'Caption',
    value: '描述'
  },
  'upload-submit': {
    hint: 'verb',
    original: 'Upload',
    value: '上传'
  },
  'upload-uploading': {
    hint: 'in the process of uploading',
    original: 'Uploading...',
    value: '上传中...'
  },
  'upload-success': {
    original: 'Upload Successful',
    value: '上传成功'
  },
  'upload-failed': {
    original: 'Upload failed.',
    value: '上传失败'
  },
  'upload-delete': {
    original: 'To delete your image from Imgur visit:',
    value: '要从Imgur删除你的图片, 请访问:'
  },
  'cropcopy-title-copy': {
    original: 'Copy To Clipboard',
    value: '复制到剪贴板'
  },
  'cropcopy-title-crop': {
    hint: 'Cropping is a common feature in image editing.',
    original: 'Crop',
    value: '裁剪'
  },
  'cropcopy-click-hold': {
    original: 'Right-click or press hold to copy.',
    value: '点击右键或长按进行复制。'
  },
  'cropcopy-btn-copy': {
    hint: 'confirmation button. Should be short.',
    original: 'To Clipboard',
    value: '至剪贴板'
  },
  'cropcopy-copied': {
    original: 'Copied.',
    value: '已复制'
  },
  'cropcopy-btn-crop': {
    hint: 'confirmation button. Should be short.',
    original: 'Apply Crop',
    value: '应用裁剪'
  },
  'crop-drag-to-crop': {
    hint: 'drag the mouse to adjust cropping',
    original: 'Drag to crop',
    value: '拖动裁剪'
  },
  'filter-crop-extend': {
    original: 'Crop/Extend',
    value: '画布大小'
  },
  'filter-flip': {
    original: 'Flip',
    value: '翻转'
  },
  'filter-perspective': {
    hint: 'perspective transformation',
    original: 'Perspective',
    value: '透视'
  },
  'filter-resize': {
    original: 'Resize',
    value: '图像大小'
  },
  'filter-rotate': {
    original: 'Rotate',
    value: '旋转'
  },
  'filter-transform': {
    hint: 'more generic transformation. Commonly known as "free transform"',
    original: 'Transform',
    value: '自由变换'
  },
  'filter-bright-contrast': {
    hint: 'brightness contrast',
    original: 'Bright/Contrast',
    value: '亮度/对比'
  },
  'filter-curves': {
    hint: 'color curves',
    original: 'Curves',
    value: '曲线'
  },
  'filter-hue-sat': {
    original: 'Hue/Saturation',
    value: '色相/饱和度'
  },
  'filter-invert': {
    hint: 'invert the colors',
    original: 'Invert',
    value: '反相'
  },
  'filter-tilt-shift': {
    hint: 'or just depth-of-field. https://en.wikipedia.org/wiki/Tilt%E2%80%93shift_photography',
    original: 'Tilt Shift',
    value: '移轴'
  },
  'filter-to-alpha': {
    hint: 'feature that can isolate line drawings if it is a black and white image.',
    original: 'To Alpha',
    value: '转换至Alpha'
  },
  'filter-triangle-blur': {
    hint: 'or just blur',
    original: 'Triangle Blur',
    value: '模糊'
  },
  'filter-unsharp-mask': {
    hint: 'or just sharpen, https://en.wikipedia.org/wiki/Unsharp_masking',
    original: 'Unsharp Mask',
    value: 'USM 锐化'
  },
  'filter-crop-title': {
    hint: 'same as the button, but can be longer',
    original: 'Crop / Extend',
    value: '画布大小'
  },
  'filter-crop-description': {
    hint: 'descriptions explain the "filter" a tiny bit. Most importantly it says if it’s applied to a single layer, or the entire image (all layer)',
    original: 'Crop or extend the image.',
    value: '裁剪图片'
  },
  'filter-crop-left': {
    original: 'Left',
    value: '左'
  },
  'filter-crop-right': {
    original: 'Right',
    value: '右'
  },
  'filter-crop-top': {
    original: 'Top',
    value: '上'
  },
  'filter-crop-bottom': {
    original: 'Bottom',
    value: '下'
  },
  'filter-crop-rule-thirds': {
    hint: 'https://en.wikipedia.org/wiki/Rule_of_thirds',
    original: 'Rule of Thirds',
    value: '三分法'
  },
  'filter-crop-fill': {
    hint: 'If image gets extended, what color to fill that new area with',
    original: 'Fill',
    value: '填充'
  },
  'filter-flip-title': {
    hint: 'same as the button, but can be longer',
    original: 'Flip',
    value: '翻转'
  },
  'filter-flip-description': {
    original: 'Flips layer or whole image.',
    value: '翻转图层或整个图像'
  },
  'filter-flip-horizontal': {
    original: 'Horizontal',
    value: '水平'
  },
  'filter-flip-vertical': {
    original: 'Vertical',
    value: '垂直'
  },
  'filter-flip-image': {
    original: 'Flip Image',
    value: '翻转图像'
  },
  'filter-flip-layer': {
    original: 'Flip Layer',
    value: '翻转图层'
  },
  'filter-perspective-title': {
    hint: 'same as the button, but can be longer',
    original: 'Perspective',
    value: '透视'
  },
  'filter-perspective-description': {
    original: 'Transforms the selected layer.',
    value: '变换已选图层'
  },
  'filter-resize-title': {
    hint: 'same as the button, but can be longer',
    original: 'Resize',
    value: '图像大小'
  },
  'filter-resize-description': {
    original: 'Resizes the image.',
    value: '更改图像大小'
  },
  'filter-rotate-title': {
    hint: 'same as the button, but can be longer',
    original: 'Rotate',
    value: '旋转'
  },
  'filter-rotate-description': {
    original: 'Rotates the image.',
    value: '旋转图像'
  },
  'filter-transform-empty': {
    hint: 'nothing on the layer, just transparency',
    original: 'Layer is empty.',
    value: '图层为空'
  },
  'filter-transform-title': {
    hint: 'same as the button, but can be longer',
    original: 'Transform',
    value: '变换'
  },
  'filter-transform-description': {
    hint: 'as in the Shift key.',
    original: 'Transforms selected layer. Hold Shift for additional behavior.',
    value: '变换已选图层。按住Shift操作。'
  },
  'filter-transform-rotation': {
    hint: 'or Angle',
    original: 'Rotation',
    value: '旋转'
  },
  'filter-transform-flip': {
    original: 'Flip',
    value: '翻转'
  },
  'filter-transform-center': {
    hint: 'verb or noun',
    original: 'Center',
    value: '居中'
  },
  'filter-transform-constrain': {
    hint: 'short version of "constrain proportions" – feature that locks the aspect ratio',
    original: 'Constrain',
    value: '保持'
  },
  'filter-transform-snap': {
    hint: 'or snapping. Common feature in graphics software. Makes stuff snap into place so it’s easier to align elements in an image',
    original: 'Snap',
    value: '对齐'
  },
  'filter-transform-snap-title': {
    hint: 'same as above, but as a tooltip',
    original: 'Snap Rotation And Position',
    value: '旋转对齐/水平对齐'
  },
  'filter-bright-contrast-title': {
    hint: 'same as the button, but can be longer',
    original: 'Brightness / Contrast',
    value: '亮度/对比'
  },
  'filter-bright-contrast-description': {
    original: 'Change brightness and contrast for the selected layer.',
    value: '更改已选图层的亮度和对比度。'
  },
  'filter-bright-contrast-brightness': {
    original: 'Brightness',
    value: '亮度'
  },
  'filter-bright-contrast-contrast': {
    original: 'Contrast',
    value: '对比'
  },
  'filter-curves-title': {
    hint: 'same as the button, but can be longer',
    original: 'Curves',
    value: '曲线'
  },
  'filter-curves-description': {
    original: 'Apply curves on the selected layer.',
    value: '应用曲线到已选图层。'
  },
  'filter-curves-all': {
    original: 'All',
    value: '全部'
  },
  'filter-hue-sat-title': {
    hint: 'same as the button, but can be longer',
    original: 'Hue / Saturation',
    value: '色相/饱和度'
  },
  'filter-hue-sat-description': {
    original: 'Change hue and saturation for the selected layer.',
    value: '更改已选图层的色相和饱和度。'
  },
  'filter-hue-sat-hue': {
    original: 'Hue',
    value: '色相'
  },
  'filter-hue-sat-saturation': {
    original: 'Saturation',
    value: '饱和度'
  },
  'filter-applied': {
    hint: 'used like this: „Invert“ applied. Informs that a filter was applied',
    original: 'applied',
    value: '应用'
  },
  'filter-tilt-shift-title': {
    hint: 'same as the button, but can be longer',
    original: 'Tilt Shift',
    value: '移轴'
  },
  'filter-tilt-shift-description': {
    original: 'Applies tilt shift on the selected layer.',
    value: '应用移轴到已选图层。'
  },
  'filter-tilt-shift-blur': {
    hint: 'words can be individually translated',
    original: 'Blur Radius',
    value: '模糊半径'
  },
  'filter-tilt-shift-gradient': {
    hint: 'words can be individually translated',
    original: 'Gradient Radius',
    value: '梯度半径'
  },
  'filter-to-alpha-title': {
    hint: 'same as the button, but can be longer',
    original: 'To Alpha',
    value: '至Alpha'
  },
  'filter-to-alpha-description': {
    hint: 'after ":" follow two options',
    original: 'Generates alpha channel for selected layer from:',
    value: '对已选图层生成Alpha通道：'
  },
  'filter-to-alpha-inverted-lum': {
    hint: 'luminance is same as the layer blend mode "luminosity"',
    original: 'Inverted Luminance',
    value: '亮度翻转'
  },
  'filter-to-alpha-lum': {
    original: 'Luminance',
    value: '亮度'
  },
  'filter-to-alpha-replace': {
    hint: 'What color to replace the rgb channels with',
    original: 'Replace RGB',
    value: '替换RGB'
  },
  'filter-triangle-blur-title': {
    hint: 'same as the button, but can be longer',
    original: 'Triangle Blur',
    value: '模糊'
  },
  'filter-triangle-blur-description': {
    original: 'Applies triangle blur on the selected layer.',
    value: '应用模糊到已选图层。'
  },
  'filter-unsharp-mask-title': {
    hint: 'same as the button, but can be longer',
    original: 'Unsharp Mask',
    value: 'USM锐化'
  },
  'filter-unsharp-mask-description': {
    original: 'Sharpens the selected layer by scaling pixels away from the average of their neighbors.',
    value: '根据附近像素的均值应用锐化到已选图层。'
  },
  'filter-unsharp-mask-strength': {
    original: 'Strength',
    value: '强度'
  },
  'filter-grid': {
    original: 'Grid',
    value: '网格'
  },
  'filter-grid-description': {
    original: 'Draws grid on selected layer.',
    value: '给当前层添加网格线。'
  },
  'filter-noise': {
    original: 'Noise',
    value: '噪音'
  },
  'filter-noise-description': {
    original: 'Adds noise to selected layer.',
    value: '应用噪音到已选图层。'
  },
  'filter-noise-scale': {
    original: 'Scale',
    value: '图案大小'
  },
  'filter-noise-alpha': {
    original: 'Alpha',
    value: 'Alpha'
  },
  'filter-pattern': {
    original: 'Pattern',
    value: '图案'
  },
  'filter-pattern-description': {
    original: 'Generates pattern on selected layer. Drag the preview for further controls.',
    value: '为所选图层生成图案。拖动鼠标进行更多操作。'
  },
  'filter-distort': {
    original: 'Distort',
    value: '变形'
  },
  'filter-distort-description': {
    original: 'Distorts the selected layer.',
    value: '对所选图层进行变形操作。'
  },
  'filter-distort-phase': {
    original: 'Phase',
    value: '相位'
  },
  'filter-distort-stepsize': {
    original: 'Step Size',
    value: '步长'
  },
  'filter-distort-sync-xy': {
    original: 'Sync XY',
    value: '同步XY'
  },
  'filter-vanish-point': {
    original: 'Vanish Point',
    value: '消失点'
  },
  'filter-vanish-point-title': {
    original: 'Vanishing Point',
    value: '消失点'
  },
  'filter-vanish-point-description': {
    original: 'Adds vanishing point to selected layer. Drag preview to move.',
    value: '添加消失点至所选图层。 拖动鼠标移动消失点。'
  },
  'filter-vanish-point-lines': {
    hint: 'As in: the number of lines',
    original: 'Lines',
    value: '线条数量'
  },
  'import-opening': {
    hint: 'in the process of opening a large file',
    original: 'Opening file...',
    value: '打开文件...'
  },
  'import-title': {
    original: 'Import Image',
    value: '导入图像'
  },
  'import-too-large': {
    original: 'Image too large, will be downscaled.',
    value: '图像过大，将会进行缩小。'
  },
  'import-btn-as-layer': {
    hint: 'import as layer. Button label, should be short',
    original: 'As Layer',
    value: '作为图层'
  },
  'import-btn-as-image': {
    hint: 'import as image. Button label, should be short',
    original: 'As Image',
    value: '作为图像'
  },
  'import-as-layer-title': {
    original: 'Import Image as New Layer',
    value: '导入图像作为新图层'
  },
  'import-as-layer-description': {
    original: 'Adjust the position of the imported image.',
    value: '调整导入图像的位置。'
  },
  'import-as-layer-limit-reached': {
    hint: 'Kleki allows only a certain number of layers',
    original: 'Layer limit reached. Image will be placed on existing layer.',
    value: '达到图层数量上限。图像将会应用到已有图层。'
  },
  'import-as-layer-fit': {
    hint: 'verb. imported image made to fit inside canvas.',
    original: 'Fit',
    value: '适应'
  },
  'import-flatten': {
    hint: 'Turn image that has multiple layers into an image that has only one layer.',
    original: 'Flatten image',
    value: '拼合图像'
  },
  'import-unsupported-file': {
    hint: 'e.g. user tried to open a WAV',
    original: 'Unsupported file type. See Help for supported types.',
    value: '不支持此类文件类型。查看帮助。'
  },
  'import-broken-file': {
    hint: 'if an image file is broken',
    original: "Couldn't load image. File might be corrupted.",
    value: '不能加载图像。文件可能受损。'
  },
  'import-psd-unsupported': {
    hint: 'PSD is photoshop file format. flatten as in „flatten image“ in photoshop. Merged all layers',
    original: 'Unsupported features. PSD had to be flattened.',
    value: '不支持该功能。PSD需要拼合。'
  },
  'import-psd-limited-support': {
    hint: 'PSD has lots of fancy features that Kleki doesn\'t have, so when importing a PSD it often has to simplify things. So it might look different compared to when opening in Photoshop. We’re informing the user if they "flatten" the image it will be accurate despite losing layers. The user has to weigh, do they care about having layers, or do they care about it looking right.',
    original: 'PSD support is limited. Flattened will more likely look correct.',
    value: 'PSD支持受限。拼合功能将会更近原始图像。'
  },
  'import-psd-too-large': {
    original: 'Image exceeds maximum dimensions of {x} x {x} pixels. Unable to import.',
    value: '图像超过{x} x {x}个像素。不能导入。'
  },
  'import-psd-size': {
    original: 'Image size',
    value: '图像大小'
  },
  'hand-reset': {
    hint: 'resets zoom (to 100%) and rotation (to 0°)',
    original: 'Reset',
    value: '重置'
  },
  'hand-fit': {
    hint: 'makes canvas cover whole working area',
    original: 'Fit',
    value: '适应'
  },
  'bucket-tolerance': {
    hint: 'a common feature for paint bucket',
    original: 'Tolerance',
    value: '容差'
  },
  'bucket-sample': {
    hint: 'like "taking a sample"',
    original: 'Sample',
    value: '采样'
  },
  'bucket-sample-title': {
    original: 'Which layers to sample color from',
    value: '从特定图层进行色彩采样'
  },
  'bucket-sample-all': {
    hint: 'all layers',
    original: 'All',
    value: '全部'
  },
  'bucket-sample-active': {
    hint: 'currently active layer',
    original: 'Active',
    value: '当前'
  },
  'bucket-sample-above': {
    hint: 'layer above active layer',
    original: 'Above',
    value: '之前'
  },
  'bucket-grow': {
    hint: 'verb. Or expand.',
    original: 'Grow',
    value: '填充扩展'
  },
  'bucket-grow-title': {
    original: 'Grow filled area (in pixels)',
    value: '扩展填充的区域（像素）'
  },
  'bucket-contiguous': {
    hint: 'common setting for paint bucket in image editing software',
    original: 'Contiguous',
    value: '连续的'
  },
  'bucket-contiguous-title': {
    hint: 'tooltip explaining Contiguous',
    original: 'Only fill connected areas',
    value: '仅填充相连的区域'
  },
  'gradient-linear': {
    original: 'Linear',
    value: '线性'
  },
  'gradient-linear-mirror': {
    original: 'Linear-Mirror',
    value: '对称'
  },
  'gradient-radial': {
    original: 'Radial',
    value: '径向'
  },
  'shape-stroke': {
    original: 'Stroke',
    value: '线条'
  },
  'shape-fill': {
    original: 'Fill',
    value: '填充'
  },
  'shape-rect': {
    hint: 'rectangle shape',
    original: 'Rectangle',
    value: '方形'
  },
  'shape-ellipse': {
    hint: 'ellipse shape',
    original: 'Ellipse',
    value: '圆形'
  },
  'shape-line': {
    original: 'Line',
    value: '线条'
  },
  'shape-line-width': {
    original: 'Line Width',
    value: '线条宽度'
  },
  'shape-outwards': {
    hint: 'grows shape from the center outwards',
    original: 'Outwards',
    value: '自中心向外'
  },
  'shape-fixed': {
    hint: 'fixed ratio of 1:1',
    original: 'Fixed 1:1',
    value: '锁定 1:1'
  },
  'text-instruction': {
    original: 'Click canvas to place text',
    value: '点击画布添加文本'
  },
  'text-title': {
    original: 'Add Text',
    value: '添加文本'
  },
  'text-text': {
    original: 'Text',
    value: '文本'
  },
  'text-font': {
    original: 'Font',
    value: '字体'
  },
  'text-placeholder': {
    hint: 'placeholder in text input.',
    original: 'Your text',
    value: '请输入'
  },
  'text-color': {
    original: 'Color',
    value: '色彩'
  },
  'text-size': {
    original: 'Size',
    value: '大小'
  },
  'text-line-height': {
    original: 'Line Height',
    value: '行间距'
  },
  'text-letter-spacing': {
    original: 'Letter Spacing',
    value: '字符间距'
  },
  'text-left': {
    hint: 'left, center, right text formatting like in Word',
    original: 'Left',
    value: '左对齐'
  },
  'text-center': {
    original: 'Center',
    value: '居中'
  },
  'text-right': {
    original: 'Right',
    value: '右对齐'
  },
  'text-italic': {
    original: 'Italic',
    value: '斜体'
  },
  'text-bold': {
    original: 'Bold',
    value: '加粗'
  },
  'save-reminder-title': {
    hint: 'Save Reminder is a popup that shows up after 20 minutes of not saving. Allows user to save on the spot.',
    original: 'Unsaved Work',
    value: '作品未保存'
  },
  'save-reminder-text': {
    hint: 'turns into: "...saved in <strong>12 minutes</strong>. Save..."',
    original: 'Image was not saved in {a} minutes{b}. Save now to prevent eventual loss.',
    value: '图画已{a}分钟{b}未保存。立刻保存以避免进度丢失。'
  },
  'save-reminder-save-psd': {
    original: 'Save As PSD',
    value: '保存为PSD'
  },
  'save-reminder-psd-layers': {
    original: 'PSD will remember all layers.',
    value: 'PSD可保留所有图层。'
  },
  'backup-drawing': {
    hint: '(Embed) If the upload failed, the user can backup/download their drawing.',
    original: 'You can backup your drawing.',
    value: '你可以备份绘画。'
  },
  submit: {
    original: 'Submit',
    value: '提交'
  },
  'submit-title': {
    hint: 'tooltip when hovering "Submit" button',
    original: 'Submit Drawing',
    value: '提交作品'
  },
  'submit-prompt': {
    hint: 'Dialog asking for confirmation',
    original: 'Submit drawing?',
    value: '确认提交？'
  },
  'submit-submitting': {
    hint: 'in the process of uploading',
    original: 'Submitting',
    value: '提交中'
  },
  'embed-init-loading': {
    hint: 'when opening the app',
    original: 'Loading app',
    value: '加载app'
  },
  'embed-init-waiting': {
    hint: 'The app is loaded, but it’s still waiting for image',
    original: 'Waiting for image',
    value: '图像上传中'
  },
  unsaved: {
    original: 'Unsaved',
    value: '未保存'
  },
  help: {
    hint: 'or user manual',
    original: 'Help',
    value: '帮助'
  },
  'tab-settings': {
    original: 'Settings',
    value: '设置'
  },
  'settings-language': {
    original: 'Language',
    value: '语言'
  },
  'settings-language-reload': {
    hint: 'changes will be visible after reloading the page',
    original: 'Will update after reloading.',
    value: '刷新后更改语言'
  },
  'settings-theme': {
    original: 'Theme',
    value: '主题'
  },
  'theme-dark': {
    original: 'Dark',
    value: '深色'
  },
  'theme-light': {
    original: 'Light',
    value: '浅色'
  },
  'terms-of-service': {
    original: 'Terms of Service',
    value: '服务条款'
  },
  licenses: {
    hint: 'as in software licenses',
    original: 'Licenses',
    value: '许可'
  },
  'source-code': {
    original: 'Source Code',
    value: '源代码'
  },
  auto: {
    hint: 'automatically decided',
    original: 'auto',
    value: '自动'
  },
  'zoom-in': {
    original: 'Zoom In',
    value: '放大'
  },
  'zoom-out': {
    original: 'Zoom Out',
    value: '缩小'
  },
  radius: {
    original: 'Radius',
    value: '半径'
  },
  'constrain-proportions': {
    original: 'Constrain Proportions',
    value: '保持纵横比'
  },
  width: {
    original: 'Width',
    value: '宽度'
  },
  height: {
    original: 'Height',
    value: '高度'
  },
  opacity: {
    hint: 'for layer opacity, brush opacity, text opacity, ...',
    original: 'Opacity',
    value: '不透明度'
  },
  red: {
    original: 'Red',
    value: '红'
  },
  green: {
    original: 'Green',
    value: '绿'
  },
  blue: {
    original: 'Blue',
    value: '蓝'
  },
  eraser: {
    hint: 'noun. As short as possible',
    original: 'Eraser',
    value: '橡皮擦'
  },
  center: {
    hint: 'verb',
    original: 'Center',
    value: '居中'
  },
  layers: {
    hint: 'layers in the context of image editing software',
    original: 'Layers',
    value: '图层'
  },
  background: {
    hint: 'as in background layer',
    original: 'Background',
    value: '背景'
  },
  'scaling-algorithm': {
    hint: 'Label for dropdown where user chooses which computer graphics algorithm should be used to scale the image',
    original: 'Scaling Algorithm',
    value: '缩放算法'
  },
  'algorithm-smooth': {
    original: 'Smooth',
    value: '平滑'
  },
  'algorithm-pixelated': {
    original: 'Pixelated',
    value: '像素化'
  },
  preview: {
    hint: 'subject. When applying a filter user sees a preview of what the result would look like.',
    original: 'Preview',
    value: '预览'
  },
  'angle-snap': {
    hint: 'Snapping. Like when transforming an image and it snaps to the side of the frame.',
    original: 'Snap',
    value: '对齐'
  },
  'angle-snap-title': {
    original: '45° Angle Snapping',
    value: '以45°角度对齐'
  },
  'lock-alpha': {
    hint: 'Short. Freezes the alpha channel of image. Images consist of 4 channels (red, green, blue, alpha). Alpha lock also found in Procreate and photoshop',
    original: 'Lock Alpha',
    value: '锁定'
  },
  'lock-alpha-title': {
    hint: "same as 'lock-alpha' but longer version. Shows up as a tooltip when hovering",
    original: "Locks layer's alpha channel",
    value: '锁定图层透明度'
  },
  reverse: {
    hint: 'Reversing the direction of a color gradient',
    original: 'Reverse',
    value: '反向'
  },
  'compare-before': {
    original: 'Before',
    value: '之前'
  },
  'compare-after': {
    original: 'After',
    value: '之后'
  },
  loading: {
    original: 'Loading',
    value: '加载中'
  }
}


code:
{
  'switch-ui-left-right': {
    hint: 'Button that switches layout from left to right, to accommodate left handed & right handed visitors.',
    original: 'Switch left/right UI',
    value: '向左/右切換'
  },
  'toggle-show-tools': {
    hint: 'Button that hides/shows the toolbar.',
    original: 'Show/Hide Tools',
    value: '顯示/隱藏工具'
  },
  scroll: {
    hint: 'Verb. As in scrolling a page.',
    original: 'Scroll',
    value: '上滑/下滑'
  },
  donate: {
    original: 'Donate',
    value: '贊助'
  },
  home: {
    hint: 'button with logo, top left of tools',
    original: 'Home',
    value: '主頁'
  },
  'modal-new-tab': {
    hint: 'as in browser tab',
    original: 'Open in new tab',
    value: '在新頁面打開'
  },
  'tab-edit': {
    hint: 'label for a tab that offer filters for making color adjustments, cropping, transforming, etc.',
    original: 'Edit',
    value: '編輯'
  },
  'tab-file': {
    hint: 'label for a tab that lets user save the image, import, upload, etc.',
    original: 'File',
    value: '文件'
  },
  'tool-brush': {
    hint: 'tool that lets user paint (like in ms paint or photoshop)',
    original: 'Brush',
    value: '畫筆工具'
  },
  'tool-paint-bucket': {
    original: 'Paint Bucket',
    value: '油漆桶'
  },
  'tool-gradient': {
    original: 'Gradient',
    value: '漸層'
  },
  'tool-shape': {
    hint: 'Tool for drawing rectangles, circles, lines',
    original: 'Shape',
    value: '形狀'
  },
  'tool-text': {
    hint: 'Tool for placing text on canvas',
    original: 'Text',
    value: '文本'
  },
  'tool-hand': {
    hint: 'Tool for navigating (or scrolling around) the canvas. Same name in Photoshop.',
    original: 'Hand Tool',
    value: '手型工具'
  },
  'tool-zoom': {
    original: 'Zoom',
    value: '縮放工具'
  },
  undo: {
    original: 'Undo',
    value: '撤銷'
  },
  redo: {
    original: 'Redo',
    value: '重做'
  },
  'brush-pen': {
    hint: 'Generic "brush" that feels a bit like a pen or marker, as opposed to a paint brush.',
    original: 'Pen',
    value: '畫筆'
  },
  'brush-blend': {
    hint: 'brush with watercolor feel. Makes colors blend/bleed into each other. Different from smudging though.',
    original: 'Blend',
    value: '水彩刷'
  },
  'brush-sketchy': {
    hint: 'Made up brush name. Pictures drawn with this brush often look like sketches.',
    original: 'Sketchy',
    value: '素描筆'
  },
  'brush-pixel': {
    original: 'Pixel',
    value: '像素化'
  },
  'brush-chemy': {
    hint: 'Made up brush name, derived from drawing applications "Webchemy" and "Alchemy"',
    original: 'Chemy',
    value: '異形圖形'
  },
  'brush-smudge': {
    hint: 'Common brush/tool in image editing software. Smudges colors around canvas.',
    original: 'Smudge',
    value: '暈染'
  },
  'brush-size': {
    original: 'Size',
    value: '筆刷大小'
  },
  'brush-blending': {
    hint: 'Wetness. How much colors will bleed into each other.',
    original: 'Blending',
    value: '水分量'
  },
  'brush-toggle-pressure': {
    hint: 'google "pressure sensitivity". Feature of Wacom tablets, Apple Pencil, XP Pen, etc.',
    original: 'Toggle Pressure Sensitivity',
    value: '筆壓敏度'
  },
  'brush-pen-circle': {
    hint: 'as in circle shape',
    original: 'Circle',
    value: '圓形'
  },
  'brush-pen-chalk': {
    hint: 'as in chalk texture',
    original: 'Chalk',
    value: '粉筆'
  },
  'brush-pen-calligraphy': {
    hint: 'like a "chisel tip marker"',
    original: 'Calligraphy',
    value: '斜角筆'
  },
  'brush-pen-square': {
    hint: 'as in square shape',
    original: 'Square',
    value: '方形'
  },
  'brush-sketchy-scale': {
    hint: 'How far the connecting lines of sketchy brush can reach.',
    original: 'Scale',
    value: '網格長度'
  },
  'brush-pixel-dither': {
    hint: 'Dithering/halftone pattern',
    original: 'Dither',
    value: '像素抖動'
  },
  'brush-chemy-fill': {
    hint: 'Like in MS Paint. A shape can have be outlined, and filled.',
    original: 'Fill',
    value: '填充'
  },
  'brush-chemy-stroke': {
    original: 'Stroke',
    value: '線條'
  },
  'brush-chemy-mirror-x': {
    original: 'Horizontal Symmetry',
    value: '水平對稱'
  },
  'brush-chemy-mirror-y': {
    original: 'Vertical Symmetry',
    value: '垂直對稱'
  },
  'brush-chemy-gradient': {
    hint: 'as in color gradient',
    original: 'Gradient',
    value: '漸變'
  },
  'brush-eraser-transparent-bg': {
    hint: 'as in transparent background/bottom layer',
    original: 'Transparent Background',
    value: '底層透明度'
  },
  stabilizer: {
    hint: 'Common feature in drawing software to make lines smoother',
    original: 'Stabilizer',
    value: '抖動修正'
  },
  'stabilizer-title': {
    hint: '-title keys are usually more verbose description. shown as a tooltip.',
    original: 'Stroke Stabilizer',
    value: '抖動修正線條'
  },
  eyedropper: {
    original: 'Eyedropper',
    value: '顏色選取'
  },
  'secondary-color': {
    hint: 'or sometimes called "background" color. Photoshop, MS Paint, etc. allow user to switch between two colors.',
    original: 'Secondary Color',
    value: '二級色'
  },
  'manual-color-input': {
    hint: 'A dialog where users can manually type the color, each channel a number. "mci" keys all related to this dialog.',
    original: 'Manual Color Input',
    value: '手動輸入顏色'
  },
  'mci-hex': {
    hint: 'as in hex code. Hex representation of color. „#f00“ → red',
    original: 'Hex',
    value: '16進制'
  },
  'mci-copy': {
    hint: 'verb',
    original: 'Copy',
    value: '複製'
  },
  'modal-ok': {
    hint: 'main confirmation button in dialogs. Can be to confirm an action, not just acknowledge information.',
    original: 'Ok',
    value: 'Ok'
  },
  'modal-cancel': {
    original: 'Cancel',
    value: '取消'
  },
  'modal-close': {
    hint: 'as in close a dialog box',
    original: 'Close',
    value: '關閉'
  },
  'layers-active-layer': {
    hint: 'currently selected layer that user is drawing on',
    original: 'Active Layer',
    value: '當前圖層'
  },
  'layers-layer': {
    original: 'Layer',
    value: '圖層'
  },
  'layers-copy': {
    hint: 'noun',
    original: 'copy',
    value: '副本'
  },
  'layers-blending': {
    hint: 'Common feature in image editing & drawing software. All layers-blend- keys relate to this. https://en.wikipedia.org/wiki/Blend_modes',
    original: 'Blending',
    value: '混合模式'
  },
  'layers-new': {
    hint: 'action',
    original: 'New Layer',
    value: '新建圖層'
  },
  'layers-remove': {
    hint: 'action',
    original: 'Remove Layer',
    value: '刪除圖層'
  },
  'layers-duplicate': {
    hint: 'action',
    original: 'Duplicate Layer',
    value: '複製圖層'
  },
  'layers-merge': {
    hint: 'action',
    original: 'Merge with layer below',
    value: '向下合併'
  },
  'layers-rename': {
    hint: 'action',
    original: 'Rename',
    value: '重命名'
  },
  'layers-active-layer-visible': {
    original: 'Active layer is visible',
    value: '當前圖層可見'
  },
  'layers-active-layer-hidden': {
    original: 'Active layer is hidden',
    value: '當前圖層隱藏'
  },
  'layers-visibility-toggle': {
    original: 'Layer Visibility',
    value: '圖層可見性'
  },
  'layers-blend-normal': {
    original: 'normal',
    value: '正常'
  },
  'layers-blend-darken': {
    original: 'darken',
    value: '變暗'
  },
  'layers-blend-multiply': {
    original: 'multiply',
    value: '正片疊底'
  },
  'layers-blend-color-burn': {
    original: 'color burn',
    value: '顏色加深'
  },
  'layers-blend-lighten': {
    original: 'lighten',
    value: '變亮'
  },
  'layers-blend-screen': {
    original: 'screen',
    value: '濾色'
  },
  'layers-blend-color-dodge': {
    original: 'color dodge',
    value: '顏色減淡'
  },
  'layers-blend-overlay': {
    original: 'overlay',
    value: '疊加'
  },
  'layers-blend-soft-light': {
    original: 'soft light',
    value: '柔光'
  },
  'layers-blend-hard-light': {
    original: 'hard light',
    value: '強光'
  },
  'layers-blend-difference': {
    original: 'difference',
    value: '差值'
  },
  'layers-blend-exclusion': {
    original: 'exclusion',
    value: '排除'
  },
  'layers-blend-hue': {
    original: 'hue',
    value: '色相'
  },
  'layers-blend-saturation': {
    original: 'saturation',
    value: '飽和度'
  },
  'layers-blend-color': {
    original: 'color',
    value: '顏色'
  },
  'layers-blend-luminosity': {
    original: 'luminosity',
    value: '明度'
  },
  'layers-rename-title': {
    hint: '-title in code usually means it shows up in a tooltip, or it’s the header of a dialog box, so it can be a little bit longer.',
    original: 'Rename Layer',
    value: '重命名圖層'
  },
  'layers-rename-name': {
    hint: 'noun',
    original: 'Name',
    value: '重命名'
  },
  'layers-rename-clear': {
    hint: 'aka action of deleting entered name',
    original: 'Clear Name',
    value: '清除'
  },
  'layers-rename-sketch': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Sketch',
    value: '草圖'
  },
  'layers-rename-colors': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Colors',
    value: '色彩'
  },
  'layers-rename-shading': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Shading',
    value: '陰影'
  },
  'layers-rename-lines': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Lines',
    value: '線條'
  },
  'layers-rename-effects': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Effects',
    value: '效果'
  },
  'layers-rename-foreground': {
    hint: 'noun. Name suggestion for a layer',
    original: 'Foreground',
    value: '前景'
  },
  'layers-merge-modal-title': {
    original: 'Merge/Mix Layers',
    value: '向下合併'
  },
  'layers-merge-description': {
    hint: 'After ":" a list of mix/blend modes is shown.',
    original: 'Merges the selected layer with the one underneath. Select the mix mode:',
    value: '選中層與底下一層合併。選擇混合模式：'
  },
  'file-no-autosave': {
    hint: "let user know they can't autosave, and there's no cloud storage. Keep short so fits on one line",
    original: 'No autosave, no cloud storage',
    value: '不能自動保存，沒有雲端儲存'
  },
  'file-new': {
    hint: 'action',
    original: 'New',
    value: '新建'
  },
  'file-import': {
    hint: 'action',
    original: 'Import',
    value: '打開'
  },
  'file-save': {
    hint: 'action',
    original: 'Save',
    value: '保存'
  },
  'file-format': {
    original: 'File Format',
    value: '檔案格式'
  },
  'file-copy': {
    hint: 'verb',
    original: 'Copy',
    value: '複製'
  },
  'file-copy-title': {
    original: 'Copy To Clipboard',
    value: '複製到剪貼板'
  },
  'file-share': {
    hint: 'Common feature on phones. Pressing share button allows to send data to a different app, e.g. as a text message to someone.',
    original: 'Share',
    value: '分享'
  },
  'file-storage': {
    hint: 'Made up term. Allows users to store drawing in the browser. (not synced across devices)',
    original: 'Browser Storage',
    value: '保存至瀏覽器'
  },
  'file-storage-thumb-title': {
    hint: 'when reopening or reloading',
    original: 'Restores when reopening page',
    value: '重新打開頁面時恢復'
  },
  'file-storage-about': {
    hint: 'link to Browser Storage help/user manual',
    original: 'About Browser Storage',
    value: '關於保存至瀏覽器'
  },
  'file-storage-cant-access': {
    hint: 'an error. Can’t access the storage.',
    original: "Can't access",
    value: '無法獲取'
  },
  'file-storage-empty': {
    hint: 'nothing stored',
    original: 'Empty',
    value: '無內容'
  },
  'file-storage-store': {
    hint: 'verb',
    original: 'Store',
    value: '保存'
  },
  'file-storage-clear': {
    original: 'Clear',
    value: '清除'
  },
  'file-storage-storing': {
    hint: 'while it is in the process of storing',
    original: 'Storing',
    value: '保存中'
  },
  'file-storage-overwrite': {
    hint: 'overwrite what is already stored',
    original: 'Overwrite',
    value: '覆蓋'
  },
  'file-storage-min-ago': {
    hint: "{x} <- needs to stay, it's a placeholder.",
    original: '{x}min ago',
    value: '{x}分鐘前'
  },
  'file-storage-hours-ago': {
    original: '{x}h ago',
    value: '{x}小時前'
  },
  'file-storage-days-ago': {
    original: '{x}d ago',
    value: '{x}天前'
  },
  'file-storage-month-ago': {
    original: '> 1month ago',
    value: '>一個月前'
  },
  'file-storage-restored': {
    original: 'Restored from Browser Storage',
    value: '從瀏覽器內存中恢復'
  },
  'file-storage-stored': {
    original: 'Stored to Browser Storage',
    value: '保存至瀏覽器內存'
  },
  'file-storage-failed': {
    original: 'Failed to store to Browser Storage',
    value: '保存失敗'
  },
  'file-storage-failed-1': {
    original: 'Failed to store. Possible causes:',
    value: '保存失敗。可能是由於：'
  },
  'file-storage-failed-2': {
    original: 'Out of disk space',
    value: '磁盤空間不足'
  },
  'file-storage-failed-3': {
    original: 'Storage disabled in incognito tab',
    value: '隱身頁面中禁用存儲功能'
  },
  'file-storage-failed-4': {
    hint: 'as in: unsupported feature',
    original: "Browser doesn't support storage",
    value: '瀏覽器不支持'
  },
  'file-storage-failed-clear': {
    original: 'Failed to clear.',
    value: '清除失敗'
  },
  'file-upload': {
    hint: 'verb',
    original: 'Upload',
    value: '上傳'
  },
  'cleared-layer': {
    hint: 'the layer has been cleared. It is now empty',
    original: 'Cleared layer',
    value: '圖層已清除'
  },
  filled: {
    hint: 'layer got filled with a color',
    original: 'Filled',
    value: '圖層已填充'
  },
  'new-title': {
    original: 'New Image',
    value: '新建項目'
  },
  'new-current': {
    hint: 'as in "reuse the current image resolution"',
    original: 'Current',
    value: '當前大小'
  },
  'new-fit': {
    hint: 'make dimensions of image fit your window size',
    original: 'Fit',
    value: '適應頁面'
  },
  'new-oversize': {
    hint: 'like oversized clothes.',
    original: 'Oversize',
    value: '大畫布'
  },
  'new-square': {
    hint: 'square image format',
    original: 'Square',
    value: '正方形'
  },
  'new-landscape': {
    hint: 'https://en.wikipedia.org/wiki/Page_orientation',
    original: 'Landscape',
    value: '橫向尺寸'
  },
  'new-portrait': {
    original: 'Portrait',
    value: '縱向尺寸'
  },
  'new-screen': {
    hint: 'resolution of computer screen',
    original: 'Screen',
    value: '顯示分辨率'
  },
  'new-video': {
    hint: 'dimensions of a video (usually 16:9)',
    original: 'Video',
    value: '視頻'
  },
  'new-din-paper': {
    hint: 'https://en.wikipedia.org/wiki/Paper_size',
    original: 'DIN Paper',
    value: '紙張大小'
  },
  'new-px': {
    hint: 'abbreviation of pixel',
    original: 'px',
    value: '像素'
  },
  'new-ratio': {
    hint: 'aspect ratio',
    original: 'Ratio',
    value: '比例'
  },
  'upload-title': {
    hint: '"Imgur" is a website name.',
    original: 'Upload to Imgur',
    value: '上傳到Imgur'
  },
  'upload-link-notice': {
    hint: 'Explaining to user even though their upload is unlisted, they should be careful who they share the link with. No password protection.',
    original: 'Anyone with the link to your uploaded image will be able to view it.',
    value: '他人可以通過生成的圖片鏈接查看你的作品。 '
  },
  'upload-name': {
    hint: 'noun',
    original: 'Title',
    value: '標題'
  },
  'upload-title-untitled': {
    original: 'Untitled',
    value: '未命名'
  },
  'upload-caption': {
    hint: 'as in image caption / description',
    original: 'Caption',
    value: '描述'
  },
  'upload-submit': {
    hint: 'verb',
    original: 'Upload',
    value: '上傳'
  },
  'upload-uploading': {
    hint: 'in the process of uploading',
    original: 'Uploading...',
    value: '上傳中...'
  },
  'upload-success': {
    original: 'Upload Successful',
    value: '上傳成功'
  },
  'upload-failed': {
    original: 'Upload failed.',
    value: '上傳失敗'
  },
  'upload-delete': {
    original: 'To delete your image from Imgur visit:',
    value: '要從Imgur刪除你的圖片, 請訪問:'
  },
  'cropcopy-title-copy': {
    original: 'Copy To Clipboard',
    value: '複製到剪貼板'
  },
  'cropcopy-title-crop': {
    hint: 'Cropping is a common feature in image editing.',
    original: 'Crop',
    value: '裁剪'
  },
  'cropcopy-click-hold': {
    original: 'Right-click or press hold to copy.',
    value: '點擊右鍵或長按進行複制。'
  },
  'cropcopy-btn-copy': {
    hint: 'confirmation button. Should be short.',
    original: 'To Clipboard',
    value: '至剪貼板'
  },
  'cropcopy-copied': {
    original: 'Copied.',
    value: '已複製'
  },
  'cropcopy-btn-crop': {
    hint: 'confirmation button. Should be short.',
    original: 'Apply Crop',
    value: '應用裁剪'
  },
  'crop-drag-to-crop': {
    hint: 'drag the mouse to adjust cropping',
    original: 'Drag to crop',
    value: '拖動裁剪'
  },
  'filter-crop-extend': {
    original: 'Crop/Extend',
    value: '畫布大小'
  },
  'filter-flip': {
    original: 'Flip',
    value: '翻轉'
  },
  'filter-perspective': {
    hint: 'perspective transformation',
    original: 'Perspective',
    value: '透視'
  },
  'filter-resize': {
    original: 'Resize',
    value: '圖像大小'
  },
  'filter-rotate': {
    original: 'Rotate',
    value: '旋轉'
  },
  'filter-transform': {
    hint: 'more generic transformation. Commonly known as "free transform"',
    original: 'Transform',
    value: '自由變換'
  },
  'filter-bright-contrast': {
    hint: 'brightness contrast',
    original: 'Bright/Contrast',
    value: '亮度/對比'
  },
  'filter-curves': {
    hint: 'color curves',
    original: 'Curves',
    value: '曲線'
  },
  'filter-hue-sat': {
    original: 'Hue/Saturation',
    value: '色相/飽和度'
  },
  'filter-invert': {
    hint: 'invert the colors',
    original: 'Invert',
    value: '反相'
  },
  'filter-tilt-shift': {
    hint: 'or just depth-of-field. https://en.wikipedia.org/wiki/Tilt%E2%80%93shift_photography',
    original: 'Tilt Shift',
    value: '移軸'
  },
  'filter-to-alpha': {
    hint: 'feature that can isolate line drawings if it is a black and white image.',
    original: 'To Alpha',
    value: '轉換至Alpha'
  },
  'filter-triangle-blur': {
    hint: 'or just blur',
    original: 'Triangle Blur',
    value: '模糊'
  },
  'filter-unsharp-mask': {
    hint: 'or just sharpen, https://en.wikipedia.org/wiki/Unsharp_masking',
    original: 'Unsharp Mask',
    value: 'USM 銳化'
  },
  'filter-crop-title': {
    hint: 'same as the button, but can be longer',
    original: 'Crop / Extend',
    value: '畫布大小'
  },
  'filter-crop-description': {
    hint: 'descriptions explain the "filter" a tiny bit. Most importantly it says if it’s applied to a single layer, or the entire image (all layer)',
    original: 'Crop or extend the image.',
    value: '裁剪圖片'
  },
  'filter-crop-left': {
    original: 'Left',
    value: '左'
  },
  'filter-crop-right': {
    original: 'Right',
    value: '右'
  },
  'filter-crop-top': {
    original: 'Top',
    value: '上'
  },
  'filter-crop-bottom': {
    original: 'Bottom',
    value: '下'
  },
  'filter-crop-rule-thirds': {
    hint: 'https://en.wikipedia.org/wiki/Rule_of_thirds',
    original: 'Rule of Thirds',
    value: '三分法'
  },
  'filter-crop-fill': {
    hint: 'If image gets extended, what color to fill that new area with',
    original: 'Fill',
    value: '填充'
  },
  'filter-flip-title': {
    hint: 'same as the button, but can be longer',
    original: 'Flip',
    value: '翻轉'
  },
  'filter-flip-description': {
    original: 'Flips layer or whole image.',
    value: '翻轉圖層或整個圖像'
  },
  'filter-flip-horizontal': {
    original: 'Horizontal',
    value: '水平'
  },
  'filter-flip-vertical': {
    original: 'Vertical',
    value: '垂直'
  },
  'filter-flip-image': {
    original: 'Flip Image',
    value: '翻轉圖像'
  },
  'filter-flip-layer': {
    original: 'Flip Layer',
    value: '翻轉圖層'
  },
  'filter-perspective-title': {
    hint: 'same as the button, but can be longer',
    original: 'Perspective',
    value: '透視'
  },
  'filter-perspective-description': {
    original: 'Transforms the selected layer.',
    value: '變換已選圖層'
  },
  'filter-resize-title': {
    hint: 'same as the button, but can be longer',
    original: 'Resize',
    value: '圖像大小'
  },
  'filter-resize-description': {
    original: 'Resizes the image.',
    value: '更改圖像大小'
  },
  'filter-rotate-title': {
    hint: 'same as the button, but can be longer',
    original: 'Rotate',
    value: '旋轉'
  },
  'filter-rotate-description': {
    original: 'Rotates the image.',
    value: '旋轉圖像'
  },
  'filter-transform-empty': {
    hint: 'nothing on the layer, just transparency',
    original: 'Layer is empty.',
    value: '圖層為空'
  },
  'filter-transform-title': {
    hint: 'same as the button, but can be longer',
    original: 'Transform',
    value: '變換'
  },
  'filter-transform-description': {
    hint: 'as in the Shift key.',
    original: 'Transforms selected layer. Hold Shift for additional behavior.',
    value: '變換已選圖層。按住Shift操作。 '
  },
  'filter-transform-rotation': {
    hint: 'or Angle',
    original: 'Rotation',
    value: '旋轉'
  },
  'filter-transform-flip': {
    original: 'Flip',
    value: '翻轉'
  },
  'filter-transform-center': {
    hint: 'verb or noun',
    original: 'Center',
    value: '居中'
  },
  'filter-transform-constrain': {
    hint: 'short version of "constrain proportions" – feature that locks the aspect ratio',
    original: 'Constrain',
    value: '保持'
  },
  'filter-transform-snap': {
    hint: 'or snapping. Common feature in graphics software. Makes stuff snap into place so it’s easier to align elements in an image',
    original: 'Snap',
    value: '對齊'
  },
  'filter-transform-snap-title': {
    hint: 'same as above, but as a tooltip',
    original: 'Snap Rotation And Position',
    value: '旋轉對齊/水平對齊'
  },
  'filter-bright-contrast-title': {
    hint: 'same as the button, but can be longer',
    original: 'Brightness / Contrast',
    value: '亮度/對比'
  },
  'filter-bright-contrast-description': {
    original: 'Change brightness and contrast for the selected layer.',
    value: '更改已選圖層的亮度和對比度。 '
  },
  'filter-bright-contrast-brightness': {
    original: 'Brightness',
    value: '亮度'
  },
  'filter-bright-contrast-contrast': {
    original: 'Contrast',
    value: '對比'
  },
  'filter-curves-title': {
    hint: 'same as the button, but can be longer',
    original: 'Curves',
    value: '曲線'
  },
  'filter-curves-description': {
    original: 'Apply curves on the selected layer.',
    value: '應用曲線到已選圖層。 '
  },
  'filter-curves-all': {
    original: 'All',
    value: '全部'
  },
  'filter-hue-sat-title': {
    hint: 'same as the button, but can be longer',
    original: 'Hue / Saturation',
    value: '色相/飽和度'
  },
  'filter-hue-sat-description': {
    original: 'Change hue and saturation for the selected layer.',
    value: '更改已選圖層的色相和飽和度。 '
  },
  'filter-hue-sat-hue': {
    original: 'Hue',
    value: '色相'
  },
  'filter-hue-sat-saturation': {
    original: 'Saturation',
    value: '飽和度'
  },
  'filter-applied': {
    hint: 'used like this: „Invert“ applied. Informs that a filter was applied',
    original: 'applied',
    value: '應用'
  },
  'filter-tilt-shift-title': {
    hint: 'same as the button, but can be longer',
    original: 'Tilt Shift',
    value: '移軸'
  },
  'filter-tilt-shift-description': {
    original: 'Applies tilt shift on the selected layer.',
    value: '應用移軸到已選圖層。 '
  },
  'filter-tilt-shift-blur': {
    hint: 'words can be individually translated',
    original: 'Blur Radius',
    value: '模糊半徑'
  },
  'filter-tilt-shift-gradient': {
    hint: 'words can be individually translated',
    original: 'Gradient Radius',
    value: '梯度半徑'
  },
  'filter-to-alpha-title': {
    hint: 'same as the button, but can be longer',
    original: 'To Alpha',
    value: '至Alpha'
  },
  'filter-to-alpha-description': {
    hint: 'after ":" follow two options',
    original: 'Generates alpha channel for selected layer from:',
    value: '對已選圖層生成Alpha通道：'
  },
  'filter-to-alpha-inverted-lum': {
    hint: 'luminance is same as the layer blend mode "luminosity"',
    original: 'Inverted Luminance',
    value: '亮度翻轉'
  },
  'filter-to-alpha-lum': {
    original: 'Luminance',
    value: '亮度'
  },
  'filter-to-alpha-replace': {
    hint: 'What color to replace the rgb channels with',
    original: 'Replace RGB',
    value: '替換RGB'
  },
  'filter-triangle-blur-title': {
    hint: 'same as the button, but can be longer',
    original: 'Triangle Blur',
    value: '模糊'
  },
  'filter-triangle-blur-description': {
    original: 'Applies triangle blur on the selected layer.',
    value: '應用模糊到已選圖層。 '
  },
  'filter-unsharp-mask-title': {
    hint: 'same as the button, but can be longer',
    original: 'Unsharp Mask',
    value: 'USM銳化'
  },
  'filter-unsharp-mask-description': {
    original: 'Sharpens the selected layer by scaling pixels away from the average of their neighbors.',
    value: '根據附近像素的均值應用銳化到已選圖層。 '
  },
  'filter-unsharp-mask-strength': {
    original: 'Strength',
    value: '強度'
  },
  'filter-grid': {
    original: 'Grid',
    value: '網格'
  },
  'filter-grid-description': {
    original: 'Draws grid on selected layer.',
    value: '給當前層添加網格線。'
  },
  'filter-noise': {
    original: 'Noise',
    value: '噪聲'
  },
  'filter-noise-description': {
    original: 'Adds noise to selected layer.',
    value: '應用噪聲到達選擇層。'
  },
  'filter-noise-scale': {
    original: 'Scale',
    value: '圖案大小'
  },
  'filter-noise-alpha': {
    original: 'Alpha',
    value: 'Alpha'
  },
  'filter-pattern': {
    original: 'Pattern',
    value: '圖案'
  },
  'filter-pattern-description': {
    original: 'Generates pattern on selected layer. Drag the preview for further controls.',
    value: '在選定圖層上生成圖案。 拖動預覽以獲得更多控制。'
  },
  'filter-distort': {
    original: 'Distort',
    value: '扭曲'
  },
  'filter-distort-description': {
    original: 'Distorts the selected layer.',
    value: '扭曲選定的圖層。'
  },
  'filter-distort-phase': {
    original: 'Phase',
    value: '階段'
  },
  'filter-distort-stepsize': {
    original: 'Step Size',
    value: '步長'
  },
  'filter-distort-sync-xy': {
    original: 'Sync XY',
    value: '同步 XY'
  },
  'filter-vanish-point': {
    original: 'Vanish Point',
    value: '消失點'
  },
  'filter-vanish-point-title': {
    original: 'Vanishing Point',
    value: '消失點'
  },
  'filter-vanish-point-description': {
    original: 'Adds vanishing point to selected layer. Drag preview to move.',
    value: '添加消失點至所選圖層。'
  },
  'filter-vanish-point-lines': {
    hint: 'As in: the number of lines',
    original: 'Lines',
    value: '線條數量'
  },
  'import-opening': {
    hint: 'in the process of opening a large file',
    original: 'Opening file...',
    value: '打開文件...'
  },
  'import-title': {
    original: 'Import Image',
    value: '導入圖像'
  },
  'import-too-large': {
    original: 'Image too large, will be downscaled.',
    value: '圖像過大，將會進行縮小。 '
  },
  'import-btn-as-layer': {
    hint: 'import as layer. Button label, should be short',
    original: 'As Layer',
    value: '作為圖層'
  },
  'import-btn-as-image': {
    hint: 'import as image. Button label, should be short',
    original: 'As Image',
    value: '作為圖像'
  },
  'import-as-layer-title': {
    original: 'Import Image as New Layer',
    value: '導入圖像作為新圖層'
  },
  'import-as-layer-description': {
    original: 'Adjust the position of the imported image.',
    value: '調整導入圖像的位置。 '
  },
  'import-as-layer-limit-reached': {
    hint: 'Kleki allows only a certain number of layers',
    original: 'Layer limit reached. Image will be placed on existing layer.',
    value: '達到圖層數量上限。圖像將會應用到已有圖層。'
  },
  'import-as-layer-fit': {
    hint: 'verb. imported image made to fit inside canvas.',
    original: 'Fit',
    value: '適應'
  },
  'import-flatten': {
    hint: 'Turn image that has multiple layers into an image that has only one layer.',
    original: 'Flatten image',
    value: '拼合圖像'
  },
  'import-unsupported-file': {
    hint: 'e.g. user tried to open a WAV',
    original: 'Unsupported file type. See Help for supported types.',
    value: '不支持此類文件類型。查看幫助。 '
  },
  'import-broken-file': {
    hint: 'if an image file is broken',
    original: "Couldn't load image. File might be corrupted.",
    value: '不能加載圖像。文件可能受損。 '
  },
  'import-psd-unsupported': {
    hint: 'PSD is photoshop file format. flatten as in „flatten image“ in photoshop. Merged all layers',
    original: 'Unsupported features. PSD had to be flattened.',
    value: '不支持該功能。 PSD需要拼合。 '
  },
  'import-psd-limited-support': {
    hint: 'PSD has lots of fancy features that Kleki doesn\'t have, so when importing a PSD it often has to simplify things. So it might look different compared to when opening in Photoshop. We’re informing the user if they "flatten" the image it will be accurate despite losing layers. The user has to weigh, do they care about having layers, or do they care about it looking right.',
    original: 'PSD support is limited. Flattened will more likely look correct.',
    value: 'PSD支持受限。拼合功能將會更近原始圖像。 '
  },
  'import-psd-too-large': {
    original: 'Image exceeds maximum dimensions of {x} x {x} pixels. Unable to import.',
    value: '圖像超過{x} x {x}個像素。不能導入。 '
  },
  'import-psd-size': {
    original: 'Image size',
    value: '圖像大小'
  },
  'hand-reset': {
    hint: 'resets zoom (to 100%) and rotation (to 0°)',
    original: 'Reset',
    value: '重置'
  },
  'hand-fit': {
    hint: 'makes canvas cover whole working area',
    original: 'Fit',
    value: '適應'
  },
  'bucket-tolerance': {
    hint: 'a common feature for paint bucket',
    original: 'Tolerance',
    value: '容差'
  },
  'bucket-sample': {
    hint: 'like "taking a sample"',
    original: 'Sample',
    value: '採樣'
  },
  'bucket-sample-title': {
    original: 'Which layers to sample color from',
    value: '從特定圖層進行色彩採樣'
  },
  'bucket-sample-all': {
    hint: 'all layers',
    original: 'All',
    value: '全部'
  },
  'bucket-sample-active': {
    hint: 'currently active layer',
    original: 'Active',
    value: '當前'
  },
  'bucket-sample-above': {
    hint: 'layer above active layer',
    original: 'Above',
    value: '之前'
  },
  'bucket-grow': {
    hint: 'verb. Or expand.',
    original: 'Grow',
    value: '填充擴張'
  },
  'bucket-grow-title': {
    original: 'Grow filled area (in pixels)',
    value: '擴張填充的區域（像素）'
  },
  'bucket-contiguous': {
    hint: 'common setting for paint bucket in image editing software',
    original: 'Contiguous',
    value: '連續的'
  },
  'bucket-contiguous-title': {
    hint: 'tooltip explaining Contiguous',
    original: 'Only fill connected areas',
    value: '僅填充相連的區域'
  },
  'gradient-linear': {
    original: 'Linear',
    value: '線性'
  },
  'gradient-linear-mirror': {
    original: 'Linear-Mirror',
    value: '反射性'
  },
  'gradient-radial': {
    original: 'Radial',
    value: '放射狀'
  },
  'shape-stroke': {
    original: 'Stroke',
    value: '線條'
  },
  'shape-fill': {
    original: 'Fill',
    value: '填充'
  },
  'shape-rect': {
    hint: 'rectangle shape',
    original: 'Rectangle',
    value: '方形'
  },
  'shape-ellipse': {
    hint: 'ellipse shape',
    original: 'Ellipse',
    value: '圓形'
  },
  'shape-line': {
    original: 'Line',
    value: '線條'
  },
  'shape-line-width': {
    original: 'Line Width',
    value: '線條寬度'
  },
  'shape-outwards': {
    hint: 'grows shape from the center outwards',
    original: 'Outwards',
    value: '自中心向外'
  },
  'shape-fixed': {
    hint: 'fixed ratio of 1:1',
    original: 'Fixed 1:1',
    value: '鎖定 1:1'
  },
  'text-instruction': {
    original: 'Click canvas to place text',
    value: '點擊畫布添加文本'
  },
  'text-title': {
    original: 'Add Text',
    value: '添加文本'
  },
  'text-text': {
    original: 'Text',
    value: ''
  },
  'text-font': {
    original: 'Font',
    value: ''
  },
  'text-placeholder': {
    hint: 'placeholder in text input.',
    original: 'Your text',
    value: '請輸入'
  },
  'text-color': {
    original: 'Color',
    value: '色彩'
  },
  'text-size': {
    original: 'Size',
    value: '大小'
  },
  'text-line-height': {
    original: 'Line Height',
    value: ''
  },
  'text-letter-spacing': {
    original: 'Letter Spacing',
    value: ''
  },
  'text-left': {
    hint: 'left, center, right text formatting like in Word',
    original: 'Left',
    value: '左對齊'
  },
  'text-center': {
    original: 'Center',
    value: '居中'
  },
  'text-right': {
    original: 'Right',
    value: '右對齊'
  },
  'text-italic': {
    original: 'Italic',
    value: '斜體'
  },
  'text-bold': {
    original: 'Bold',
    value: '加粗'
  },
  'save-reminder-title': {
    hint: 'Save Reminder is a popup that shows up after 20 minutes of not saving. Allows user to save on the spot.',
    original: 'Unsaved Work',
    value: '作品未保存'
  },
  'save-reminder-text': {
    hint: 'turns into: "...saved in <strong>12 minutes</strong>. Save..."',
    original: 'Image was not saved in {a} minutes{b}. Save now to prevent eventual loss.',
    value: '圖畫已{a}分鐘{b}未保存。立刻保存以避免進度丟失。'
  },
  'save-reminder-save-psd': {
    original: 'Save As PSD',
    value: '保存為PSD'
  },
  'save-reminder-psd-layers': {
    original: 'PSD will remember all layers.',
    value: 'PSD可保留所有圖層。'
  },
  'backup-drawing': {
    hint: '(Embed) If the upload failed, the user can backup/download their drawing.',
    original: 'You can backup your drawing.',
    value: '您可以備份繪圖。'
  },
  submit: {
    original: 'Submit',
    value: '送出'
  },
  'submit-title': {
    hint: 'tooltip when hovering "Submit" button',
    original: 'Submit Drawing',
    value: '送出圖像'
  },
  'submit-prompt': {
    hint: 'Dialog asking for confirmation',
    original: 'Submit drawing?',
    value: '確認送出？'
  },
  'submit-submitting': {
    hint: 'in the process of uploading',
    original: 'Submitting',
    value: '送出中'
  },
  'embed-init-loading': {
    hint: 'when opening the app',
    original: 'Loading app',
    value: '加載app'
  },
  'embed-init-waiting': {
    hint: 'The app is loaded, but it’s still waiting for image',
    original: 'Waiting for image',
    value: '圖像上傳中'
  },
  unsaved: {
    original: 'Unsaved',
    value: '未保存'
  },
  help: {
    hint: 'or user manual',
    original: 'Help',
    value: '幫助'
  },
  'tab-settings': {
    original: 'Settings',
    value: '設置'
  },
  'settings-language': {
    original: 'Language',
    value: '語言'
  },
  'settings-language-reload': {
    hint: 'changes will be visible after reloading the page',
    original: 'Will update after reloading.',
    value: '刷新後更改語言'
  },
  'settings-theme': {
    original: 'Theme',
    value: '外觀主題'
  },
  'theme-dark': {
    original: 'Dark',
    value: '深色'
  },
  'theme-light': {
    original: 'Light',
    value: '淺色'
  },
  'terms-of-service': {
    original: 'Terms of Service',
    value: '服務條款'
  },
  licenses: {
    hint: 'as in software licenses',
    original: 'Licenses',
    value: '許可'
  },
  'source-code': {
    original: 'Source Code',
    value: '源代碼'
  },
  auto: {
    hint: 'automatically decided',
    original: 'auto',
    value: '自動'
  },
  'zoom-in': {
    original: 'Zoom In',
    value: '放大'
  },
  'zoom-out': {
    original: 'Zoom Out',
    value: '縮小'
  },
  radius: {
    original: 'Radius',
    value: '半徑'
  },
  'constrain-proportions': {
    original: 'Constrain Proportions',
    value: '保持縱橫比'
  },
  width: {
    original: 'Width',
    value: '寬度'
  },
  height: {
    original: 'Height',
    value: '高度'
  },
  opacity: {
    hint: 'for layer opacity, brush opacity, text opacity, ...',
    original: 'Opacity',
    value: '不透明度'
  },
  red: {
    original: 'Red',
    value: '紅'
  },
  green: {
    original: 'Green',
    value: '綠'
  },
  blue: {
    original: 'Blue',
    value: '藍'
  },
  eraser: {
    hint: 'noun. As short as possible',
    original: 'Eraser',
    value: '橡皮擦'
  },
  center: {
    hint: 'verb',
    original: 'Center',
    value: '居中'
  },
  layers: {
    hint: 'layers in the context of image editing software',
    original: 'Layers',
    value: '圖層'
  },
  background: {
    hint: 'as in background layer',
    original: 'Background',
    value: '背景'
  },
  'scaling-algorithm': {
    hint: 'Label for dropdown where user chooses which computer graphics algorithm should be used to scale the image',
    original: 'Scaling Algorithm',
    value: '縮放算法'
  },
  'algorithm-smooth': {
    original: 'Smooth',
    value: '平滑'
  },
  'algorithm-pixelated': {
    original: 'Pixelated',
    value: '像素化'
  },
  preview: {
    hint: 'subject. When applying a filter user sees a preview of what the result would look like.',
    original: 'Preview',
    value: '預覽'
  },
  'angle-snap': {
    hint: 'Snapping. Like when transforming an image and it snaps to the side of the frame.',
    original: 'Snap',
    value: '對齊'
  },
  'angle-snap-title': {
    original: '45° Angle Snapping',
    value: '以45°角度對齊'
  },
  'lock-alpha': {
    hint: 'Short. Freezes the alpha channel of image. Images consist of 4 channels (red, green, blue, alpha). Alpha lock also found in Procreate and photoshop',
    original: 'Lock Alpha',
    value: '鎖定'
  },
  'lock-alpha-title': {
    hint: "same as 'lock-alpha' but longer version. Shows up as a tooltip when hovering",
    original: "Locks layer's alpha channel",
    value: '鎖定圖層透明度'
  },
  reverse: {
    hint: 'Reversing the direction of a color gradient',
    original: 'Reverse',
    value: '反向'
  },
  'compare-before': {
    original: 'Before',
    value: '之前'
  },
  'compare-after': {
    original: 'After',
    value: '之後'
  },
  loading: {
    original: 'Loading',
    value: ''
  }
}

repo_name: Doggermelon/klecks

license: mit


module: commonjs

display: Recommended


code:
The Buzz on Cbd Oil For Adhd: Research, Side Effects, For Children & More

When you purchase these items, you have no method of recognizing if you are obtaining what you assume you are obtaining. There are no regulations or making oversight that allows consumers to feel safe regarding the purity of the items that they are buying. There are different sorts of CBD oil to select from and it is unclear which CBD items may be valuable in the treatment of ADHD.

CBD oil isolate includes only CBD. Broad-spectrum products consist of CBD as well as other cannabinoids, yet not THC. Full-spectrum products, on the various other hand, include CBD, THC, and other cannabinoids. Some research has actually discovered that CBD might play a duty in counteracting a few of the unfavorable adverse effects connected with THC.

There are no randomized controlled tests that show whether it works or inefficient. There is additionally no research study contrasting CBD oil to other treatments for ADHD. Exactly How to Use CBD Oil If you choose to try CBD oil for ADHD or various other factors, it is very important to buy it from reputable sources.

There is likewise no study contrasting the impacts of different types of CBD. Along with being available as an oil, CBD can likewise be bought as capsules, gummies, sprays, tinctures, candies, drinks, and also vaping oils. Is It Legal? While CBD is expanding in popularity, its lawful condition varies relying on where you live.

Adhd & Cbd - Using Cannabidiol (Cbd) To Treat Adhd - The Facts

The FDA warns that consumers ought to watch out for such cases. "This is particularly concerning when business are marketing unproven CBD products for usage in vulnerable populaces like babies as well as kids," clarified FDA Performing Commissioner Ned Sharpless, M.D. A Word From Verywell While CBD oil and other CBD items might show pledge for relieving some signs and symptoms of ADHD, there merely is insufficient evidence to support using it as a treatment for ADHD cbd oil in south carolina.

Your doctor will certainly have the ability to suggest one of the most efficient and most safe means to aid you better handle your signs.

or you have actually listened to a buddy talk concerning CBD oil as an alternative therapy for ADHD. Every online neighborhood as well as social media sites system seems to have someone praising the substance or providing to offer it. However what is it, and also does it really have any type of proven benefits for handling ADHD signs and symptoms? Cannabidiol oil, frequently referred to as CBD oil, is an item of the marijuana plant.

CBD oil is simply one of greater than 85 compounds in marijuana and is concerned by some enthusiasts as having medicinal benefits. It is not THC (tetrahydrocannabinol), the compound in cannabis that develops ecstasy as well as delivers the "high" of marijuana usage. CBD oil is not supposed to include any type of THC, meaning the oil requires to be highly refined to make it ideal for usage, and also as a result is not an all-natural item.

Top Guidelines Of Best Cbd Oil For Focus And Concentration 2021 - Prices ...

So what concerning CBD oil as a different technique for ADHD symptom monitoring? Some claim that CBD oil, a cannabis product, can be utilized to deal with the symptoms of ADHD. There is minimal study revealing an enhancement for some individuals that have epilepsy as well as some individuals who experience anxiety who make use of CBD oil, so it is assumed to additionally have advantages for individuals with ADHD.

repo_name: markhenryX/wayofleafx

license: unknown


code:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# IPython Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# dotenv
.env

# virtualenv
venv/
ENV/

# Spyder project settings
.spyderproject

# Rope project settings
.ropeproject

# Start.tw
src/config/start.tw

path: .gitignore


code:
# How to vector art

Please read the whole document before starting to work.
Some aspects are not obvious right away.

Note: This does not actually describe how to be an artist.

## TL;DR

    killall inkscape
    artTools/vector_layer_split.py artTools/vector_source.svg tw src/art/vector/layers/
    compile

## 1. Be an artist

Make changes to the vector_source.svg.
Inkscape was thoroughly tested.
Adobe Illustrator might work decently, too.

## 2. Respect the structure

While editing, keep the Layers in mind.

* In Inkscape, Layers are special "Inkscape groups".
* In Illustrator, Layers are groups with user-definded IDs.
* All Layers should have an ID that is globally unique
  (not just within their subtree).

* Please use anonymous groups only for the ease of editing. Remove all "helper" groups before finally saving the file.
* Anonymous groups can be used for continous scaling (of e.g. boobs).

* Every asset that should go into a separate file needs to be in a labelled group
  (even if that is a group with only one shape).
* There are some globally available styles defined as CSS classes (e.g. skin, hair).
  Use them if your asset should be changed upon display.
  Do not set the style directly in the object.

## 3. Fix the document (before commiting, Inkscape only)

Inkscape shows weird behaviour in some regards.
If you use Inkscape, close the document and run

    python3 inkscape_svg_fixup.py vector_source.svg

before continuing. Open the file in Inkscape and save it again.
You need to make a minor change, as Inkscape will not save a unchanged file
(move the notes back and forth or something). The fixup does not produce
the same linebreaks as Inkscape or Illustrator and git will go mad because
the whole seems to have changed.

What it does:
* Adobe Illustrator uses group IDs as layer labels.
  Inkscape however uses layer labels and a separate, auto-generated group ID.
  inkscape_svg_fixup.py overwrites the group ID with the Inkscape layer label
  so they are synchronised with Inkscape layer labels.
* Inkscape copies the global style definition into the object *every time*
  the object is edited. If an object references a CSS class AND at the same time
  has a local style, the local style is removed
  so global dynamic styling is possible later on.

Note: Behaviour of Adobe Illustrator is untested.

## 4. Split the layers

Execute

    python3 vector_layer_split.py vector_source.svg tw ../src/art/vector/layers/

. This application reads all groups in `vector_source.svg`.
Each group is stored in a separate file in the target directory `/src/art/vector/layers/`.
The group ID sets the file name. Therefore, the group ID **must not** contain spaces or any other weird characters.

Also consider:
* A group with ID ending in _ is ignored. Use Layers ending in _ to keep overview.
* A group with ID starting with "g" (Inkscape) or "XMLID" (Illustrator) is also ignored.
* Existing files are overwritten **without enquiry**.
* The target directory is not emptied. If a file is no longer needed, you should remove it manually.
* This procedure removes global definitions. This means, SVG filters are currently not supported.

Available output formats are `svg` and `tw`.
`svg` output exists for debug reasons.
`tw` embeds the SVG data into Twine files, but removes the global style definitions so they can be set during display.

## 5. Edit the code

`/src/art/` contains Twine code which shows the assets in the story.
There are many helpful comments in `/src/art/artWidgets.tw`.
The code also generates the previously removed global style definitions on the fly and per display.

## 6. Compile the story

Use the provided compile script (Windows batch or shell) for compiling.

## 7. Advanced usage

You can define multiple CSS classes to one element, e.g. "skin torso". When procedurally generating CSS, you can then set a global "skin" style, and a different one for "torso".

You can put variable text into the image using single quotes, e.g. "'+_tattooText+'". The single quotes *break* the quoting in Twine so the content of the Twine variable `_tattooText` is shown upon display. You can even align text on paths.

An anonymous group can be used for dynamic transformation. However, finding the correct parameters for the affine transformation matrix can be cumbersome. Use any method you see fit. See `src/art/vector/Boob.tw` for one example of the result.


code:
#!/usr/bin/env python3

'''
Application for "fixing" SVGs edited with Inkscape

These problems are addressed:

* Inkscape notoriously copies class styles into the object definitions.
https://bugs.launchpad.net/inkscape/+bug/167937

* Inkscape uses labels on layers. Layers are basically named groups.
  Inkscape does not sync the group id with the layer label.

Usage Example:
python3 inkscape_svg_fixup.py vector_source.svg

Note:
The output of lxml differs greatly from standard SVG indentation.
Please open and save the file in Inkscape before committing.
'''

import lxml.etree as etree
import sys

def fix(tree):
  # know namespaces
  ns = {
    'svg' : 'http://www.w3.org/2000/svg',
    'inkscape' : 'http://www.inkscape.org/namespaces/inkscape'
  }

  # find document global style definition
  # mangle it and interpret as python dictionary
  style_element = tree.find('./svg:style',namespaces=ns)
  style_definitions = style_element.text
  pythonic_style_definitions = '{'+style_definitions.\
  replace('\t.','"').replace('{','":"').replace('}','",').\
  replace('/*','#')+'}'
  styles = eval(pythonic_style_definitions)

  # go through all SVG elements
  for elem in tree.iter():
    if (elem.tag == etree.QName(ns['svg'], 'g')):
      # compare inkscape label with group element ID
      l = elem.get(etree.QName(ns['inkscape'], 'label'))
      if l:
        i = elem.get('id')
        if (i != l):
          print("Overwriting ID %s with Label %s..."%(i, l))
          elem.set('id', l)

    # remove all offending style attributes
    s = elem.get('style')
    c = elem.get('class')
    if (c and s):
      s = s.lower()
      c = c.split(' ')[0] # regard main style only
      cs = ''
      if c in styles:
        cs = styles[c].strip('; ').lower()
      if (c not in styles):
        print("Object id %s references unknown style class %s."%(i,c))
      else:
        if (cs != s.strip('; ')):
          print("Style %s removed from object id %s differed from class %s style %s."%(s,i,c,cs))
        del elem.attrib["style"]

if __name__ == "__main__":
  input_file = sys.argv[1]
  tree = etree.parse(input_file)
  fix(tree)
  # store SVG into file (input file is overwritten)
  svg = etree.tostring(tree, pretty_print=True)
  with open(input_file, 'wb') as f:
    f.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'.encode("utf-8"))
    f.write(svg)


code:
#!/usr/bin/env python3

'''
Application for procedural content adaption
*THIS IS VERY EXPERIMENTAL*
Contains a very poor man's implementation of spline mesh warping.

This application parses SVG path data of an outfit sample aligned to a body part.
The outfit is then replicated for other shapes of the same body part.

Example data is geared towards generating a strap outfit for boobs and torso
for all sizes of boobs and all shapes of torsos based on a single outfit for
boobs of size 2 and a hourglass torso respectively.

Limitations:
* handles paths only
* only svg.path Line and CubicBezier are tested
* only the aforementioned examples are tested

Usage:
python3 vector_clothing_replicator.py infile clothing bodypart destinationfile

Usage Example:
python3 vector_clothing_replicator.py vector_source.svg Straps Boob vector_destination.svg
python3 vector_clothing_replicator.py vector_source.svg Straps Torso vector_destination.svg
'''

from svg.path import parse_path
import copy
import lxml.etree as etree
import sys

REFERENCE_PATH_SAMPLES = 200
EMBED_REPLICATIONS = True # wether to embed all replications into the input file or output separate files

input_file = sys.argv[1]
clothing = sys.argv[2]
bodypart = sys.argv[3]
output_file_embed = sys.argv[4]

# TODO: make these configurable
output_file_pattern = '%s_%s_%s.svg' #bodypart, target_id, clothing

if ('Torso' == bodypart):
  xpath_shape = './svg:g[@id="Torso_"]/svg:g[@id="Torso_%s"]/svg:path[@class="skin torso"]/@d' # TODO: formulate more general, independent of style
  xpath_outfit_container = '//svg:g[@id="Torso_Outfit_%s_"]'%(clothing)
  xpath_outfit = '//svg:g[@id="Torso_Outfit_%s_%s"]'%(clothing,'%s')
  target_ids = "Unnatural,Hourglass,Normal".split(",")
  reference_id = "Hourglass"
else:
  raise RuntimeError("Please specify a bodypart for clothing to replicate.")

tree = etree.parse(input_file)
ns = {'svg' : 'http://www.w3.org/2000/svg'}

canvas = copy.deepcopy(tree)
for e in canvas.xpath('./svg:g',namespaces=ns)+canvas.xpath('./svg:path',namespaces=ns):
  # TODO: this should be "remove all objects, preserve document properties"
  e.getparent().remove(e)

def get_points(xpath_shape):
  '''
  This funciton extracts reference paths by the given xpath selector.
  Each path is used to sample a fixed number of points.
  '''
  paths_data = tree.xpath(xpath_shape,namespaces=ns)
  points = []
  path_length = None
  for path_data in paths_data:
    p = parse_path(path_data)
    points += [
      p.point(1.0/float(REFERENCE_PATH_SAMPLES)*i)
      for i in range(REFERENCE_PATH_SAMPLES)
    ]
  if (not points):
    raise RuntimeError(
      'No paths for reference points found by selector "%s".'%(xpath_shape)
    )
  return points

def point_movement(point, reference_points, target_points):
  '''
  For a given point, finds the nearest point in the reference path.
  Gives distance vector from the nearest reference point to the
  respective target reference point.
  '''
  distances = [abs(point-reference_point) for reference_point in reference_points]
  min_ref_dist_idx = min(enumerate(distances), key=lambda x:x[1])[0]
  movement = target_points[min_ref_dist_idx] - reference_points[min_ref_dist_idx]
  return movement

reference_points = get_points(xpath_shape%(reference_id))
container = tree.xpath(xpath_outfit_container,namespaces=ns)
if (len(container) != 1):
  raise RuntimeError('Outfit container selector "%s" does not yield exactly one layer.'%(xpath_outfit_container))
container = container[0]
outfit_source = container.xpath(xpath_outfit%(reference_id),namespaces=ns)
if (len(outfit_source) != 1):
  raise RuntimeError('Outfit source selector "%s" does not yield exactly one outfit layer in container selected by "%s".'%(xpath_outfit%(reference_id), xpath_outfit_container))
outfit_source = outfit_source[0]

for target_id in target_ids:
  print(
    'Generating variant "%s" of clothing "%s" for bodypart "%s"...'%
    (target_id, clothing, bodypart)
  )
  outfit = copy.deepcopy(outfit_source)
  paths = outfit.xpath('./svg:path',namespaces=ns)
  if target_id == reference_id:
    print("This is the source variant. Skipping...")
  else:
    layerid = outfit.get('id').replace('_%s'%(reference_id),'_%s'%(target_id))
    outfit.set('id', layerid)
    outfit.set(etree.QName('http://www.inkscape.org/namespaces/inkscape', 'label'), layerid) # for the Inkscape-users
    target_points = get_points(xpath_shape%(target_id))
    if (len(reference_points) != len(target_points)):
      raise RuntimeError(
        ('Different amounts of sampled points in reference "%s" and target "%s" paths. '+
        'Selector "%s" probably matches different number of paths in the two layers.')%
        (reference_id, target_id, xpath_shape)
      )
    for path in paths:
      path_data = path.get("d")
      p = parse_path(path_data)
      for segment in p:
        original_distance = abs(segment.end-segment.start)
        start_movement = point_movement(segment.start, reference_points, target_points)
        segment.start += start_movement
        end_movement = point_movement(segment.end, reference_points, target_points)
        segment.end += end_movement
        distance = abs(segment.end-segment.start)
        try:
          # enhance position of CubicBezier control points
          # amplification is relative to the distance gained by movement
          segment.control1 += start_movement
          segment.control1 += (segment.control1-segment.start)*(distance/original_distance-1.0)
          segment.control2 += end_movement
          segment.control2 += (segment.control2-segment.end)*(distance/original_distance-1.0)
        except AttributeError as ae:
          # segment is not a CubicBezier
          pass
      path.set("d", p.d())
    if EMBED_REPLICATIONS:
      container.append(outfit)
  if not EMBED_REPLICATIONS:
    container = copy.deepcopy(canvas).xpath('.',namespaces=ns)[0]
    container.append(outfit)

  if not EMBED_REPLICATIONS:
    svg = etree.tostring(container, pretty_print=True)
    with open((output_file_pattern%(bodypart, target_id, clothing)).lower(), 'wb') as f:
      f.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'.encode("utf-8"))
      f.write(svg)

if EMBED_REPLICATIONS:
  svg = etree.tostring(tree, pretty_print=True)
  with open(output_file_embed, 'wb') as f:
    f.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'.encode("utf-8"))
    f.write(svg)


code:
#!/usr/bin/env python3

'''
Application for splitting groups from one SVG file into separate files

Usage:
python3 vector_layer_split.py infile format outdir

Usage Example:
python3 vector_layer_split.py vector_source.svg tw ../src/art/vector/layers/
'''

import lxml.etree as etree
import sys
import os
import copy
import re
import inkscape_svg_fixup

input_file = sys.argv[1]
output_format = sys.argv[2]
output_directory = sys.argv[3]
if not os.path.exists(output_directory):
    os.makedirs(output_directory)

ns = {
  'svg' : 'http://www.w3.org/2000/svg',
  'inkscape' : 'http://www.inkscape.org/namespaces/inkscape',
  'sodipodi':"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
}

tree = etree.parse(input_file)
inkscape_svg_fixup.fix(tree)

# prepare output template
template = copy.deepcopy(tree)
root = template.getroot()

# remove all svg root attributes except document size
for a in root.attrib:
  if (a != "viewBox"):
    del root.attrib[a]

# add placeholder for CSS class (needed for workaround for non HTML 5.1 compliant browser)
if output_format == 'tw':
  root.attrib["class"] = "'+_art_display_class+'"

# remove all content, including metadata
# for twine output, style definitions are removed, too
defs = None
for e in root:
  if (e.tag == etree.QName(ns['svg'], 'defs')):
    defs = e
  if (e.tag == etree.QName(ns['svg'], 'g') or
      e.tag == etree.QName(ns['svg'], 'metadata') or
      e.tag == etree.QName(ns['svg'], 'defs') or
      e.tag == etree.QName(ns['sodipodi'], 'namedview') or
      (output_format == 'tw' and e.tag == etree.QName(ns['svg'], 'style'))
      ):
    root.remove(e)
# template preparation finished

# prepare regex for later use
regex_xmlns = re.compile(' xmlns[^ ]+',)
regex_space = re.compile('[>][ ]+[<]',)

# find all groups
layers = tree.xpath('//svg:g',namespaces=ns)
for layer in layers:
  i = layer.get('id')
  if ( # disregard non-content groups
    i.endswith("_") or # manually suppressed with underscore
    i.startswith("XMLID") or # Illustrator generated group
    i.startswith("g") # Inkscape generated group
  ):
    continue
  # create new canvas
  output = copy.deepcopy(template)
  # copy all shapes into template
  canvas = output.getroot()
  for e in layer:
    canvas.append(e)
  # represent template as SVG (binary string)
  svg = etree.tostring(output, pretty_print=False)
  # poor man's conditional defs insertion
  # TODO: extract only referenced defs (filters, gradients, ...)
  # TODO: detect necessity by traversing the elements. do not stupidly search in the string representation
  if ("filter:" in svg.decode('utf-8')):
    # it seems there is a filter referenced in the generated SVG, re-insert defs from main document
    canvas.insert(0,defs)
    # re-generate output
    svg = etree.tostring(output, pretty_print=False)

  if (output_format == 'tw'):
    # remove unnecessary attributes
    # TODO: never generate unnecessary attributes in the first place
    svg = svg.decode('utf-8')
    svg = regex_xmlns.sub('',svg)
    svg = svg.replace(' inkscape:connector-curvature="0"','') # this just saves space
    svg = svg.replace('\n','').replace('\r','') # print cannot be multi-line
    svg = regex_space.sub('><',svg) # remove indentaion
    svg = svg.replace('svg:','') # svg namespace was removed
    svg = svg.replace('<g ','<g transform="\'+_art_transform+\'"') # internal groups are used for scaling
    svg = svg.encode('utf-8')

  # save SVG string to file
  i = layer.get('id')
  output_path = os.path.join(output_directory,i+'.'+output_format)
  with open(output_path, 'wb') as f:
    if (output_format == 'svg'):
      # Header for normal SVG (XML)
      f.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'.encode("utf-8"))
      f.write(svg)
    elif (output_format == 'tw'):
      # Header for SVG in Twine file (SugarCube print statement)
      f.write((':: Art_Vector_%s [nobr]\n\n'%(i)).encode("utf-8"))
      f.write("<<print '<html>".encode("utf-8"))
      f.write(svg)
      f.write("</html>' >>".encode("utf-8"))


code:
# Ignore everything in this directory
*
# Except the following:
!.gitignore
!resources/vector/*


code:
#!/bin/bash

# Find and insert current commit
COMMIT=$(git rev-list HEAD --count)
sed -i "s/COMMIT/$COMMIT/" ./src/init/storyInit.tw

# Will add all *.tw files to StoryIncludes.
./sanityCheck
rm -f src/config/start.tw
cp src/config/start.tw.proto start.tw.tmp
find src -name '*.tw' -print >>start.tw.tmp
mv start.tw.tmp src/config/start.tw

HASH=`git log -n1 |grep commit | sed 's/commit //'`

if [ $(uname -m) = "x86_64" ]
then
	echo "x64 arch"
	./devTools/tweeGo/tweego_nix64 -o bin/FC_pregmod.html src/config/start.tw
else
	echo "x86 arch"
	./devTools/tweeGo/tweego_nix86 -o bin/FC_pregmod.html src/config/start.tw
fi

#Make the output prettier, replacing \t with a tab and \n with a newline
sed -i -e '/^.*<div id="store-area".*$/s/\\t/\t/g' -e '/^.*<div id="store-area".*$/s/\\n/\n/g'  bin/FC_pregmod.html

# Revert ./src/init/storyInit.tw for next compilation
git checkout -- ./src/init/storyInit.tw

rm -f src/config/start.tw

path: compile


code:
#!/bin/bash

# Will add all *.tw files to StoryIncludes.
./sanityCheck
rm -f src/config/start.tw
cp src/config/start.tw.proto start.tw.tmp
find src -name '*.tw' -print >>start.tw.tmp
mv start.tw.tmp src/config/start.tw

HASH=`git log -n1 |grep -m1 commit | sed 's/commit //'`

if [ $(uname -m) = "x86_64" ]
then
	echo "x64 arch"
	./devTools/tweeGo/tweego_nix64 -o bin/FC_pregmod_$HASH.html src/config/start.tw
else
	echo "x86 arch"
	./devTools/tweeGo/tweego_nix86 -o bin/FC_pregmod_$HASH.html src/config/start.tw
fi

#Make the output prettier, replacing \t with a tab and \n with a newline
sed -i -e '/^<div id="store-area".*$/s/\\t/\t/g' -e '/^<div id="store-area".*$/s/\\n/\n/g'  bin/FC_pregmod_$HASH.html

rm -f src/config/start.tw

echo "FC_pregmod_$HASH.html" compilation finished.

path: compile-git


code:
@echo off
:: Free Cities Basic Compiler - Windows

:: Will add all *.tw files to StoryIncludes.
del src\config\start.tw
copy src\config\start.tw.proto start.tw.tmp >nul
>>start.tw.tmp (for /r "src" %%F in (*.tw) do echo %%F)
move start.tw.tmp src\config\start.tw >nul

:: Run the appropriate compiler for the user's CPU architecture.
if %PROCESSOR_ARCHITECTURE% == AMD64 (
    CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" "%~dp0src\config\start.tw"
) else (
    CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" "%~dp0src\config\start.tw"
)

del src\config\start.tw
ECHO Done