@jjlmoya/utils-audiovisual 1.6.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 (175) hide show
  1. package/package.json +59 -58
  2. package/src/category/i18n/de.ts +198 -0
  3. package/src/category/i18n/fr.ts +1 -1
  4. package/src/category/i18n/id.ts +198 -0
  5. package/src/category/i18n/it.ts +198 -0
  6. package/src/category/i18n/ja.ts +198 -0
  7. package/src/category/i18n/ko.ts +198 -0
  8. package/src/category/i18n/nl.ts +198 -0
  9. package/src/category/i18n/pl.ts +198 -0
  10. package/src/category/i18n/pt.ts +198 -0
  11. package/src/category/i18n/ru.ts +198 -0
  12. package/src/category/i18n/sv.ts +198 -0
  13. package/src/category/i18n/tr.ts +198 -0
  14. package/src/category/i18n/zh.ts +198 -0
  15. package/src/category/index.ts +31 -3
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/schemas_fulfillment.test.ts +23 -0
  18. package/src/tests/title_quality.test.ts +55 -0
  19. package/src/tool/chromaticLens/i18n/de.ts +246 -0
  20. package/src/tool/chromaticLens/i18n/en.ts +1 -1
  21. package/src/tool/chromaticLens/i18n/es.ts +1 -1
  22. package/src/tool/chromaticLens/i18n/fr.ts +1 -1
  23. package/src/tool/chromaticLens/i18n/id.ts +246 -0
  24. package/src/tool/chromaticLens/i18n/it.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/ja.ts +246 -0
  26. package/src/tool/chromaticLens/i18n/ko.ts +246 -0
  27. package/src/tool/chromaticLens/i18n/nl.ts +246 -0
  28. package/src/tool/chromaticLens/i18n/pl.ts +246 -0
  29. package/src/tool/chromaticLens/i18n/pt.ts +246 -0
  30. package/src/tool/chromaticLens/i18n/ru.ts +246 -0
  31. package/src/tool/chromaticLens/i18n/sv.ts +246 -0
  32. package/src/tool/chromaticLens/i18n/tr.ts +246 -0
  33. package/src/tool/chromaticLens/i18n/zh.ts +246 -0
  34. package/src/tool/chromaticLens/index.ts +15 -7
  35. package/src/tool/collageMaker/i18n/de.ts +233 -0
  36. package/src/tool/collageMaker/i18n/en.ts +1 -1
  37. package/src/tool/collageMaker/i18n/es.ts +1 -1
  38. package/src/tool/collageMaker/i18n/fr.ts +1 -1
  39. package/src/tool/collageMaker/i18n/id.ts +233 -0
  40. package/src/tool/collageMaker/i18n/it.ts +233 -0
  41. package/src/tool/collageMaker/i18n/ja.ts +233 -0
  42. package/src/tool/collageMaker/i18n/ko.ts +233 -0
  43. package/src/tool/collageMaker/i18n/nl.ts +233 -0
  44. package/src/tool/collageMaker/i18n/pl.ts +233 -0
  45. package/src/tool/collageMaker/i18n/pt.ts +233 -0
  46. package/src/tool/collageMaker/i18n/ru.ts +233 -0
  47. package/src/tool/collageMaker/i18n/sv.ts +233 -0
  48. package/src/tool/collageMaker/i18n/tr.ts +233 -0
  49. package/src/tool/collageMaker/i18n/zh.ts +233 -0
  50. package/src/tool/collageMaker/index.ts +15 -6
  51. package/src/tool/exifCleaner/i18n/de.ts +277 -0
  52. package/src/tool/exifCleaner/i18n/en.ts +2 -2
  53. package/src/tool/exifCleaner/i18n/es.ts +2 -2
  54. package/src/tool/exifCleaner/i18n/fr.ts +4 -4
  55. package/src/tool/exifCleaner/i18n/id.ts +277 -0
  56. package/src/tool/exifCleaner/i18n/it.ts +277 -0
  57. package/src/tool/exifCleaner/i18n/ja.ts +277 -0
  58. package/src/tool/exifCleaner/i18n/ko.ts +277 -0
  59. package/src/tool/exifCleaner/i18n/nl.ts +277 -0
  60. package/src/tool/exifCleaner/i18n/pl.ts +277 -0
  61. package/src/tool/exifCleaner/i18n/pt.ts +277 -0
  62. package/src/tool/exifCleaner/i18n/ru.ts +277 -0
  63. package/src/tool/exifCleaner/i18n/sv.ts +277 -0
  64. package/src/tool/exifCleaner/i18n/tr.ts +277 -0
  65. package/src/tool/exifCleaner/i18n/zh.ts +277 -0
  66. package/src/tool/exifCleaner/index.ts +16 -8
  67. package/src/tool/imageCompressor/i18n/de.ts +242 -0
  68. package/src/tool/imageCompressor/i18n/en.ts +2 -2
  69. package/src/tool/imageCompressor/i18n/es.ts +2 -2
  70. package/src/tool/imageCompressor/i18n/id.ts +242 -0
  71. package/src/tool/imageCompressor/i18n/it.ts +242 -0
  72. package/src/tool/imageCompressor/i18n/ja.ts +242 -0
  73. package/src/tool/imageCompressor/i18n/ko.ts +242 -0
  74. package/src/tool/imageCompressor/i18n/nl.ts +242 -0
  75. package/src/tool/imageCompressor/i18n/pl.ts +242 -0
  76. package/src/tool/imageCompressor/i18n/pt.ts +242 -0
  77. package/src/tool/imageCompressor/i18n/ru.ts +242 -0
  78. package/src/tool/imageCompressor/i18n/sv.ts +242 -0
  79. package/src/tool/imageCompressor/i18n/tr.ts +242 -0
  80. package/src/tool/imageCompressor/i18n/zh.ts +244 -0
  81. package/src/tool/imageCompressor/index.ts +15 -7
  82. package/src/tool/printQualityCalculator/i18n/de.ts +261 -0
  83. package/src/tool/printQualityCalculator/i18n/en.ts +2 -2
  84. package/src/tool/printQualityCalculator/i18n/es.ts +3 -3
  85. package/src/tool/printQualityCalculator/i18n/fr.ts +3 -3
  86. package/src/tool/printQualityCalculator/i18n/id.ts +261 -0
  87. package/src/tool/printQualityCalculator/i18n/it.ts +261 -0
  88. package/src/tool/printQualityCalculator/i18n/ja.ts +261 -0
  89. package/src/tool/printQualityCalculator/i18n/ko.ts +261 -0
  90. package/src/tool/printQualityCalculator/i18n/nl.ts +261 -0
  91. package/src/tool/printQualityCalculator/i18n/pl.ts +261 -0
  92. package/src/tool/printQualityCalculator/i18n/pt.ts +261 -0
  93. package/src/tool/printQualityCalculator/i18n/ru.ts +261 -0
  94. package/src/tool/printQualityCalculator/i18n/sv.ts +261 -0
  95. package/src/tool/printQualityCalculator/i18n/tr.ts +261 -0
  96. package/src/tool/printQualityCalculator/i18n/zh.ts +261 -0
  97. package/src/tool/printQualityCalculator/index.ts +15 -7
  98. package/src/tool/privacyBlur/i18n/de.ts +238 -0
  99. package/src/tool/privacyBlur/i18n/en.ts +1 -1
  100. package/src/tool/privacyBlur/i18n/es.ts +1 -1
  101. package/src/tool/privacyBlur/i18n/fr.ts +1 -1
  102. package/src/tool/privacyBlur/i18n/id.ts +238 -0
  103. package/src/tool/privacyBlur/i18n/it.ts +238 -0
  104. package/src/tool/privacyBlur/i18n/ja.ts +238 -0
  105. package/src/tool/privacyBlur/i18n/ko.ts +238 -0
  106. package/src/tool/privacyBlur/i18n/nl.ts +238 -0
  107. package/src/tool/privacyBlur/i18n/pl.ts +238 -0
  108. package/src/tool/privacyBlur/i18n/pt.ts +238 -0
  109. package/src/tool/privacyBlur/i18n/ru.ts +238 -0
  110. package/src/tool/privacyBlur/i18n/sv.ts +238 -0
  111. package/src/tool/privacyBlur/i18n/tr.ts +238 -0
  112. package/src/tool/privacyBlur/i18n/zh.ts +238 -0
  113. package/src/tool/privacyBlur/index.ts +15 -7
  114. package/src/tool/subtitleSync/i18n/de.ts +241 -0
  115. package/src/tool/subtitleSync/i18n/en.ts +1 -1
  116. package/src/tool/subtitleSync/i18n/es.ts +1 -1
  117. package/src/tool/subtitleSync/i18n/fr.ts +8 -8
  118. package/src/tool/subtitleSync/i18n/id.ts +241 -0
  119. package/src/tool/subtitleSync/i18n/it.ts +241 -0
  120. package/src/tool/subtitleSync/i18n/ja.ts +241 -0
  121. package/src/tool/subtitleSync/i18n/ko.ts +241 -0
  122. package/src/tool/subtitleSync/i18n/nl.ts +241 -0
  123. package/src/tool/subtitleSync/i18n/pl.ts +241 -0
  124. package/src/tool/subtitleSync/i18n/pt.ts +241 -0
  125. package/src/tool/subtitleSync/i18n/ru.ts +241 -0
  126. package/src/tool/subtitleSync/i18n/sv.ts +241 -0
  127. package/src/tool/subtitleSync/i18n/tr.ts +241 -0
  128. package/src/tool/subtitleSync/i18n/zh.ts +241 -0
  129. package/src/tool/subtitleSync/index.ts +15 -7
  130. package/src/tool/timelapseCalculator/i18n/de.ts +169 -0
  131. package/src/tool/timelapseCalculator/i18n/fr.ts +2 -2
  132. package/src/tool/timelapseCalculator/i18n/id.ts +169 -0
  133. package/src/tool/timelapseCalculator/i18n/it.ts +169 -0
  134. package/src/tool/timelapseCalculator/i18n/ja.ts +169 -0
  135. package/src/tool/timelapseCalculator/i18n/ko.ts +169 -0
  136. package/src/tool/timelapseCalculator/i18n/nl.ts +169 -0
  137. package/src/tool/timelapseCalculator/i18n/pl.ts +169 -0
  138. package/src/tool/timelapseCalculator/i18n/pt.ts +169 -0
  139. package/src/tool/timelapseCalculator/i18n/ru.ts +169 -0
  140. package/src/tool/timelapseCalculator/i18n/sv.ts +169 -0
  141. package/src/tool/timelapseCalculator/i18n/tr.ts +169 -0
  142. package/src/tool/timelapseCalculator/i18n/zh.ts +169 -0
  143. package/src/tool/timelapseCalculator/index.ts +16 -8
  144. package/src/tool/tvDistance/i18n/de.ts +223 -0
  145. package/src/tool/tvDistance/i18n/en.ts +1 -1
  146. package/src/tool/tvDistance/i18n/es.ts +1 -1
  147. package/src/tool/tvDistance/i18n/fr.ts +1 -1
  148. package/src/tool/tvDistance/i18n/id.ts +223 -0
  149. package/src/tool/tvDistance/i18n/it.ts +223 -0
  150. package/src/tool/tvDistance/i18n/ja.ts +223 -0
  151. package/src/tool/tvDistance/i18n/ko.ts +223 -0
  152. package/src/tool/tvDistance/i18n/nl.ts +223 -0
  153. package/src/tool/tvDistance/i18n/pl.ts +223 -0
  154. package/src/tool/tvDistance/i18n/pt.ts +223 -0
  155. package/src/tool/tvDistance/i18n/ru.ts +223 -0
  156. package/src/tool/tvDistance/i18n/sv.ts +223 -0
  157. package/src/tool/tvDistance/i18n/tr.ts +223 -0
  158. package/src/tool/tvDistance/i18n/zh.ts +223 -0
  159. package/src/tool/tvDistance/index.ts +15 -7
  160. package/src/tool/videoFrameExtractor/i18n/de.ts +235 -0
  161. package/src/tool/videoFrameExtractor/i18n/en.ts +1 -1
  162. package/src/tool/videoFrameExtractor/i18n/es.ts +1 -1
  163. package/src/tool/videoFrameExtractor/i18n/fr.ts +1 -1
  164. package/src/tool/videoFrameExtractor/i18n/id.ts +235 -0
  165. package/src/tool/videoFrameExtractor/i18n/it.ts +235 -0
  166. package/src/tool/videoFrameExtractor/i18n/ja.ts +235 -0
  167. package/src/tool/videoFrameExtractor/i18n/ko.ts +235 -0
  168. package/src/tool/videoFrameExtractor/i18n/nl.ts +235 -0
  169. package/src/tool/videoFrameExtractor/i18n/pl.ts +235 -0
  170. package/src/tool/videoFrameExtractor/i18n/pt.ts +235 -0
  171. package/src/tool/videoFrameExtractor/i18n/ru.ts +235 -0
  172. package/src/tool/videoFrameExtractor/i18n/sv.ts +235 -0
  173. package/src/tool/videoFrameExtractor/i18n/tr.ts +235 -0
  174. package/src/tool/videoFrameExtractor/i18n/zh.ts +235 -0
  175. package/src/tool/videoFrameExtractor/index.ts +16 -8
@@ -0,0 +1,241 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { SubtitleSyncUI, SubtitleSyncLocaleContent } from '../index';
3
+
4
+ const slug = 'sincronizar-legendas-srt-online-ajustar-tempo-gratis';
5
+ const title = 'Sincronizar Legendas SRT Online: Ajustar Tempo Gratuitamente';
6
+ const description = 'Ferramenta online para adiantar ou atrasar legendas SRT. Corrija facilmente o desfasamento temporal e descarregue o ficheiro sincronizado instantaneamente.';
7
+
8
+ const ui: SubtitleSyncUI = {
9
+ dropTitle: "Arraste o seu ficheiro .SRT aqui",
10
+ dropSubtitle: "ou clique para procurar",
11
+ adjustTitle: "Ajustar Tempo",
12
+ offsetLabel: "Desfasamento (segundos)",
13
+ offsetHelp: "Use valores negativos para adiantar (ex: -1.5) e valores positivos para atrasar.",
14
+ linesStat: "Linhas",
15
+ firstStat: "Primeira Legenda",
16
+ lastStat: "Última Legenda",
17
+ originalLabel: "ORIGINAL",
18
+ resultLabel: "RESULTADO",
19
+ downloadButton: "Descarregar Corrigido",
20
+ previewBadge: "PRÉ-VISUALIZAÇÃO",
21
+ unitSeconds: "seg"
22
+ };
23
+
24
+ const faq: SubtitleSyncLocaleContent['faq'] = [
25
+ {
26
+ question: "Como posso sincronizar as minhas legendas se o áudio estiver adiantado?",
27
+ answer: "Se o áudio aparecer antes do texto, deve atrasar as legendas. Introduza um valor positivo na calculadora (ex: 2.0 para atrasá-las em 2 segundos).",
28
+ },
29
+ {
30
+ question: "Que formatos de ficheiro esta ferramenta aceita?",
31
+ answer: "Atualmente, a ferramenta está otimizada para ficheiros .SRT (SubRip), que é o padrão mais comum em reprodutores de vídeo e plataformas de streaming.",
32
+ },
33
+ {
34
+ question: "É seguro carregar os meus ficheiros de legendas?",
35
+ answer: "Sim, porque o processamento é 100% local no seu dispositivo. Os seus ficheiros não são enviados para nenhum servidor; a sincronização acontece diretamente no seu navegador.",
36
+ },
37
+ {
38
+ question: "Posso sincronizar apenas parte do ficheiro?",
39
+ answer: "Não, esta ferramenta aplica um desfasamento constante a todo o ficheiro. Se o desfasamento for progressivo, poderá necessitar de uma edição mais avançada.",
40
+ },
41
+ ];
42
+
43
+ const howTo: SubtitleSyncLocaleContent['howTo'] = [
44
+ {
45
+ name: "Carregue o seu ficheiro SRT",
46
+ text: "Arraste o ficheiro de legendas que deseja corrigir para a área de carregamento.",
47
+ },
48
+ {
49
+ name: "Identifique o desfasamento",
50
+ text: "Meça quanto atraso ou adiantamento as legendas têm em relação ao áudio no seu reprodutor.",
51
+ },
52
+ {
53
+ name: "Ajuste o desfasamento",
54
+ text: "Introduza os segundos positivos (atraso) ou negativos (adiantamento) no painel de controlo.",
55
+ },
56
+ {
57
+ name: "Descarregue o ficheiro",
58
+ text: "Verifique na pré visualização se os tempos estão corretos e clique em descarregar para obter o seu novo SRT.",
59
+ },
60
+ ];
61
+
62
+ const bibliography: SubtitleSyncLocaleContent['bibliography'] = [
63
+ {
64
+ name: "Especificação do formato SubRip (SRT)",
65
+ url: "https://matroska.org/technical/subtitles.html#srt-subtitles",
66
+ },
67
+ {
68
+ name: "MDN Web Docs - FileReader API",
69
+ url: "https://developer.mozilla.org/en-US/docs/Web/API/FileReader",
70
+ },
71
+ ];
72
+
73
+ const seo: SubtitleSyncLocaleContent['seo'] = [
74
+ {
75
+ type: 'summary',
76
+ title: 'Sincronização Profissional de Legendas',
77
+ items: [
78
+ 'Correção instantânea de desfasamentos áudio-legenda',
79
+ 'Suporta ficheiros SRT (SubRip) padrão',
80
+ 'Processamento 100% local - máxima privacidade',
81
+ 'Sem instalação, sem subscrição, completamente gratuito'
82
+ ]
83
+ },
84
+ { type: 'title', text: 'Sincronização Perfeita de Legendas SRT', level: 2 },
85
+ { type: 'paragraph', html: 'Não há nada mais frustrante para um espectador do que ver diálogos que não correspondem às vozes. O desfasamento de legendas ocorre geralmente devido a diferenças entre versões de vídeo: variações na taxa de fotogramas, cortes publicitários, intros de produção ou alterações na compressão. Com esta ferramenta, resolve o problema em segundos.' },
86
+
87
+ { type: 'stats', items: [
88
+ { value: '100%', label: 'Processamento Local', icon: 'mdi:shield' },
89
+ { value: 'Milissegundos', label: 'Precisão', icon: 'mdi:clock-outline' },
90
+ { value: 'Qualquer', label: 'SEM limite de ficheiro', icon: 'mdi:file-document' }
91
+ ], columns: 3 },
92
+
93
+ { type: 'title', text: 'Adiantar vs Atrasar: Guia Prático', level: 3 },
94
+ { type: 'paragraph', html: 'O primeiro passo é identificar corretamente o tipo de desfasamento. Aqui está a lógica:' },
95
+ { type: 'list', items: [
96
+ '<strong>Atrasar (Valor Positivo):</strong> Quando vê o texto aparecer ANTES do som. As legendas estão adiantadas. Exemplo: +2.0 segundos.',
97
+ '<strong>Adiantar (Valor Negativo):</strong> Quando vê o texto aparecer DEPOIS do som. As legendas estão atrasadas. Exemplo: -2.0 segundos.',
98
+ '<strong>Teste e Ajuste:</strong> Comece com pequenos incrementos (0.5s) e use a pré-visualização para validar.'
99
+ ], icon: 'mdi:arrow-right' },
100
+
101
+ { type: 'card', title: 'Privacidade de Nível Profissional', html: 'Ao processar o ficheiro via JavaScript no lado do cliente, garantimos que o conteúdo das suas legendas nunca sai do seu computador. Essencial para tradutores e profissionais que lidam com material confidencial ou sob NDA.' },
102
+
103
+ { type: 'title', text: 'Casos de Uso Comuns', level: 3 },
104
+ { type: 'comparative', items: [
105
+ {
106
+ title: 'Tradutores e Legendadores',
107
+ description: 'Sincronize traduções após trabalhar com múltiplas versões de vídeo',
108
+ icon: 'mdi:translate',
109
+ points: [
110
+ 'Ficheiros SRT de diferentes fontes',
111
+ 'Versionamento de conteúdo (cinema vs streaming)',
112
+ 'Entrega rápida sem mudar de ferramentas'
113
+ ]
114
+ },
115
+ {
116
+ title: 'Criadores de Conteúdo',
117
+ description: 'Recupere legendas quando o vídeo foi processado com uma taxa de fotogramas diferente',
118
+ icon: 'mdi:video',
119
+ points: [
120
+ 'Reutilize legendas existentes',
121
+ 'Alterações de formato (720p para 1080p)',
122
+ 'Evite o re-ajuste manual de mais de 1000 linhas'
123
+ ],
124
+ highlight: true
125
+ },
126
+ {
127
+ title: 'Utilizadores Casuais',
128
+ description: 'Corrija legendas descarregadas que não se ajustam perfeitamente',
129
+ icon: 'mdi:account',
130
+ points: [
131
+ 'Legendas genéricas fora de sincronia',
132
+ 'Filmes de diferentes regiões (PAL vs NTSC)',
133
+ 'Streaming com versões editadas'
134
+ ]
135
+ }
136
+ ], columns: 3 },
137
+
138
+ { type: 'title', text: 'Por que as Legendas Ficam Fora de Sincronia', level: 3 },
139
+ { type: 'table', headers: ['Causa Comum', 'Descrição Técnica', 'Solução'], rows: [
140
+ ['Diferença de Framerate', '23.976 fps vs 25 fps - diferença acumulada', 'Ajuste de desfasamento único (esta ferramenta)'],
141
+ ['Editorialização', 'Cortes de anúncios ou conteúdo adicional removido', 'Cálculo manual + sincronização'],
142
+ ['Versão Regional', 'PAL (25 fps Europa) vs NTSC (29.97 fps USA)', 'Desfasamento matemático simples'],
143
+ ['Alteração de Resolução', 'Re-codificação com diferente velocidade de processamento', 'Recálculo do ficheiro original']
144
+ ] },
145
+
146
+ { type: 'diagnostic', variant: 'info', title: 'Limitações Técnicas a Considerar', icon: 'mdi:information', badge: 'Importante', html: 'Esta ferramenta aplica um desfasamento <strong>constante</strong> a todo o ficheiro. Se o desfasamento for <strong>progressivo</strong> (começa bem mas fica gradualmente fora de sincronia), isso indica uma diferença persistente na taxa de fotogramas. Nesse caso, o ficheiro original necessita de reprocessamento em software de edição profissional.' },
147
+
148
+ { type: 'proscons', items: [
149
+ {
150
+ pro: 'Velocidade extrema - processa ficheiros grandes em milissegundos',
151
+ con: 'Ajusta apenas desfasamento fixo, não progressivos'
152
+ },
153
+ {
154
+ pro: 'Privacidade total - o conteúdo nunca sai do seu navegador',
155
+ con: 'Requer navegador moderno com JavaScript ativado'
156
+ },
157
+ {
158
+ pro: 'Formato de ficheiro universal - funciona com qualquer SRT padrão',
159
+ con: 'Não suporta outros formatos (ASS, VTT, SCC, etc.)'
160
+ },
161
+ {
162
+ pro: 'Completamente gratuito, sem publicidade, sem rasteio',
163
+ con: 'Sem histórico de alterações ou versionamento'
164
+ }
165
+ ], proTitle: 'Vantagens', conTitle: 'Limitações' },
166
+
167
+ { type: 'glossary', items: [
168
+ {
169
+ term: 'SRT (SubRip)',
170
+ definition: 'O formato de legenda mais universal: ficheiro de texto com números de sequência, tempos (hh:mm:ss,mmm) e texto. Padrão de facto em reprodutores e plataformas.'
171
+ },
172
+ {
173
+ term: 'Desfasamento (Offset)',
174
+ definition: 'Quantidade fixa de tempo adicionada ou subtraída a todos os tempos no ficheiro. Pode ser segundos positivos (atraso) ou negativos (adiantamento).'
175
+ },
176
+ {
177
+ term: 'Taxa de Fotogramas (fps)',
178
+ definition: 'Fotogrammi al secondo. 24p (cinema), 25p (PAL/Europa), 29.97p (NTSC/EUA), 60p (vídeo fluido). Diferenças causam desfasamentos cumulativos.'
179
+ },
180
+ {
181
+ term: 'NTSC vs PAL',
182
+ definition: 'Padrões de televisão regionais: PAL (25 fps) na Europa; NTSC (29.97 fps) nos EUA. Diferença de velocidade de cerca de 4%.'
183
+ },
184
+ {
185
+ term: 'Desfasamento Progressivo',
186
+ definition: 'Quando a sincronização começa correta mas acaba gradualmente fora de sincronia. Indica diferença de framerate, requer reprocessamento.'
187
+ }
188
+ ] },
189
+
190
+ { type: 'message', title: 'Edição Profissional com Controlo Total', ariaLabel: 'Informação técnica sobre sincronização', html: 'A nossa abordagem é simples mas poderosa: um único desfasamento, aplicado instantaneamente, processado 100% no seu navegador. Sem nuvem, sem armazenamento, sem rasteio. Simplesmente carregue, ajuste, descarregue. Controlo total sobre o seu conteúdo.' },
191
+
192
+ { type: 'title', text: 'Conclusão: Filmes Sem Interrupções', level: 3 },
193
+ { type: 'paragraph', html: 'A sincronização perfeita de legendas é essencial para uma experiência audiovisual de qualidade. Com esta ferramenta, transforma uma experiência frustrante numa noite de cinema perfeita, sem a necessidade de software caro ou complicado.' }
194
+ ];
195
+
196
+ const faqSchema: WithContext<FAQPage> = {
197
+ '@context': 'https://schema.org',
198
+ '@type': 'FAQPage',
199
+ mainEntity: faq.map((item) => ({
200
+ '@type': 'Question',
201
+ name: item.question,
202
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
203
+ })),
204
+ };
205
+
206
+ const howToSchema: WithContext<HowTo> = {
207
+ '@context': 'https://schema.org',
208
+ '@type': 'HowTo',
209
+ name: title,
210
+ description,
211
+ step: howTo.map((step) => ({
212
+ '@type': 'HowToStep',
213
+ name: step.name,
214
+ text: step.text,
215
+ })),
216
+ };
217
+
218
+ const appSchema: WithContext<SoftwareApplication> = {
219
+ '@context': 'https://schema.org',
220
+ '@type': 'SoftwareApplication',
221
+ name: title,
222
+ description,
223
+ applicationCategory: 'UtilitiesApplication',
224
+ operatingSystem: 'Web',
225
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
226
+ inLanguage: 'pt',
227
+ };
228
+
229
+ export const content: SubtitleSyncLocaleContent = {
230
+ slug,
231
+ title,
232
+ description,
233
+ ui,
234
+ seo,
235
+ faq,
236
+ faqTitle: 'Perguntas Frequentes sobre Sincronização de Legendas',
237
+ bibliography,
238
+ bibliographyTitle: 'Recursos Técnicos sobre Formatos de Legendas',
239
+ howTo,
240
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
241
+ };
@@ -0,0 +1,241 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { SubtitleSyncUI, SubtitleSyncLocaleContent } from '../index';
3
+
4
+ const slug = 'sinhronizirovat-subtitry-srt-onlajn-ispravit-tajming-besplatno';
5
+ const title = 'Синхронизация субтитров SRT онлайн: Настройка тайминга бесплатно';
6
+ const description = 'Онлайн-инструмент для ускорения или задержки субтитров SRT. Легко исправьте временной сдвиг и мгновенно скачайте синхронизированный файл.';
7
+
8
+ const ui: SubtitleSyncUI = {
9
+ dropTitle: "Перетащите файл .SRT сюда",
10
+ dropSubtitle: "или нажмите для выбора",
11
+ adjustTitle: "Настроить время",
12
+ offsetLabel: "Смещение (секунды)",
13
+ offsetHelp: "Используйте отрицательные значения для ускорения (например, -1.5) и положительные для задержки.",
14
+ linesStat: "Строк",
15
+ firstStat: "Первый субтитр",
16
+ lastStat: "Последний субтитр",
17
+ originalLabel: "ОРИГИНАЛ",
18
+ resultLabel: "РЕЗУЛЬТАТ",
19
+ downloadButton: "Скачать исправленный",
20
+ previewBadge: "ПРЕДПРОСМОТР",
21
+ unitSeconds: "сек"
22
+ };
23
+
24
+ const faq: SubtitleSyncLocaleContent['faq'] = [
25
+ {
26
+ question: "Как мне синхронизировать субтитры, если звук идет раньше?",
27
+ answer: "Если звук появляется раньше текста, вам нужно задержать субтитры. Введите положительное значение в калькулятор (например, 2.0, чтобы задержать их на 2 секунды).",
28
+ },
29
+ {
30
+ question: "Какие форматы файлов принимает этот инструмент?",
31
+ answer: "В настоящее время инструмент оптимизирован для файлов .SRT (SubRip), который является наиболее распространенным стандартом в видеоплеерах и на стриминговых платформах.",
32
+ },
33
+ {
34
+ question: "Безопасно ли загружать мои файлы субтитров?",
35
+ answer: "Да, так как обработка на 100% локальна на вашем устройстве. Ваши файлы не отправляются ни на какой сервер; синхронизация происходит прямо в вашем браузере.",
36
+ },
37
+ {
38
+ question: "Могу ли я синхронизировать только часть файла?",
39
+ answer: "Нет, этот инструмент применяет постоянное смещение ко всему файлу. Если смещение прогрессивное, вам может понадобиться более продвинутое редактирование.",
40
+ },
41
+ ];
42
+
43
+ const howTo: SubtitleSyncLocaleContent['howTo'] = [
44
+ {
45
+ name: "Загрузите файл SRT",
46
+ text: "Перетащите файл субтитров, который вы хотите исправить, в область загрузки.",
47
+ },
48
+ {
49
+ name: "Определите смещение",
50
+ text: "Измерьте в плеере, насколько задерживаются или опережают субтитры относительно звука.",
51
+ },
52
+ {
53
+ name: "Настройте смещение",
54
+ text: "Введите положительные (задержка) или отрицательные (ускорение) секунды в панели управления.",
55
+ },
56
+ {
57
+ name: "Скачайте файл",
58
+ text: "Проверьте в предпросмотре правильность времени и нажмите скачать, чтобы получить новый SRT файл.",
59
+ },
60
+ ];
61
+
62
+ const bibliography: SubtitleSyncLocaleContent['bibliography'] = [
63
+ {
64
+ name: "Спецификация формата SubRip (SRT)",
65
+ url: "https://matroska.org/technical/subtitles.html#srt-subtitles",
66
+ },
67
+ {
68
+ name: "MDN Web Docs - FileReader API",
69
+ url: "https://developer.mozilla.org/en-US/docs/Web/API/FileReader",
70
+ },
71
+ ];
72
+
73
+ const seo: SubtitleSyncLocaleContent['seo'] = [
74
+ {
75
+ type: 'summary',
76
+ title: 'Профессиональная синхронизация субтитров',
77
+ items: [
78
+ 'Мгновенное исправление рассинхрона звука и субтитров',
79
+ 'Поддержка стандартных файлов SRT (SubRip)',
80
+ '100% локальная обработка — максимальная конфиденциальность',
81
+ 'Без установки, без подписки, полностью бесплатно'
82
+ ]
83
+ },
84
+ { type: 'title', text: 'Идеальная синхронизация субтитров SRT', level: 2 },
85
+ { type: 'paragraph', html: 'Нет ничего более неприятного для зрителя, чем диалоги, которые не совпадают с голосами. Рассинхрон субтитров обычно возникает из-за различий между версиями видео: изменений частоты кадров, рекламных вставок, заставок или изменений в компрессии. С помощью этого инструмента вы исправите проблему за секунды.' },
86
+
87
+ { type: 'stats', items: [
88
+ { value: '100%', label: 'Локальная обработка', icon: 'mdi:shield' },
89
+ { value: 'Миллисекунды', label: 'Точность', icon: 'mdi:clock-outline' },
90
+ { value: 'Любой', label: 'БЕЗ лимита по файлам', icon: 'mdi:file-document' }
91
+ ], columns: 3 },
92
+
93
+ { type: 'title', text: 'Ускорение vs Задержка: Практическое руководство', level: 3 },
94
+ { type: 'paragraph', html: 'Первый шаг — правильно определить тип смещения. Вот логика:' },
95
+ { type: 'list', items: [
96
+ '<strong>Задержка (Положительное значение):</strong> Когда текст появляется РАНЬШЕ звука. Субтитры спешат. Пример: +2.0 секунды.',
97
+ '<strong>Ускорение (Отрицательное значение):</strong> Когда текст появляется ПОСЛЕ звука. Субтитры отстают. Пример: -2.0 секунды.',
98
+ '<strong>Тестируйте и настраивайте:</strong> Начните с небольших шагов (0.5 сек) и используйте предпросмотр для проверки.'
99
+ ], icon: 'mdi:arrow-right' },
100
+
101
+ { type: 'card', title: 'Конфиденциальность профессионального уровня', html: 'Обрабатывая файл с помощью JavaScript на клиентской стороне, мы гарантируем, что содержимое ваших субтитров никогда не покинет ваш компьютер. Это важно для переводчиков и профессионалов, работающих с конфиденциальными материалами или по договору о неразглашении (NDA).' },
102
+
103
+ { type: 'title', text: 'Типичные случаи использования', level: 3 },
104
+ { type: 'comparative', items: [
105
+ {
106
+ title: 'Переводчики и субтитровщики',
107
+ description: 'Синхронизируйте переводы после работы с несколькими версиями видео',
108
+ icon: 'mdi:translate',
109
+ points: [
110
+ 'Файлы SRT из разных источников',
111
+ 'Версионность контента (кинотеатральная vs стриминг)',
112
+ 'Быстрая сдача работы без смены инструментов'
113
+ ]
114
+ },
115
+ {
116
+ title: 'Создатели контента',
117
+ description: 'Восстановите субтитры, если видео было обработано с другой частотой кадров',
118
+ icon: 'mdi:video',
119
+ points: [
120
+ 'Повторное использование существующих субтитров',
121
+ 'Изменения формата (с 720p до 1080p)',
122
+ 'Избегайте ручной перенастройки времени для 1000+ строк'
123
+ ],
124
+ highlight: true
125
+ },
126
+ {
127
+ title: 'Обычные пользователи',
128
+ description: 'Исправьте скачанные субтитры, которые не подходят идеально',
129
+ icon: 'mdi:account',
130
+ points: [
131
+ 'Общий рассинхрон субтитров',
132
+ 'Фильмы в разных регионах (PAL vs NTSC)',
133
+ 'Стриминг с отредактированными версиями'
134
+ ]
135
+ }
136
+ ], columns: 3 },
137
+
138
+ { type: 'title', text: 'Почему субтитры теряют синхронизацию', level: 3 },
139
+ { type: 'table', headers: ['Частая причина', 'Техническое описание', 'Решение'], rows: [
140
+ ['Разница в частоте кадров (FPS)', '23.976 fps vs 25 fps — накопленная разница', 'Настройка единого смещения (этот инструмент)'],
141
+ ['Редактирование', 'Рекламные врезки или удаленный/добавленный контент', 'Ручной расчет + синхронизация'],
142
+ ['Региональная версия', 'PAL (25 fps Европа) vs NTSC (29.97 fps США)', 'Простое математическое смещение'],
143
+ ['Изменение разрешения', 'Перекодирование с другой скоростью обработки', 'Перерасчет исходного файла']
144
+ ] },
145
+
146
+ { type: 'diagnostic', variant: 'info', title: 'Технические ограничения', icon: 'mdi:information', badge: 'Важно', html: 'Этот инструмент применяет <strong>постоянное</strong> смещение ко всему файлу. Если смещение <strong>прогрессивное</strong> (в начале все хорошо, но постепенно рассинхрон растет), это указывает на стойкую разницу в частоте кадров. В этом случае исходный файл требует переработки в профессиональном ПО для монтажа.' },
147
+
148
+ { type: 'proscons', items: [
149
+ {
150
+ pro: 'Экстремальная скорость — обрабатывает большие файлы за миллисекунды',
151
+ con: 'Настраивает только фиксированное смещение, не прогрессивное'
152
+ },
153
+ {
154
+ pro: 'Полная конфиденциальность — контент никогда не покидает ваш браузер',
155
+ con: 'Требуется современный браузер с поддержкой JavaScript'
156
+ },
157
+ {
158
+ pro: 'Универсальный формат — работает с любым стандартным SRT',
159
+ con: 'Не поддерживает другие форматы (ASS, VTT, SCC и т. д.)'
160
+ },
161
+ {
162
+ pro: 'Полностью бесплатно, без рекламы, без трекинга',
163
+ con: 'Нет истории изменений или версионности'
164
+ }
165
+ ], proTitle: 'Преимущества', conTitle: 'Ограничения' },
166
+
167
+ { type: 'glossary', items: [
168
+ {
169
+ term: 'SRT (SubRip)',
170
+ definition: 'Самый универсальный формат субтитров: текстовый файл с номерами последовательности, временем (чч:мм:сс,ммм) и текстом. Стандарт де-факто в плеерах и на платформах.'
171
+ },
172
+ {
173
+ term: 'Смещение (Offset)',
174
+ definition: 'Фиксированное количество времени, которое добавляется или вычитается из всех временных меток в файле. Может быть положительным (задержка) или отрицательным (ускорение).'
175
+ },
176
+ {
177
+ term: 'Частота кадров (FPS)',
178
+ definition: 'Кадров в секунду. 24p (кино), 25p (PAL/Европа), 29.97p (NTSC/США), 60p (плавное видео). Различия вызывают кумулятивный рассинхрон.'
179
+ },
180
+ {
181
+ term: 'NTSC vs PAL',
182
+ definition: 'Региональные телевизионные стандарты: PAL (25 кадров/с) в Европе; NTSC (29.97 кадров/с) в США. Разница в скорости около 4%.'
183
+ },
184
+ {
185
+ term: 'Прогрессивное смещение',
186
+ definition: 'Когда синхронизация в начале правильная, но постепенно сбивается. Указывает на разницу в FPS, требует переработки файла.'
187
+ }
188
+ ] },
189
+
190
+ { type: 'message', title: 'Профессиональное редактирование с полным контролем', ariaLabel: 'Техническая информация о синхронизации', html: 'Наш подход прост, но эффективен: единое смещение, применяемое мгновенно, обрабатываемое на 100% в вашем браузере. Никаких облаков, хранилищ или слежки. Просто загрузите, настройте, скачайте. Полный контроль над вашим контентом.' },
191
+
192
+ { type: 'title', text: 'Заключение: Кино без пауз', level: 3 },
193
+ { type: 'paragraph', html: 'Идеальная синхронизация субтитров необходима для качественного аудиовизуального восприярия. С помощью этого инструмента вы превращаете досадную помеху в идеальный кинопросмотр без необходимости в дорогом или сложном ПО.' }
194
+ ];
195
+
196
+ const faqSchema: WithContext<FAQPage> = {
197
+ '@context': 'https://schema.org',
198
+ '@type': 'FAQPage',
199
+ mainEntity: faq.map((item) => ({
200
+ '@type': 'Question',
201
+ name: item.question,
202
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
203
+ })),
204
+ };
205
+
206
+ const howToSchema: WithContext<HowTo> = {
207
+ '@context': 'https://schema.org',
208
+ '@type': 'HowTo',
209
+ name: title,
210
+ description,
211
+ step: howTo.map((step) => ({
212
+ '@type': 'HowToStep',
213
+ name: step.name,
214
+ text: step.text,
215
+ })),
216
+ };
217
+
218
+ const appSchema: WithContext<SoftwareApplication> = {
219
+ '@context': 'https://schema.org',
220
+ '@type': 'SoftwareApplication',
221
+ name: title,
222
+ description,
223
+ applicationCategory: 'UtilitiesApplication',
224
+ operatingSystem: 'Web',
225
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
226
+ inLanguage: 'ru',
227
+ };
228
+
229
+ export const content: SubtitleSyncLocaleContent = {
230
+ slug,
231
+ title,
232
+ description,
233
+ ui,
234
+ seo,
235
+ faq,
236
+ faqTitle: 'Часто задаваемые вопросы о синхронизации субтитров',
237
+ bibliography,
238
+ bibliographyTitle: 'Технические ресурсы по форматам субтитров',
239
+ howTo,
240
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
241
+ };