tiptapify 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +12 -4
  2. package/dist/tiptapify.css +1 -1
  3. package/dist/tiptapify.mjs +44223 -43722
  4. package/dist/tiptapify.umd.js +38 -38
  5. package/package.json +47 -41
  6. package/src/components/Footer.vue +1 -3
  7. package/src/components/Tiptapify.vue +15 -3
  8. package/src/components/Toolbar/GroupBtn.vue +0 -1
  9. package/src/components/Toolbar/Toggle.vue +2 -3
  10. package/src/components/Toolbar/defaultExtensionComponents.ts +13 -1
  11. package/src/components/UI/TiptapifyDialog.vue +2 -3
  12. package/src/components/editorExtensions.ts +5 -0
  13. package/src/composables/Toolbar/Actions/useRedo.ts +1 -2
  14. package/src/composables/Toolbar/Actions/useUndo.ts +1 -2
  15. package/src/composables/Toolbar/Alignment/useAlignmentCenter.ts +1 -2
  16. package/src/composables/Toolbar/Alignment/useAlignmentJustify.ts +1 -2
  17. package/src/composables/Toolbar/Alignment/useAlignmentLeft.ts +1 -2
  18. package/src/composables/Toolbar/Alignment/useAlignmentRight.ts +1 -2
  19. package/src/composables/Toolbar/Format/useBold.ts +1 -2
  20. package/src/composables/Toolbar/Format/useItalic.ts +1 -2
  21. package/src/composables/Toolbar/Format/useStrike.ts +1 -2
  22. package/src/composables/Toolbar/Format/useUnderline.ts +1 -2
  23. package/src/composables/Toolbar/FormatExtra/useBlockquote.ts +1 -2
  24. package/src/composables/Toolbar/FormatExtra/useCode.ts +1 -2
  25. package/src/composables/Toolbar/FormatExtra/useCodeBlock.ts +1 -2
  26. package/src/composables/Toolbar/FormatExtra/useSub.ts +1 -2
  27. package/src/composables/Toolbar/FormatExtra/useSup.ts +1 -2
  28. package/src/composables/Toolbar/List/useBullet.ts +1 -2
  29. package/src/composables/Toolbar/List/useIndent.ts +1 -2
  30. package/src/composables/Toolbar/List/useNumbered.ts +1 -2
  31. package/src/composables/Toolbar/List/useOutdent.ts +1 -2
  32. package/src/composables/Toolbar/List/useTask.ts +1 -2
  33. package/src/composables/Toolbar/Media/useEmoji.ts +4 -5
  34. package/src/composables/Toolbar/Media/useImage.ts +1 -2
  35. package/src/composables/Toolbar/Media/useLink.ts +1 -2
  36. package/src/composables/Toolbar/Media/useTable.ts +1 -2
  37. package/src/composables/Toolbar/Media/useVideo.ts +22 -0
  38. package/src/composables/Toolbar/Misc/useBreak.ts +1 -2
  39. package/src/composables/Toolbar/Misc/useFormatClear.ts +1 -2
  40. package/src/composables/Toolbar/Misc/useInvisibleCharacters.ts +1 -2
  41. package/src/composables/Toolbar/Misc/useLine.ts +1 -2
  42. package/src/composables/Toolbar/Misc/usePreview.ts +1 -2
  43. package/src/composables/Toolbar/Misc/useSource.ts +1 -2
  44. package/src/composables/Toolbar/Style/useColor.ts +1 -2
  45. package/src/composables/Toolbar/Style/useFontFamily.ts +1 -2
  46. package/src/composables/Toolbar/Style/useFontSize.ts +1 -2
  47. package/src/composables/Toolbar/Style/useHeading.ts +1 -2
  48. package/src/composables/Toolbar/Style/useHighlight.ts +1 -2
  49. package/src/composables/Toolbar/Style/useLineHeight.ts +1 -2
  50. package/src/composables/Toolbar/useMediaItems.ts +2 -0
  51. package/src/extensions/components/Emoji.vue +1 -2
  52. package/src/extensions/components/FontFamily.vue +1 -2
  53. package/src/extensions/components/FontSize.vue +1 -2
  54. package/src/extensions/components/ImageDialog.vue +1 -2
  55. package/src/extensions/components/LineHeight.vue +1 -2
  56. package/src/extensions/components/LinkDialog.vue +1 -2
  57. package/src/extensions/components/ShowSourceDialog.vue +1 -2
  58. package/src/extensions/components/StyleColor.vue +1 -2
  59. package/src/extensions/components/TableBuilder.vue +1 -2
  60. package/src/extensions/components/VideoDialog.vue +138 -0
  61. package/src/i18n/index.ts +23 -10
  62. package/src/i18n/locales/ch.json +6 -0
  63. package/src/i18n/locales/cz.json +6 -0
  64. package/src/i18n/locales/de.json +6 -0
  65. package/src/i18n/locales/en.json +9 -1
  66. package/src/i18n/locales/es.json +6 -0
  67. package/src/i18n/locales/fr.json +6 -0
  68. package/src/i18n/locales/it.json +6 -0
  69. package/src/i18n/locales/la.json +6 -0
  70. package/src/i18n/locales/lt.json +6 -0
  71. package/src/i18n/locales/nl.json +6 -0
  72. package/src/i18n/locales/pl.json +6 -0
  73. package/src/i18n/locales/pt.json +6 -0
  74. package/src/i18n/locales/ru.json +9 -1
  75. package/src/i18n/locales/se.json +6 -0
  76. package/src/i18n/locales/ua.json +9 -1
  77. package/src/index.ts +0 -3
@@ -1,10 +1,9 @@
1
1
  import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import { computed, inject, Ref } from "vue";
4
- import { useI18n } from "vue-i18n";
5
4
 
6
5
  export function useFormatClear() {
7
- const { t } = useI18n();
6
+ const { t } = inject('tiptapifyI18n') as any
8
7
 
9
8
  const editor = inject('tiptapifyEditor') as Ref<Editor>
10
9
 
@@ -1,9 +1,8 @@
1
1
  import { Editor } from "@tiptap/vue-3";
2
2
  import { computed, inject, Ref } from "vue";
3
- import { useI18n } from "vue-i18n";
4
3
 
5
4
  export function useInvisibleCharacters() {
6
- const { t } = useI18n();
5
+ const { t } = inject('tiptapifyI18n') as any
7
6
 
8
7
  const editor = inject('tiptapifyEditor') as Ref<Editor>
9
8
 
@@ -1,10 +1,9 @@
1
1
  import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import { computed, inject, Ref } from "vue";
4
- import { useI18n } from "vue-i18n";
5
4
 
6
5
  export function useLine() {
7
- const { t } = useI18n();
6
+ const { t } = inject('tiptapifyI18n') as any
8
7
 
9
8
  const editor = inject('tiptapifyEditor') as Ref<Editor>
10
9
 
@@ -1,10 +1,9 @@
1
1
  import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import { computed, inject, Ref } from "vue";
4
- import { useI18n } from "vue-i18n";
5
4
 
6
5
  export function usePreview() {
7
- const { t } = useI18n();
6
+ const { t } = inject('tiptapifyI18n') as any
8
7
 
9
8
  const editor = inject('tiptapifyEditor') as Ref<Editor>
10
9
 
@@ -1,10 +1,9 @@
1
1
  import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import { computed, inject, Ref } from "vue";
4
- import { useI18n } from "vue-i18n";
5
4
 
6
5
  export function useSource() {
7
- const { t } = useI18n();
6
+ const { t } = inject('tiptapifyI18n') as any
8
7
 
9
8
  const editor = inject('tiptapifyEditor') as Ref<Editor>
10
9
 
@@ -2,10 +2,9 @@ import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import StyleColor from "@tiptapify/extensions/components/StyleColor.vue";
4
4
  import { computed, inject, markRaw, Ref } from "vue";
5
- import { useI18n } from "vue-i18n";
6
5
 
7
6
  export function useColor(theme: any) {
8
- const { t } = useI18n();
7
+ const { t } = inject('tiptapifyI18n') as any
9
8
 
10
9
  const editor = inject('tiptapifyEditor') as Ref<Editor>
11
10
 
@@ -3,10 +3,9 @@ import { Editor } from "@tiptap/vue-3";
3
3
  import { fonts } from "@tiptapify/constants/style";
4
4
  import FontFamily from "@tiptapify/extensions/components/FontFamily.vue";
5
5
  import { computed, inject, markRaw, Ref } from "vue";
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  export function useFontFamily() {
9
- const { t } = useI18n();
8
+ const { t } = inject('tiptapifyI18n') as any
10
9
 
11
10
  const editor = inject('tiptapifyEditor') as Ref<Editor>
12
11
 
@@ -3,10 +3,9 @@ import { Editor } from "@tiptap/vue-3";
3
3
  import { fontSizes } from "@tiptapify/constants/style";
4
4
  import FontSize from "@tiptapify/extensions/components/FontSize.vue";
5
5
  import { computed, inject, markRaw, Ref } from "vue";
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  export function useFontSize(fontMeasure: string) {
9
- const { t } = useI18n();
8
+ const { t } = inject('tiptapifyI18n') as any
10
9
 
11
10
  const editor = inject('tiptapifyEditor') as Ref<Editor>
12
11
 
@@ -3,7 +3,6 @@ import { Level } from "@tiptap/extension-heading";
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
  import { headingLevels, setHeadingLevels } from "@tiptapify/constants/style";
5
5
  import { computed, inject, Ref } from "vue";
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  interface MDIIcons {
9
8
  [key: string]: string
@@ -11,7 +10,7 @@ interface MDIIcons {
11
10
  const mdiIcons = mdi as MDIIcons
12
11
 
13
12
  export function useHeading(customHeadingLevels: Array<number> = []) {
14
- const { t } = useI18n();
13
+ const { t } = inject('tiptapifyI18n') as any
15
14
 
16
15
  setHeadingLevels(customHeadingLevels)
17
16
 
@@ -2,10 +2,9 @@ import * as mdi from "@mdi/js";
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import StyleColor from "@tiptapify/extensions/components/StyleColor.vue";
4
4
  import { computed, inject, markRaw, Ref } from "vue";
5
- import { useI18n } from "vue-i18n";
6
5
 
7
6
  export function useHighlight(theme: any) {
8
- const { t } = useI18n();
7
+ const { t } = inject('tiptapifyI18n') as any
9
8
 
10
9
  const editor = inject('tiptapifyEditor') as Ref<Editor>
11
10
 
@@ -3,10 +3,9 @@ import { Editor } from "@tiptap/vue-3";
3
3
  import { lineHeights } from "@tiptapify/constants/style";
4
4
  import LineHeight from "@tiptapify/extensions/components/LineHeight.vue";
5
5
  import { computed, inject, markRaw, Ref } from "vue";
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  export function useLineHeight() {
9
- const { t } = useI18n();
8
+ const { t } = inject('tiptapifyI18n') as any
10
9
 
11
10
  const editor = inject('tiptapifyEditor') as Ref<Editor>
12
11
 
@@ -2,11 +2,13 @@ import { useImage } from "@tiptapify/composables/Toolbar/Media/useImage";
2
2
  import { useEmoji } from "@tiptapify/composables/Toolbar/Media/useEmoji";
3
3
  import { useLink } from "@tiptapify/composables/Toolbar/Media/useLink";
4
4
  import { useTable } from "@tiptapify/composables/Toolbar/Media/useTable";
5
+ import { useVideo } from "@tiptapify/composables/Toolbar/Media/useVideo";
5
6
 
6
7
  export function useMediaItems() {
7
8
  return {
8
9
  link: useLink(),
9
10
  image: useImage(),
11
+ video: useVideo(),
10
12
  emoji: useEmoji(),
11
13
  table: useTable()
12
14
  }
@@ -1,13 +1,12 @@
1
1
  <script setup lang="ts">
2
2
 
3
3
  import { Editor } from "@tiptap/vue-3";
4
- import { useI18n } from 'vue-i18n'
5
4
 
6
5
  import tiptapifyEmojis from "@tiptapify/extensions/emoji"
7
6
 
8
7
  import { computed, inject, Ref, ref } from 'vue'
9
8
 
10
- const { t } = useI18n()
9
+ const { t } = inject('tiptapifyI18n') as any
11
10
 
12
11
  defineExpose({ open, close })
13
12
 
@@ -3,14 +3,13 @@
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
 
5
5
  import { computed, inject, Ref, ref } from 'vue'
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  const props = defineProps({
9
8
  fonts: { type: Array<{ name: string, fontFamily: string }>, default: [] },
10
9
  fontFamily: { type: String, default: '' },
11
10
  })
12
11
 
13
- const { t } = useI18n();
12
+ const { t } = inject('tiptapifyI18n') as any
14
13
 
15
14
  const emit = defineEmits(['close'])
16
15
 
@@ -3,7 +3,6 @@
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
 
5
5
  import { computed, inject, Ref, ref } from 'vue'
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  const props = defineProps({
9
8
  sizes: { type: Array<number>, default: [] },
@@ -11,7 +10,7 @@ const props = defineProps({
11
10
  fontSize: { type: Number, default () { return null } },
12
11
  })
13
12
 
14
- const { t } = useI18n();
13
+ const { t } = inject('tiptapifyI18n') as any
15
14
 
16
15
  const emit = defineEmits(['close'])
17
16
 
@@ -3,7 +3,6 @@
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
  import TiptapifyDialog from "@tiptapify/components/UI/TiptapifyDialog.vue";
5
5
 
6
- import { useI18n } from 'vue-i18n'
7
6
  import { computed, inject, onMounted, onUnmounted, Ref, ref } from 'vue'
8
7
 
9
8
  defineProps({
@@ -12,7 +11,7 @@ defineProps({
12
11
  })
13
12
 
14
13
  const editor = inject('tiptapifyEditor') as Ref<Editor>
15
- const { t } = useI18n()
14
+ const { t } = inject('tiptapifyI18n') as any
16
15
 
17
16
  const generateImageAttrs = () => ({
18
17
  src: '',
@@ -3,14 +3,13 @@
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
 
5
5
  import { computed, inject, Ref, ref } from 'vue'
6
- import { useI18n } from "vue-i18n";
7
6
 
8
7
  const props = defineProps({
9
8
  lineHeights: { type: Array<number>, default () { return [] } },
10
9
  lineHeight: { type: Number, default () { return null } },
11
10
  })
12
11
 
13
- const { t } = useI18n();
12
+ const { t } = inject('tiptapifyI18n') as any
14
13
 
15
14
  const emit = defineEmits(['close'])
16
15
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { Editor } from "@tiptap/vue-3";
4
4
 
5
- import { useI18n } from 'vue-i18n'
6
5
  import { computed, inject, onMounted, onUnmounted, Ref, ref, watch } from 'vue'
7
6
 
8
7
  import TiptapifyDialog from "@tiptapify/components/UI/TiptapifyDialog.vue"
@@ -13,7 +12,7 @@ defineProps({
13
12
  })
14
13
 
15
14
  const editor = inject('tiptapifyEditor') as Ref<Editor>
16
- const { t } = useI18n()
15
+ const { t } = inject('tiptapifyI18n') as any
17
16
 
18
17
  const generateLinkAttrs = () => ({
19
18
  href: '',
@@ -2,7 +2,6 @@
2
2
  import { Editor } from "@tiptap/vue-3";
3
3
  import TiptapifyDialog from "@tiptapify/components/UI/TiptapifyDialog.vue";
4
4
  import { ref, onMounted, onUnmounted, watch, inject, Ref } from 'vue'
5
- import { useI18n } from "vue-i18n";
6
5
 
7
6
  const props = defineProps({
8
7
  indent: { type: Number, default: 2 },
@@ -10,7 +9,7 @@ const props = defineProps({
10
9
  variantField: { type: String, default: 'solo' }
11
10
  })
12
11
 
13
- const { t } = useI18n();
12
+ const { t } = inject('tiptapifyI18n') as any
14
13
 
15
14
  const editor = inject('tiptapifyEditor') as Ref<Editor>
16
15
 
@@ -1,11 +1,10 @@
1
1
  <script setup lang="ts">
2
2
 
3
3
  import { Editor } from "@tiptap/vue-3";
4
- import { useI18n } from 'vue-i18n'
5
4
 
6
5
  import { computed, inject, Ref, ref } from 'vue'
7
6
 
8
- const { t } = useI18n()
7
+ const { t } = inject('tiptapifyI18n') as any
9
8
 
10
9
  defineExpose({ open, close })
11
10
 
@@ -1,11 +1,10 @@
1
1
  <script setup lang="ts">
2
2
 
3
3
  import { Editor } from "@tiptap/vue-3";
4
- import { useI18n } from 'vue-i18n'
5
4
 
6
5
  import { inject, Ref, ref } from 'vue'
7
6
 
8
- const { t } = useI18n()
7
+ const { t } = inject('tiptapifyI18n') as any
9
8
 
10
9
  defineExpose({ open })
11
10
 
@@ -0,0 +1,138 @@
1
+ <script setup lang="ts">
2
+
3
+ import { Editor } from "@tiptap/vue-3";
4
+ import TiptapifyDialog from "@tiptapify/components/UI/TiptapifyDialog.vue";
5
+
6
+ import { computed, inject, onMounted, onUnmounted, Ref, ref } from 'vue'
7
+
8
+ defineProps({
9
+ variantBtn: { type: String, default() { return 'elevated' }},
10
+ variantField: { type: String, default() { return 'solo' }}
11
+ })
12
+
13
+ const editor = inject('tiptapifyEditor') as Ref<Editor>
14
+ const { t } = inject('tiptapifyI18n') as any
15
+
16
+ type videoAttrs = {
17
+ src: string,
18
+ width?: number,
19
+ height?: number
20
+ }
21
+ const generateVideoAttrs = () => ({
22
+ src: '',
23
+ height: null,
24
+ width: null
25
+ })
26
+
27
+ const attrs = ref(generateVideoAttrs())
28
+
29
+ const dialog = ref(null)
30
+
31
+ const isDisabled = computed(() => {
32
+ const { src } = attrs.value
33
+ return !src
34
+ })
35
+
36
+ function apply() {
37
+ let { src, width, height } = attrs.value
38
+
39
+ const videoOptions: videoAttrs = { src }
40
+
41
+ if (width) {
42
+ videoOptions.width = width
43
+ }
44
+
45
+ if (height) {
46
+ videoOptions.height = height
47
+ }
48
+
49
+ if (src) {
50
+ editor.value.commands.setYoutubeVideo(videoOptions)
51
+ // editor.value.commands.setYoutubeVideo({
52
+ // src: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
53
+ // width: 640,
54
+ // height: 480,
55
+ // })
56
+ }
57
+
58
+ close()
59
+ }
60
+
61
+ function clear() {
62
+ editor.value.commands.deleteSelection()
63
+
64
+ close()
65
+ }
66
+
67
+ function close() {
68
+ dialog.value.close()
69
+
70
+ attrs.value = generateVideoAttrs()
71
+ }
72
+
73
+ const showTiptapifyVideo = (event: CustomEvent) => {
74
+ if (event.detail.editorId !== editor.value.instanceId) {
75
+ return
76
+ }
77
+
78
+ attrs.value.src = event.detail.video?.src
79
+ attrs.value.width = event.detail.video?.width
80
+ attrs.value.height = event.detail.video?.height
81
+
82
+ dialog.value.open()
83
+ }
84
+
85
+ onMounted(() => {
86
+ window.addEventListener('tiptapify-show-tiptapifyVideo', showTiptapifyVideo as EventListener)
87
+ })
88
+
89
+ onUnmounted(() => {
90
+ window.removeEventListener('tiptapify-show-tiptapifyVideo', showTiptapifyVideo as EventListener)
91
+ })
92
+ </script>
93
+
94
+ <template>
95
+ <TiptapifyDialog ref="dialog" module="video" :max-width="800">
96
+ <template #content>
97
+ <VCardText>
98
+ <VRow>
99
+ <!-- <VCol cols="12">-->
100
+ <!-- <VSelect v-model="attrs.type" density="compact" variant="outlined" :label="t('dialog.video.src')" />-->
101
+ <!-- </VCol>-->
102
+
103
+ <VCol cols="12">
104
+ <VTextField v-model="attrs.src" density="compact" variant="outlined" :label="t('dialog.video.src')" />
105
+ </VCol>
106
+
107
+ <VCol cols="12" md="3">
108
+ <VTextField v-model="attrs.width" type="number" density="compact" variant="outlined" :precision="0" :min="1" :label="t('dialog.video.width')" />
109
+ </VCol>
110
+
111
+ <VCol cols="12" md="3">
112
+ <VTextField v-model="attrs.height" type="number" density="compact" variant="outlined" :precision="0" :min="1" :label="t('dialog.video.height')" />
113
+ </VCol>
114
+ </VRow>
115
+ </VCardText>
116
+ </template>
117
+
118
+ <template #actions>
119
+ <VCardActions>
120
+ <VRow>
121
+ <VCol class="d-flex justify-start">
122
+ <VBtn color="warning" v-if="editor.isActive('image')" :variant="variantBtn" :disabled="isDisabled" @click="clear">
123
+ {{ t('dialog.clear') }}
124
+ </VBtn>
125
+ </VCol>
126
+ <VCol class="d-flex justify-end">
127
+ <VBtn :variant="variantBtn" @click="close" class="mr-2">
128
+ {{ t('dialog.close') }}
129
+ </VBtn>
130
+ <VBtn color="primary" :variant="variantBtn" :disabled="isDisabled" @click="apply">
131
+ {{ t('dialog.apply') }}
132
+ </VBtn>
133
+ </VCol>
134
+ </VRow>
135
+ </VCardActions>
136
+ </template>
137
+ </TiptapifyDialog>
138
+ </template>
package/src/i18n/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createI18n } from 'vue-i18n'
2
+ import { ref, computed } from 'vue'
2
3
 
3
4
  const messages = Object.fromEntries(
4
5
  Object.entries(
@@ -6,17 +7,29 @@ const messages = Object.fromEntries(
6
7
  .map(([key, value]) => [key.slice(10, -5), value.default]),
7
8
  )
8
9
 
9
- let _i18n: any = null
10
+ export function useLocale(initialLocale: string = 'en') {
11
+ const currentLocale = ref(initialLocale)
10
12
 
11
- export const getI18n = (locale: string) => {
12
- if (_i18n === null) {
13
- _i18n = createI18n({
14
- legacy: false,
15
- locale: locale,
16
- fallbackLocale: 'en',
17
- messages
18
- })
13
+ const i18n = createI18n({
14
+ legacy: false,
15
+ locale: currentLocale.value,
16
+ fallbackLocale: 'en',
17
+ messages
18
+ })
19
+
20
+ const { t, locale } = i18n.global
21
+
22
+ const setLocale = (newLocale: string) => {
23
+ if (messages[newLocale]) {
24
+ currentLocale.value = newLocale
25
+ locale.value = newLocale
26
+ }
19
27
  }
20
28
 
21
- return _i18n
29
+ return {
30
+ i18n,
31
+ t,
32
+ locale: computed(() => currentLocale.value),
33
+ setLocale
34
+ }
22
35
  }
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "查看源代码",
120
120
  "prettify": "美化"
121
+ },
122
+ "video": {
123
+ "title": "添加/编辑视频",
124
+ "src": "来源",
125
+ "width": "宽度",
126
+ "height": "高度"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Zobrazit zdrojový kód",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Přidat/upravit video",
124
+ "src": "Zdroj",
125
+ "width": "Šířka",
126
+ "height": "Výška"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Quellcode anzeigen",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Video hinzufügen/bearbeiten",
124
+ "src": "Quelle",
125
+ "width": "Breite",
126
+ "height": "Höhe"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -42,6 +42,7 @@
42
42
  "link": "External link",
43
43
  "image": "Image",
44
44
  "emoji": {
45
+ "title": "Emoji",
45
46
  "activities": "Activities",
46
47
  "animals_and_nature": "Animals & nature",
47
48
  "component": "Component",
@@ -70,7 +71,8 @@
70
71
  "deleteCol": "Delete column",
71
72
  "mergeCells": "Merge cells",
72
73
  "splitCell": "Split cell"
73
- }
74
+ },
75
+ "video": "Video"
74
76
  },
75
77
  "action": {
76
78
  "undo": "Undo",
@@ -118,6 +120,12 @@
118
120
  "source": {
119
121
  "title": "View source code",
120
122
  "prettify": "Prettify"
123
+ },
124
+ "video": {
125
+ "title": "Add/edit video",
126
+ "src": "Source",
127
+ "width": "Width",
128
+ "height": "Height"
121
129
  }
122
130
  },
123
131
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Ver código fuente",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Agregar/editar video",
124
+ "src": "Fuente",
125
+ "width": "Ancho",
126
+ "height": "Alto"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -119,6 +119,12 @@
119
119
  "source": {
120
120
  "title": "Voir le code source",
121
121
  "prettify": "prettify"
122
+ },
123
+ "video": {
124
+ "title": "Ajouter/modifier une vidéo",
125
+ "src": "Source",
126
+ "width": "Largeur",
127
+ "height": "Hauteur"
122
128
  }
123
129
  },
124
130
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Visualizza codice sorgente",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Aggiungi/modifica video",
124
+ "src": "Sorgente",
125
+ "width": "Larghezza",
126
+ "height": "Altezza"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Codicem fontem videre",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Addere/mutare video",
124
+ "src": "Fons",
125
+ "width": "Latitudo",
126
+ "height": "Altitudo"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Žiūrėti išeities kodą",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Pridėti/redaguoti vaizdo įrašą",
124
+ "src": "Šaltinis",
125
+ "width": "Plotis",
126
+ "height": "Aukštis"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Broncode bekijken",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Video toevoegen/bewerken",
124
+ "src": "Bron",
125
+ "width": "Breedte",
126
+ "height": "Hoogte"
121
127
  }
122
128
  },
123
129
  "misc": {
@@ -118,6 +118,12 @@
118
118
  "source": {
119
119
  "title": "Pokaż kod źródłowy",
120
120
  "prettify": "prettify"
121
+ },
122
+ "video": {
123
+ "title": "Dodaj/edytuj wideo",
124
+ "src": "Źródło",
125
+ "width": "Szerokość",
126
+ "height": "Wysokość"
121
127
  }
122
128
  },
123
129
  "misc": {