@jjlmoya/utils-audiovisual 1.7.0 → 1.8.0

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 (151) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +198 -0
  3. package/src/category/i18n/id.ts +198 -0
  4. package/src/category/i18n/it.ts +198 -0
  5. package/src/category/i18n/ja.ts +198 -0
  6. package/src/category/i18n/ko.ts +198 -0
  7. package/src/category/i18n/nl.ts +198 -0
  8. package/src/category/i18n/pl.ts +198 -0
  9. package/src/category/i18n/pt.ts +198 -0
  10. package/src/category/i18n/ru.ts +198 -0
  11. package/src/category/i18n/sv.ts +198 -0
  12. package/src/category/i18n/tr.ts +198 -0
  13. package/src/category/i18n/zh.ts +198 -0
  14. package/src/category/index.ts +31 -3
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tool/chromaticLens/i18n/de.ts +246 -0
  17. package/src/tool/chromaticLens/i18n/id.ts +246 -0
  18. package/src/tool/chromaticLens/i18n/it.ts +246 -0
  19. package/src/tool/chromaticLens/i18n/ja.ts +246 -0
  20. package/src/tool/chromaticLens/i18n/ko.ts +246 -0
  21. package/src/tool/chromaticLens/i18n/nl.ts +246 -0
  22. package/src/tool/chromaticLens/i18n/pl.ts +246 -0
  23. package/src/tool/chromaticLens/i18n/pt.ts +246 -0
  24. package/src/tool/chromaticLens/i18n/ru.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/sv.ts +246 -0
  26. package/src/tool/chromaticLens/i18n/tr.ts +246 -0
  27. package/src/tool/chromaticLens/i18n/zh.ts +246 -0
  28. package/src/tool/chromaticLens/index.ts +15 -7
  29. package/src/tool/collageMaker/i18n/de.ts +233 -0
  30. package/src/tool/collageMaker/i18n/id.ts +233 -0
  31. package/src/tool/collageMaker/i18n/it.ts +233 -0
  32. package/src/tool/collageMaker/i18n/ja.ts +233 -0
  33. package/src/tool/collageMaker/i18n/ko.ts +233 -0
  34. package/src/tool/collageMaker/i18n/nl.ts +233 -0
  35. package/src/tool/collageMaker/i18n/pl.ts +233 -0
  36. package/src/tool/collageMaker/i18n/pt.ts +233 -0
  37. package/src/tool/collageMaker/i18n/ru.ts +233 -0
  38. package/src/tool/collageMaker/i18n/sv.ts +233 -0
  39. package/src/tool/collageMaker/i18n/tr.ts +233 -0
  40. package/src/tool/collageMaker/i18n/zh.ts +233 -0
  41. package/src/tool/collageMaker/index.ts +15 -6
  42. package/src/tool/exifCleaner/i18n/de.ts +277 -0
  43. package/src/tool/exifCleaner/i18n/fr.ts +1 -1
  44. package/src/tool/exifCleaner/i18n/id.ts +277 -0
  45. package/src/tool/exifCleaner/i18n/it.ts +277 -0
  46. package/src/tool/exifCleaner/i18n/ja.ts +277 -0
  47. package/src/tool/exifCleaner/i18n/ko.ts +277 -0
  48. package/src/tool/exifCleaner/i18n/nl.ts +277 -0
  49. package/src/tool/exifCleaner/i18n/pl.ts +277 -0
  50. package/src/tool/exifCleaner/i18n/pt.ts +277 -0
  51. package/src/tool/exifCleaner/i18n/ru.ts +277 -0
  52. package/src/tool/exifCleaner/i18n/sv.ts +277 -0
  53. package/src/tool/exifCleaner/i18n/tr.ts +277 -0
  54. package/src/tool/exifCleaner/i18n/zh.ts +277 -0
  55. package/src/tool/exifCleaner/index.ts +16 -8
  56. package/src/tool/imageCompressor/i18n/de.ts +242 -0
  57. package/src/tool/imageCompressor/i18n/en.ts +1 -1
  58. package/src/tool/imageCompressor/i18n/es.ts +1 -1
  59. package/src/tool/imageCompressor/i18n/id.ts +242 -0
  60. package/src/tool/imageCompressor/i18n/it.ts +242 -0
  61. package/src/tool/imageCompressor/i18n/ja.ts +242 -0
  62. package/src/tool/imageCompressor/i18n/ko.ts +242 -0
  63. package/src/tool/imageCompressor/i18n/nl.ts +242 -0
  64. package/src/tool/imageCompressor/i18n/pl.ts +242 -0
  65. package/src/tool/imageCompressor/i18n/pt.ts +242 -0
  66. package/src/tool/imageCompressor/i18n/ru.ts +242 -0
  67. package/src/tool/imageCompressor/i18n/sv.ts +242 -0
  68. package/src/tool/imageCompressor/i18n/tr.ts +242 -0
  69. package/src/tool/imageCompressor/i18n/zh.ts +244 -0
  70. package/src/tool/imageCompressor/index.ts +15 -7
  71. package/src/tool/printQualityCalculator/i18n/de.ts +261 -0
  72. package/src/tool/printQualityCalculator/i18n/fr.ts +1 -1
  73. package/src/tool/printQualityCalculator/i18n/id.ts +261 -0
  74. package/src/tool/printQualityCalculator/i18n/it.ts +261 -0
  75. package/src/tool/printQualityCalculator/i18n/ja.ts +261 -0
  76. package/src/tool/printQualityCalculator/i18n/ko.ts +261 -0
  77. package/src/tool/printQualityCalculator/i18n/nl.ts +261 -0
  78. package/src/tool/printQualityCalculator/i18n/pl.ts +261 -0
  79. package/src/tool/printQualityCalculator/i18n/pt.ts +261 -0
  80. package/src/tool/printQualityCalculator/i18n/ru.ts +261 -0
  81. package/src/tool/printQualityCalculator/i18n/sv.ts +261 -0
  82. package/src/tool/printQualityCalculator/i18n/tr.ts +261 -0
  83. package/src/tool/printQualityCalculator/i18n/zh.ts +261 -0
  84. package/src/tool/printQualityCalculator/index.ts +15 -7
  85. package/src/tool/privacyBlur/i18n/de.ts +238 -0
  86. package/src/tool/privacyBlur/i18n/id.ts +238 -0
  87. package/src/tool/privacyBlur/i18n/it.ts +238 -0
  88. package/src/tool/privacyBlur/i18n/ja.ts +238 -0
  89. package/src/tool/privacyBlur/i18n/ko.ts +238 -0
  90. package/src/tool/privacyBlur/i18n/nl.ts +238 -0
  91. package/src/tool/privacyBlur/i18n/pl.ts +238 -0
  92. package/src/tool/privacyBlur/i18n/pt.ts +238 -0
  93. package/src/tool/privacyBlur/i18n/ru.ts +238 -0
  94. package/src/tool/privacyBlur/i18n/sv.ts +238 -0
  95. package/src/tool/privacyBlur/i18n/tr.ts +238 -0
  96. package/src/tool/privacyBlur/i18n/zh.ts +238 -0
  97. package/src/tool/privacyBlur/index.ts +15 -7
  98. package/src/tool/subtitleSync/i18n/de.ts +241 -0
  99. package/src/tool/subtitleSync/i18n/fr.ts +5 -5
  100. package/src/tool/subtitleSync/i18n/id.ts +241 -0
  101. package/src/tool/subtitleSync/i18n/it.ts +241 -0
  102. package/src/tool/subtitleSync/i18n/ja.ts +241 -0
  103. package/src/tool/subtitleSync/i18n/ko.ts +241 -0
  104. package/src/tool/subtitleSync/i18n/nl.ts +241 -0
  105. package/src/tool/subtitleSync/i18n/pl.ts +241 -0
  106. package/src/tool/subtitleSync/i18n/pt.ts +241 -0
  107. package/src/tool/subtitleSync/i18n/ru.ts +241 -0
  108. package/src/tool/subtitleSync/i18n/sv.ts +241 -0
  109. package/src/tool/subtitleSync/i18n/tr.ts +241 -0
  110. package/src/tool/subtitleSync/i18n/zh.ts +241 -0
  111. package/src/tool/subtitleSync/index.ts +15 -7
  112. package/src/tool/timelapseCalculator/i18n/de.ts +169 -0
  113. package/src/tool/timelapseCalculator/i18n/fr.ts +2 -2
  114. package/src/tool/timelapseCalculator/i18n/id.ts +169 -0
  115. package/src/tool/timelapseCalculator/i18n/it.ts +169 -0
  116. package/src/tool/timelapseCalculator/i18n/ja.ts +169 -0
  117. package/src/tool/timelapseCalculator/i18n/ko.ts +169 -0
  118. package/src/tool/timelapseCalculator/i18n/nl.ts +169 -0
  119. package/src/tool/timelapseCalculator/i18n/pl.ts +169 -0
  120. package/src/tool/timelapseCalculator/i18n/pt.ts +169 -0
  121. package/src/tool/timelapseCalculator/i18n/ru.ts +169 -0
  122. package/src/tool/timelapseCalculator/i18n/sv.ts +169 -0
  123. package/src/tool/timelapseCalculator/i18n/tr.ts +169 -0
  124. package/src/tool/timelapseCalculator/i18n/zh.ts +169 -0
  125. package/src/tool/timelapseCalculator/index.ts +16 -8
  126. package/src/tool/tvDistance/i18n/de.ts +223 -0
  127. package/src/tool/tvDistance/i18n/id.ts +223 -0
  128. package/src/tool/tvDistance/i18n/it.ts +223 -0
  129. package/src/tool/tvDistance/i18n/ja.ts +223 -0
  130. package/src/tool/tvDistance/i18n/ko.ts +223 -0
  131. package/src/tool/tvDistance/i18n/nl.ts +223 -0
  132. package/src/tool/tvDistance/i18n/pl.ts +223 -0
  133. package/src/tool/tvDistance/i18n/pt.ts +223 -0
  134. package/src/tool/tvDistance/i18n/ru.ts +223 -0
  135. package/src/tool/tvDistance/i18n/sv.ts +223 -0
  136. package/src/tool/tvDistance/i18n/tr.ts +223 -0
  137. package/src/tool/tvDistance/i18n/zh.ts +223 -0
  138. package/src/tool/tvDistance/index.ts +15 -7
  139. package/src/tool/videoFrameExtractor/i18n/de.ts +235 -0
  140. package/src/tool/videoFrameExtractor/i18n/id.ts +235 -0
  141. package/src/tool/videoFrameExtractor/i18n/it.ts +235 -0
  142. package/src/tool/videoFrameExtractor/i18n/ja.ts +235 -0
  143. package/src/tool/videoFrameExtractor/i18n/ko.ts +235 -0
  144. package/src/tool/videoFrameExtractor/i18n/nl.ts +235 -0
  145. package/src/tool/videoFrameExtractor/i18n/pl.ts +235 -0
  146. package/src/tool/videoFrameExtractor/i18n/pt.ts +235 -0
  147. package/src/tool/videoFrameExtractor/i18n/ru.ts +235 -0
  148. package/src/tool/videoFrameExtractor/i18n/sv.ts +235 -0
  149. package/src/tool/videoFrameExtractor/i18n/tr.ts +235 -0
  150. package/src/tool/videoFrameExtractor/i18n/zh.ts +235 -0
  151. package/src/tool/videoFrameExtractor/index.ts +16 -8
@@ -0,0 +1,235 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { VideoFrameExtractorUI, VideoFrameExtractorLocaleContent } from '../index';
3
+
4
+ const slug = 'online-video-kare-cikarma-hd-resim-yakala';
5
+ const title = 'Video Kare Çıkarıcı: HD sahneleri yakalayın';
6
+ const description = 'Videolarınızdan tek tek kareleri mükemmel hassasiyetle çıkarın. Mükemmel anları HD kalitesinde yerel ve ücretsiz olarak yakalayın.';
7
+
8
+ const ui: VideoFrameExtractorUI = {
9
+ uploadTitle: "Bir video dosyası yükleyin",
10
+ uploadFormats: "MP4, WebM, MOV veya MKV (Maks. 500MB)",
11
+ privacyNote: "Video internete yüklenmez, tarayıcınızda işlenir.",
12
+ playLabel: "Oynat",
13
+ pauseLabel: "Duraklat",
14
+ captureBtn: "Kareyi Yakala",
15
+ prevFrame: "-1F",
16
+ nextFrame: "+1F",
17
+ batchTitle: "Otomatik Çıkarma",
18
+ batchEvery: "Her",
19
+ batchStart: "Sıralamayı Başlat",
20
+ batchProcessing: "Çıkarılıyor...",
21
+ galleryTitle: "Yakalanan Kareler",
22
+ galleryEmpty: "Yakaladığınız kareler burada görünecektir.",
23
+ downloadAll: "Tümünü İndir",
24
+ downloadHD: "HD Resmi İndir",
25
+ resetBtn: "Başka bir video yükle"
26
+ };
27
+
28
+ const faq: VideoFrameExtractorLocaleContent['faq'] = [
29
+ {
30
+ question: "Uzun videolardan kare çıkarabilir miyim?",
31
+ answer: "Evet, tarayıcınızın videoyu yüklemek için yeterli RAM'e sahip olması yeterlidir. Optimum performans için 500 MB'a kadar olan dosyaları öneririz.",
32
+ },
33
+ {
34
+ question: "Yakalanan kareler hangi çözünürlükte kaydedilir?",
35
+ answer: "Kareler, orijinal videonun doğal çözünürlüğünde yakalanır. Videonuz 4K ise, yüksek kaliteli bir 4K resim elde edersiniz.",
36
+ },
37
+ ];
38
+
39
+ const howTo: VideoFrameExtractorLocaleContent['howTo'] = [
40
+ {
41
+ name: "Videonuzu yükleyin",
42
+ text: "Cihazınızdan video dosyasını seçin. Dosyanızı herhangi bir sunucuya yüklemeyeceğiz.",
43
+ },
44
+ {
45
+ name: "Tam ana gidin",
46
+ text: "Mükemmel hassasiyet için zaman çizelgesi çubuğunu veya ±1 kare düğmelerini kullanın.",
47
+ },
48
+ {
49
+ name: "Kareyi yakalayın",
50
+ text: "Anı aşağıdaki galeriye kaydetmek için yakala düğmesine basın.",
51
+ },
52
+ {
53
+ name: "Yüksek kalitede indirin",
54
+ text: "Kareleri tek tek veya tüm oturumu optimize edilmiş WebP formatında indirin.",
55
+ },
56
+ ];
57
+
58
+ const bibliography: VideoFrameExtractorLocaleContent['bibliography'] = [
59
+ {
60
+ name: "Capturing frames with HTML5 Video API",
61
+ url: "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video",
62
+ },
63
+ ];
64
+
65
+ const seo: VideoFrameExtractorLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: 'Profesyonel Video Kare Çıkarma',
69
+ items: [
70
+ 'Mükemmel yakalama için tek kare hassasiyeti (±1 kare)',
71
+ '500MB\'a kadar MP4, WebM, MOV, MKV desteği',
72
+ 'Orijinal video çözünürlüğü korunur (SD, HD, 4K)',
73
+ 'Özel aralıklarla otomatik toplu çıkarma'
74
+ ]
75
+ },
76
+ { type: 'title', text: 'Kare Çıkarma: Videoda Zamanı Dondurun', level: 2 },
77
+ { type: 'paragraph', html: 'Bazen bir resim bin kelimeye bedeldir. Aracımız, profesyonel yazılıma ihtiyaç duymadan hassas kareleri çıkarmak için tarayıcınızın yerel gücünü kullanır.' },
78
+
79
+ { type: 'stats', items: [
80
+ { value: '±1', label: 'Tek Kare Hassasiyeti', icon: 'mdi:target' },
81
+ { value: '100%', label: 'Doğal Çözünürlük', icon: 'mdi:video-high-definition' },
82
+ { value: '500MB', label: 'Desteklenen Dosyalar', icon: 'mdi:file-video' }
83
+ ], columns: 3 },
84
+
85
+ { type: 'title', text: 'Profesyonel Kullanım Durumları', level: 3 },
86
+ { type: 'comparative', items: [
87
+ {
88
+ title: 'Sinema ve Fotoğraf',
89
+ description: 'Görsel referans veya kompozisyon için kareleri yakalayın',
90
+ icon: 'mdi:film',
91
+ points: [
92
+ 'Film pazarlaması için durgun resimler çıkarın',
93
+ 'Sahne kompozisyonu referansları',
94
+ 'Kare kare analiz'
95
+ ]
96
+ },
97
+ {
98
+ title: 'Dijital İçerik',
99
+ description: 'Sosyal medya için küçük resimler ve kapaklar oluşturun',
100
+ icon: 'mdi:youtube',
101
+ points: [
102
+ 'Yüksek çözünürlüklü YouTube küçük resimleri',
103
+ 'Sosyal medya kapakları',
104
+ 'Sunumlar için resimler'
105
+ ],
106
+ highlight: true
107
+ },
108
+ {
109
+ title: 'Teknik Dokümantasyon',
110
+ description: 'Eğitim videolarından kareler çıkarın',
111
+ icon: 'mdi:book-open',
112
+ points: [
113
+ 'Eğitim videolarından ekran görüntüleri',
114
+ 'Adım adım görsel dokümantasyon',
115
+ 'Gerçek zamanlı hareket analizi'
116
+ ]
117
+ },
118
+ {
119
+ title: 'Spor ve Aksiyon',
120
+ description: 'Maksimum aksiyonun tam anını yakalayın',
121
+ icon: 'mdi:dumbbell',
122
+ points: [
123
+ 'Kare kare spor tekniği analizi',
124
+ 'Kahramanlık anlarını yakalama',
125
+ 'Hareket çalışması'
126
+ ]
127
+ }
128
+ ], columns: 2 },
129
+
130
+ { type: 'title', text: 'Desteklenen Video Formatları', level: 3 },
131
+ { type: 'table', headers: ['Format', 'Uzantı', 'Uyumluluk', 'Notlar'], rows: [
132
+ ['MPEG-4', 'MP4', 'Evrensel (%100)', 'En iyi sıkıştırma, yaygın kullanım'],
133
+ ['WebM', 'WebM', 'Modern tarayıcılar', 'Üstün sıkıştırma, küçük boyut'],
134
+ ['QuickTime', 'MOV', 'Safari, bazı oynatıcılar', 'Apple standardı'],
135
+ ['Matroska', 'MKV', 'Modern tarayıcılar', 'Esnek taşıyıcı']
136
+ ] },
137
+
138
+ { type: 'card', title: 'Tek Kare Hassasiyeti', html: 'Mükemmel anı (bir sıçrama, bir gülümseme, bir hareket) yakalamak için tek bir kare ileri veya geri gitmek (±1 kare) hayati önem taşır. Aracımız size milimetrik kontrol sağlar.' },
139
+
140
+ { type: 'proscons', items: [
141
+ {
142
+ pro: 'Tam gizlilik: video tarayıcınızda %100 yerel olarak işlenir',
143
+ con: 'Kullanılabilir RAM bellek boyutuyla sınırlıdır (~500MB önerilir)'
144
+ },
145
+ {
146
+ pro: 'Doğal çözünürlük korunur: SD, HD, 4K yeniden sıkıştırma olmadan',
147
+ con: 'HTML5 Video destekli modern tarayıcı gerektirir'
148
+ },
149
+ {
150
+ pro: 'Özel aralıklarla otomatik toplu çıkarma',
151
+ con: 'Gelişmiş düzenleme için bir video düzenleyici gerekir'
152
+ },
153
+ {
154
+ pro: 'Kareleri optimize edilmiş WebP veya PNG olarak dışa aktarın',
155
+ con: 'Her seferinde bir kare (otomatik GIF sıraları oluşturmaz)'
156
+ }
157
+ ], proTitle: 'Avantajlar', conTitle: 'Sınırlamalar' },
158
+
159
+ { type: 'diagnostic', variant: 'info', title: 'Çözünürlük ve Kare Hızı', icon: 'mdi:information', badge: 'Teknik', html: 'Nihai kare çözünürlüğü orijinal videoya bağlıdır. Videonun doğal bilgisini upscaling yapmadan koruruz.' },
160
+
161
+ { type: 'glossary', items: [
162
+ {
163
+ term: 'Kare (Frame)',
164
+ definition: 'Bir video sırasındaki tek bir görüntü. 24 fps bir video saniyede 24 kare içerir.'
165
+ },
166
+ {
167
+ term: 'FPS (Saniyedeki Kare Sayısı)',
168
+ definition: 'Saniyedeki kare sayısı. Hareketin akıcılığını belirler.'
169
+ },
170
+ {
171
+ term: 'Video Codec',
172
+ definition: 'Sıkıştırma algoritması: H.264, VP9, HEVC. Dosya boyutunu ve kalitesini belirler.'
173
+ },
174
+ {
175
+ term: 'Bitrate',
176
+ definition: 'Saniyede işlenen veri miktarı. Daha yüksek bitrate = daha yüksek kalite.'
177
+ },
178
+ {
179
+ term: 'Video Çözünürlüğü',
180
+ definition: 'Piksel boyutları: 720p, 1080p, 4K, 8K.'
181
+ }
182
+ ] },
183
+
184
+ { type: 'message', title: 'Profesyonel Kare Çıkarma', ariaLabel: 'Video çıkarma hakkında teknik bilgi', html: 'Karmaşık çevrimiçi dönüştürücülere gerek yok. Mükemmel bir kare sadece 3 tık uzağınızda: video yükle, gezin, yakala.' },
185
+
186
+ { type: 'title', text: 'Video Anlarını Dondurun', level: 3 },
187
+ { type: 'paragraph', html: 'Her video yüzlerce kare içerir. Kaliteden veya gizlilikten ödün vermeden o mükemmel anları çıkarmak için bu aracı kullanın.' }
188
+ ];
189
+
190
+ const faqSchema: WithContext<FAQPage> = {
191
+ '@context': 'https://schema.org',
192
+ '@type': 'FAQPage',
193
+ mainEntity: faq.map((item) => ({
194
+ '@type': 'Question',
195
+ name: item.question,
196
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
197
+ })),
198
+ };
199
+
200
+ const howToSchema: WithContext<HowTo> = {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'HowTo',
203
+ name: title,
204
+ description,
205
+ step: howTo.map((step) => ({
206
+ '@type': 'HowToStep',
207
+ name: step.name,
208
+ text: step.text,
209
+ })),
210
+ };
211
+
212
+ const appSchema: WithContext<SoftwareApplication> = {
213
+ '@context': 'https://schema.org',
214
+ '@type': 'SoftwareApplication',
215
+ name: title,
216
+ description,
217
+ applicationCategory: 'UtilitiesApplication',
218
+ operatingSystem: 'Web',
219
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
220
+ inLanguage: 'tr',
221
+ };
222
+
223
+ export const content: VideoFrameExtractorLocaleContent = {
224
+ slug,
225
+ title,
226
+ description,
227
+ ui,
228
+ seo,
229
+ faq,
230
+ faqTitle: 'Video Kare Çıkarma Hakkında Sıkça Sorulan Sorular',
231
+ bibliography,
232
+ bibliographyTitle: 'Video Yakalama İçine Teknik Standartlar',
233
+ howTo,
234
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
235
+ };
@@ -0,0 +1,235 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { VideoFrameExtractorUI, VideoFrameExtractorLocaleContent } from '../index';
3
+
4
+ const slug = 'online-video-frame-extractor-china-hd-stills';
5
+ const title = '视频帧提取器:高清静态图像捕获';
6
+ const description = '以单帧精度从视频中提取个人图像。在本地免费捕捉高清的完美瞬间。';
7
+
8
+ const ui: VideoFrameExtractorUI = {
9
+ uploadTitle: "上传视频文件",
10
+ uploadFormats: "MP4, WebM, MOV 或 MKV (最大 500MB)",
11
+ privacyNote: "视频不会上传到互联网,它在您的浏览器中进行本地处理。",
12
+ playLabel: "播放",
13
+ pauseLabel: "暂停",
14
+ captureBtn: "捕获帧",
15
+ prevFrame: "-1帧",
16
+ nextFrame: "+1帧",
17
+ batchTitle: "自动提取",
18
+ batchEvery: "每隔",
19
+ batchStart: "开始序列",
20
+ batchProcessing: "提取中...",
21
+ galleryTitle: "捕获的帧",
22
+ galleryEmpty: "捕获的图像将显示在这里。",
23
+ downloadAll: "下载全部",
24
+ downloadHD: "下载高清图像",
25
+ resetBtn: "上传另一个视频"
26
+ };
27
+
28
+ const faq: VideoFrameExtractorLocaleContent['faq'] = [
29
+ {
30
+ question: "我可以从长视频中提取帧吗?",
31
+ answer: "可以,只要您的浏览器有足够的内存来加载视频。为了获得最佳性能,我们建议文件大小不超过 500MB。",
32
+ },
33
+ {
34
+ question: "捕获的图像以什么分辨率保存?",
35
+ answer: "捕获是以原始视频的原始分辨率进行的。如果您的视频是 4K 的,您将获得高质量的 4K 图像。",
36
+ },
37
+ ];
38
+
39
+ const howTo: VideoFrameExtractorLocaleContent['howTo'] = [
40
+ {
41
+ name: "上传您的视频",
42
+ text: "从您的设备中选择视频文件。我们不会将其上传到任何服务器。",
43
+ },
44
+ {
45
+ name: "导航到精确时刻",
46
+ text: "使用时间轴栏或 ±1 帧按钮进行外科手术般的精准定位。",
47
+ },
48
+ {
49
+ name: "捕获帧",
50
+ text: "按下捕获按钮将该瞬间保存到下方的库中。",
51
+ },
52
+ {
53
+ name: "以高质量下载",
54
+ text: "下载单个捕获或整个会话的优化 WebP 格式图像。",
55
+ },
56
+ ];
57
+
58
+ const bibliography: VideoFrameExtractorLocaleContent['bibliography'] = [
59
+ {
60
+ name: "Capturing frames with HTML5 Video API",
61
+ url: "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video",
62
+ },
63
+ ];
64
+
65
+ const seo: VideoFrameExtractorLocaleContent['seo'] = [
66
+ {
67
+ type: 'summary',
68
+ title: '专业视频帧提取',
69
+ items: [
70
+ '单帧精度 (±1 帧) 实现完美捕捉',
71
+ '支持高达 500MB 的 MP4, WebM, MOV, MKV 文件',
72
+ '保留原始视频分辨率 (SD, HD, 4K)',
73
+ '按自定义间隔自动批量提取'
74
+ ]
75
+ },
76
+ { type: 'title', text: '帧提取:凝固视频时刻', level: 2 },
77
+ { type: 'paragraph', html: '有时一张照片胜过千言万语。我们的工具利用您浏览器的本地性能来提取精确帧,无需专业软件。' },
78
+
79
+ { type: 'stats', items: [
80
+ { value: '±1', label: '单帧精度', icon: 'mdi:target' },
81
+ { value: '100%', label: '原始分辨率', icon: 'mdi:video-high-definition' },
82
+ { value: '500MB', label: '支持文件大小', icon: 'mdi:file-video' }
83
+ ], columns: 3 },
84
+
85
+ { type: 'title', text: '专业应用场景', level: 3 },
86
+ { type: 'comparative', items: [
87
+ {
88
+ title: '电影与摄影',
89
+ description: '捕捉帧作为视觉参考或构图参考',
90
+ icon: 'mdi:film',
91
+ points: [
92
+ '为电影营销提取剧照',
93
+ '场景构图参考',
94
+ '逐帧分析'
95
+ ]
96
+ },
97
+ {
98
+ title: '数字内容',
99
+ description: '为社交媒体创建缩略图和封面',
100
+ icon: 'mdi:youtube',
101
+ points: [
102
+ '高清 YouTube 缩略图',
103
+ '社交媒体封面',
104
+ '演示文稿插图'
105
+ ],
106
+ highlight: true
107
+ },
108
+ {
109
+ title: '技术文档',
110
+ description: '从教程和演示中提取帧',
111
+ icon: 'mdi:book-open',
112
+ points: [
113
+ '教程视频截图',
114
+ '分步骤视觉文档',
115
+ '实时动作分析'
116
+ ]
117
+ },
118
+ {
119
+ title: '体育与动作',
120
+ description: '捕捉动作最精彩的精确时刻',
121
+ icon: 'mdi:dumbbell',
122
+ points: [
123
+ '体育技术逐帧分析',
124
+ '捕捉英雄瞬间',
125
+ '运动研究'
126
+ ]
127
+ }
128
+ ], columns: 2 },
129
+
130
+ { type: 'title', text: '支持视频格式', level: 3 },
131
+ { type: 'table', headers: ['格式', '扩展名', '兼容性', '备注'], rows: [
132
+ ['MPEG-4', 'MP4', '通用 (100%)', '最佳压缩,广泛使用'],
133
+ ['WebM', 'WebM', '现代浏览器', '卓越压缩,体积小'],
134
+ ['QuickTime', 'MOV', 'Safari 等', 'Apple 标准'],
135
+ ['Matroska', 'MKV', '现代浏览器', '灵活的容器']
136
+ ] },
137
+
138
+ { type: 'card', title: '单帧精度', html: '向前或向后移动一帧 (±1 帧) 对于捕捉完美瞬间至关重要。我们的工具为您提供毫米级的控制。' },
139
+
140
+ { type: 'proscons', items: [
141
+ {
142
+ pro: '完全隐私:视频在您的浏览器中 100% 本地处理',
143
+ con: '受限于可用内存大小 (建议最大 500MB)'
144
+ },
145
+ {
146
+ pro: '保留原始分辨率:SD, HD, 4K 无需重新压缩',
147
+ con: '需要支持 HTML5 Video 的现代浏览器'
148
+ },
149
+ {
150
+ pro: '按自定义间隔自动批量提取',
151
+ con: '如需高级编辑(剪辑),则需要视频编辑器'
152
+ },
153
+ {
154
+ pro: '以优化 WebP 或无损 PNG 导出帧',
155
+ con: '一次只导出一帧(不导出自动 GIF 序列)'
156
+ }
157
+ ], proTitle: '优势', conTitle: '局限性' },
158
+
159
+ { type: 'diagnostic', variant: 'info', title: '分辨率与帧率', icon: 'mdi:information', badge: '技术', html: '最终帧分辨率取决于原始视频。我们不进行智能上采样,而是保留视频的原始信息。' },
160
+
161
+ { type: 'glossary', items: [
162
+ {
163
+ term: '帧',
164
+ definition: '视频序列中的单个图像。24 fps 的视频每秒包含 24 帧。'
165
+ },
166
+ {
167
+ term: 'FPS (每秒帧数)',
168
+ definition: '决定动作的平滑度。'
169
+ },
170
+ {
171
+ term: '视频编解码器',
172
+ definition: '压缩算法:H.264, VP9, HEVC。决定文件大小和质量。'
173
+ },
174
+ {
175
+ term: '比特率',
176
+ definition: '每秒处理的数据量。比特率越高 = 质量越高。'
177
+ },
178
+ {
179
+ term: '视频分辨率',
180
+ definition: '像素尺寸:720p, 1080p, 4K, 8K。'
181
+ }
182
+ ] },
183
+
184
+ { type: 'message', title: '专业级帧提取', ariaLabel: '关于视频提取的技术信息', html: '您不需要复杂的在线转换器。只需点击 3 次即可获得完美的一帧:上传、导航、捕获。' },
185
+
186
+ { type: 'title', text: '凝固视频瞬间', level: 3 },
187
+ { type: 'paragraph', html: '每个视频都包含数百帧。使用此工具提取那些完美的瞬间,而不会影响质量或隐私。' }
188
+ ];
189
+
190
+ const faqSchema: WithContext<FAQPage> = {
191
+ '@context': 'https://schema.org',
192
+ '@type': 'FAQPage',
193
+ mainEntity: faq.map((item) => ({
194
+ '@type': 'Question',
195
+ name: item.question,
196
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
197
+ })),
198
+ };
199
+
200
+ const howToSchema: WithContext<HowTo> = {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'HowTo',
203
+ name: title,
204
+ description,
205
+ step: howTo.map((step) => ({
206
+ '@type': 'HowToStep',
207
+ name: step.name,
208
+ text: step.text,
209
+ })),
210
+ };
211
+
212
+ const appSchema: WithContext<SoftwareApplication> = {
213
+ '@context': 'https://schema.org',
214
+ '@type': 'SoftwareApplication',
215
+ name: title,
216
+ description,
217
+ applicationCategory: 'UtilitiesApplication',
218
+ operatingSystem: 'Web',
219
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
220
+ inLanguage: 'zh',
221
+ };
222
+
223
+ export const content: VideoFrameExtractorLocaleContent = {
224
+ slug,
225
+ title,
226
+ description,
227
+ ui,
228
+ seo,
229
+ faq,
230
+ faqTitle: '关于视频帧提取的常见问题',
231
+ bibliography,
232
+ bibliographyTitle: '视频捕捉技术标准',
233
+ howTo,
234
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
235
+ };
@@ -26,20 +26,28 @@ export interface VideoFrameExtractorUI {
26
26
 
27
27
  export type VideoFrameExtractorLocaleContent = ToolLocaleContent<VideoFrameExtractorUI>;
28
28
 
29
- import { content as es } from './i18n/es';
30
- import { content as en } from './i18n/en';
31
- import { content as fr } from './i18n/fr';
32
-
33
29
  export const videoFrameExtractor: AudiovisualToolEntry<VideoFrameExtractorUI> = {
34
- id: 'extractor-frames-video',
30
+ id: 'extractor-fotogramas-video',
35
31
  icons: {
36
32
  bg: 'mdi:video-vintage',
37
33
  fg: 'mdi:camera-plus',
38
34
  },
39
35
  i18n: {
40
- es: async () => es as unknown as VideoFrameExtractorLocaleContent,
41
- en: async () => en as unknown as VideoFrameExtractorLocaleContent,
42
- fr: async () => fr as unknown as VideoFrameExtractorLocaleContent,
36
+ es: async () => (await import('./i18n/es')).content as unknown as VideoFrameExtractorLocaleContent,
37
+ en: async () => (await import('./i18n/en')).content as unknown as VideoFrameExtractorLocaleContent,
38
+ fr: async () => (await import('./i18n/fr')).content as unknown as VideoFrameExtractorLocaleContent,
39
+ de: async () => (await import('./i18n/de')).content as unknown as VideoFrameExtractorLocaleContent,
40
+ it: async () => (await import('./i18n/it')).content as unknown as VideoFrameExtractorLocaleContent,
41
+ pt: async () => (await import('./i18n/pt')).content as unknown as VideoFrameExtractorLocaleContent,
42
+ id: async () => (await import('./i18n/id')).content as unknown as VideoFrameExtractorLocaleContent,
43
+ ja: async () => (await import('./i18n/ja')).content as unknown as VideoFrameExtractorLocaleContent,
44
+ ko: async () => (await import('./i18n/ko')).content as unknown as VideoFrameExtractorLocaleContent,
45
+ nl: async () => (await import('./i18n/nl')).content as unknown as VideoFrameExtractorLocaleContent,
46
+ pl: async () => (await import('./i18n/pl')).content as unknown as VideoFrameExtractorLocaleContent,
47
+ ru: async () => (await import('./i18n/ru')).content as unknown as VideoFrameExtractorLocaleContent,
48
+ sv: async () => (await import('./i18n/sv')).content as unknown as VideoFrameExtractorLocaleContent,
49
+ tr: async () => (await import('./i18n/tr')).content as unknown as VideoFrameExtractorLocaleContent,
50
+ zh: async () => (await import('./i18n/zh')).content as unknown as VideoFrameExtractorLocaleContent,
43
51
  },
44
52
  };
45
53