@jjlmoya/utils-games-development 1.52.0 → 1.53.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.
- package/package.json +1 -1
- package/src/entries.ts +4 -2
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/localizationSanitizer/app-client.ts +270 -0
- package/src/tool/localizationSanitizer/bibliography.astro +6 -0
- package/src/tool/localizationSanitizer/bibliography.ts +14 -0
- package/src/tool/localizationSanitizer/component.astro +116 -0
- package/src/tool/localizationSanitizer/csv-parser.ts +95 -0
- package/src/tool/localizationSanitizer/csv-sanitizer.ts +98 -0
- package/src/tool/localizationSanitizer/entry.ts +28 -0
- package/src/tool/localizationSanitizer/i18n/de.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/en.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/es.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/fr.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/id.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/it.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/ja.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/ko.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/nl.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/pl.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/pt.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/ru.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/sv.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/tr.ts +176 -0
- package/src/tool/localizationSanitizer/i18n/zh.ts +176 -0
- package/src/tool/localizationSanitizer/index.ts +12 -0
- package/src/tool/localizationSanitizer/json-sanitizer.ts +118 -0
- package/src/tool/localizationSanitizer/localization-sanitizer.css +634 -0
- package/src/tool/localizationSanitizer/logic.test.ts +38 -0
- package/src/tool/localizationSanitizer/logic.ts +23 -0
- package/src/tool/localizationSanitizer/seo.astro +15 -0
- package/src/tool/localizationSanitizer/types.ts +55 -0
- package/src/tool/localizationSanitizer/ui.ts +39 -0
- package/src/tools.ts +2 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { LocalizationSanitizerUI } from '../ui';
|
|
3
|
+
|
|
4
|
+
export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
|
|
5
|
+
slug: 'czyszczenie-plikow-lokalizacji-godot-unity',
|
|
6
|
+
title: 'Narzędzie do Czyszczenia Plików CSV i JSON Lokalizacji w Godot i Unity',
|
|
7
|
+
description: 'Sprawdzaj pliki tłumaczeń CSV oraz JSON pod kątem pustych komórek, powielonych kluczy i uszkodzonych wierszy, a następnie eksportuj czystą kopię gotową do importu.',
|
|
8
|
+
ui: {
|
|
9
|
+
csvTab: 'Plik CSV',
|
|
10
|
+
jsonTab: 'Plik JSON',
|
|
11
|
+
dropTitle: 'Upuść plik tłumaczeń tutaj',
|
|
12
|
+
dropSubtitle: 'Sprawdź strukturę w przeglądarce, pozostawiając plik źródłowy na swoim urządzeniu.',
|
|
13
|
+
browseButton: 'Przeglądaj pliki',
|
|
14
|
+
sampleButton: 'Wczytaj przykład',
|
|
15
|
+
clearButton: 'Wyczyść',
|
|
16
|
+
inputLabel: 'Wejście pliku tłumaczeń',
|
|
17
|
+
formatLabel: 'Format',
|
|
18
|
+
healthLabel: 'Stan pliku',
|
|
19
|
+
readyStatus: 'Gotowy do importu',
|
|
20
|
+
reviewStatus: 'Wymaga przeglądu',
|
|
21
|
+
emptyCellsLabel: 'Puste komórki',
|
|
22
|
+
duplicateKeysLabel: 'Duplikaty kluczy',
|
|
23
|
+
malformedRowsLabel: 'Uszkodzone wiersze',
|
|
24
|
+
cleanRowsLabel: 'Prawidłowe wiersze',
|
|
25
|
+
issueListTitle: 'Wykryte problemy',
|
|
26
|
+
noIssues: 'Nie znaleziono problemów w tej analizie.',
|
|
27
|
+
previewTitle: 'Podgląd tłumaczenia',
|
|
28
|
+
previewSubtitle: 'Pierwsze wiersze przedstawiają znormalizowaną strukturę eksportu.',
|
|
29
|
+
exportTitle: 'Eksportuj czysty plik',
|
|
30
|
+
exportSubtitle: 'Usuwane są duplikaty, brakujące kolumny są uzupełniane, a wartości CSV odpowiednio eskapowane.',
|
|
31
|
+
downloadButton: 'Pobierz czysty plik',
|
|
32
|
+
copyButton: 'Kopiuj wynik',
|
|
33
|
+
copiedMessage: 'Sformatowany wynik skopiowany do schowka.',
|
|
34
|
+
emptyIssue: 'Pusta komórka tłumaczenia',
|
|
35
|
+
duplicateIssue: 'Usunięto duplikat klucza',
|
|
36
|
+
malformedIssue: 'Niezgodność kolumn lub cudzysłowów',
|
|
37
|
+
parseIssue: 'Nie można odczytać pliku.',
|
|
38
|
+
rowLabel: 'Wiersz',
|
|
39
|
+
columnLabel: 'Kolumna',
|
|
40
|
+
keyLabel: 'Klucz',
|
|
41
|
+
sampleFileName: 'przyklad-lokalizacji.csv',
|
|
42
|
+
privacyNote: 'Lokalne przetwarzanie w przeglądarce',
|
|
43
|
+
waitingTitle: 'Oczekiwanie na plik',
|
|
44
|
+
waitingSubtitle: 'Upuść plik CSV lub JSON, aby rozpocząć analizę.',
|
|
45
|
+
fileTypeNote: 'UTF-8 CSV lub strukturalny JSON',
|
|
46
|
+
},
|
|
47
|
+
seo: [
|
|
48
|
+
{ type: 'title', level: 2, text: 'Dlaczego pliki lokalizacji psują się podczas importu do silnika' },
|
|
49
|
+
{
|
|
50
|
+
type: 'paragraph',
|
|
51
|
+
html: 'Tabele tłumaczeń są proste w edycji, ale łatwo je uszkodzić. Przecinek wewnątrz zdania lub brakujący cudzysłów mogą przesunąć wartości do niewłaściwej kolumny języka.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: 'Importer CSV w Godot oraz pakiet Unity Localization wymagają spójnej struktury. Narzędzie sprawdza plik przed importem do projektu.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'stats',
|
|
59
|
+
columns: 4,
|
|
60
|
+
items: [
|
|
61
|
+
{ value: 'CSV', label: 'Weryfikacja przecinków' },
|
|
62
|
+
{ value: 'JSON', label: 'Obsługa tablic i obiektów' },
|
|
63
|
+
{ value: '0 wysyłek', label: '100% lokalnie' },
|
|
64
|
+
{ value: '1 kliknięcie', label: 'Czysty eksport' },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{ type: 'title', level: 2, text: 'Co weryfikuje narzędzie' },
|
|
68
|
+
{
|
|
69
|
+
type: 'comparative',
|
|
70
|
+
columns: 2,
|
|
71
|
+
items: [
|
|
72
|
+
{
|
|
73
|
+
title: 'Wykrywane przed importem',
|
|
74
|
+
description: 'Błędy trudne do zauważenia w dużych plikach',
|
|
75
|
+
points: ['Puste komórki tłumaczeń', 'Powielone klucze identyfikacyjne', 'Wiersze ze złą liczbą kolumn', 'Niepoprawna składnia cudzysłowów'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
title: 'Normalizowane przy eksporcie',
|
|
79
|
+
description: 'Bezpieczne automatyczne poprawki',
|
|
80
|
+
points: ['Uzupełnianie brakujących kolumn', 'Łączenie nadmiarowych pól w ostatniej kolumnie', 'Zachowanie pierwszego wystąpienia klucza', 'Naruszenie pliku źródłowego jest wykluczone'],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{ type: 'title', level: 2, text: 'Jak weryfikować oczyszczony plik' },
|
|
85
|
+
{
|
|
86
|
+
type: 'paragraph',
|
|
87
|
+
html: 'Czyszczenie strukturalne nie zastępuje korekty językowej. Użyj listy wykrytych problemów, aby uzupełnić brakujące tłumaczenia.',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: 'table',
|
|
91
|
+
headers: ['Wykryty problem', 'Znaczenie', 'Zalecane działanie'],
|
|
92
|
+
rows: [
|
|
93
|
+
['Pusta komórka', 'Brak tekstu w kolumnie języka', 'Uzupełnij tłumaczenie lub potwierdź celowy brak'],
|
|
94
|
+
['Duplikat klucza', 'Wiele wierszy używa tego samego klucza', 'Porównaj wiersze i pozostaw pierwszy'],
|
|
95
|
+
['Uszkodzony wiersz', 'Liczba kolumn odbiega od nagłówka', 'Sprawdź połączoną kolumnę końcową'],
|
|
96
|
+
['Błąd odczytu', 'Niepoprawny JSON', 'Popraw składnię przed importem'],
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{ type: 'title', level: 2, text: 'Zasady CSV dla gier' },
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'Pola zawierające przecinki lub znaki nowej linii muszą być ujęte w cudzysłowy.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'tip',
|
|
106
|
+
title: 'Zachowaj oryginał',
|
|
107
|
+
html: 'Zawsze zachowuj oryginalny plik od tłumacza w celu weryfikacji.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'glossary',
|
|
111
|
+
items: [
|
|
112
|
+
{ term: 'Klucz tłumaczenia', definition: 'Unikalny identyfikator używany w kodzie gry.' },
|
|
113
|
+
{ term: 'Pole CSV', definition: 'Pojedyncza wartość między separatorami.' },
|
|
114
|
+
{ term: 'Eskapowanie', definition: 'Użycie cudzysłowów dla zachowania znaków interpunkcyjnych.' },
|
|
115
|
+
{ term: 'Locale', definition: 'Kod języka i regionu, np. pl, en lub ja.' },
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
faq: [
|
|
120
|
+
{
|
|
121
|
+
question: 'Czy pliki są przesyłane na serwer?',
|
|
122
|
+
answer: 'Nie, całe przetwarzanie odbywa się lokalnie w przeglądarce.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
question: 'Co się dzieje w przypadku dodatkowych przecinków?',
|
|
126
|
+
answer: 'Wiersz jest oznaczany jako uszkodzony, a dodatkowe pola łączone w ostatnią kolumnę.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
question: 'Jak usuwane są duplikaty kluczy?',
|
|
130
|
+
answer: 'Zachowywane jest pierwsze wystąpienie, a kolejne są pomijane.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
question: 'Czy narzędzie sprawdza jakość tłumaczenia?',
|
|
134
|
+
answer: 'Nie, weryfikuje jedynie strukturę pliku i kompletność pól.',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
howTo: [
|
|
138
|
+
{ name: 'Wybierz format', text: 'Wybierz CSV lub JSON.' },
|
|
139
|
+
{ name: 'Sprawdź wykryte błędy', text: 'Wgraj plik i przeanalizuj listę problemów.' },
|
|
140
|
+
{ name: 'Eksportuj i przetestuj', text: 'Pobierz czysty plik i zaimportuj go do silnika.' },
|
|
141
|
+
],
|
|
142
|
+
schemas: [
|
|
143
|
+
{
|
|
144
|
+
'@context': 'https://schema.org',
|
|
145
|
+
'@type': 'SoftwareApplication',
|
|
146
|
+
name: 'Narzędzie do Czyszczenia Plików CSV i JSON Lokalizacji w Godot i Unity',
|
|
147
|
+
applicationCategory: 'DeveloperApplication',
|
|
148
|
+
operatingSystem: 'Any',
|
|
149
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'PLN' },
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
'@context': 'https://schema.org',
|
|
153
|
+
'@type': 'FAQPage',
|
|
154
|
+
mainEntity: [{
|
|
155
|
+
'@type': 'Question',
|
|
156
|
+
name: 'Czy pliki są przesyłane na serwer?',
|
|
157
|
+
acceptedAnswer: { '@type': 'Answer', text: 'Nie, całe przetwarzanie odbywa się lokalnie w przeglądarce.' },
|
|
158
|
+
}],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
'@context': 'https://schema.org',
|
|
162
|
+
'@type': 'HowTo',
|
|
163
|
+
name: 'Jak oczyścić plik lokalizacji gry',
|
|
164
|
+
step: [
|
|
165
|
+
{ '@type': 'HowToStep', name: 'Wybierz format', text: 'Wybierz CSV lub JSON.' },
|
|
166
|
+
{ '@type': 'HowToStep', name: 'Sprawdź wykryte błędy', text: 'Wgraj plik i przeanalizuj listę problemów.' },
|
|
167
|
+
{ '@type': 'HowToStep', name: 'Eksportuj i przetestuj', text: 'Pobierz czysty plik i zaimportuj go do silnika.' },
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
bibliography: [
|
|
172
|
+
{ name: 'Dokumentacja Godot ResourceImporterCSVTranslation', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
|
|
173
|
+
{ name: 'Dokumentacja Unity Localization CSV Import', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
|
|
174
|
+
{ name: 'Specyfikacja RFC 4180 CSV', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
|
|
175
|
+
],
|
|
176
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { LocalizationSanitizerUI } from '../ui';
|
|
3
|
+
|
|
4
|
+
export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
|
|
5
|
+
slug: 'depurador-csv-localizacao-godot-unity',
|
|
6
|
+
title: 'Depurador de Arquivos CSV e JSON de Localização para Godot e Unity',
|
|
7
|
+
description: 'Inspecione arquivos CSV ou JSON de tradução em busca de células vazias, chaves duplicadas e linhas corrompidas, e exporte uma cópia limpa pronta para importação.',
|
|
8
|
+
ui: {
|
|
9
|
+
csvTab: 'Arquivo CSV',
|
|
10
|
+
jsonTab: 'Arquivo JSON',
|
|
11
|
+
dropTitle: 'Arraste um arquivo de tradução aqui',
|
|
12
|
+
dropSubtitle: 'Inspecione a estrutura no navegador mantendo o arquivo fonte no seu dispositivo.',
|
|
13
|
+
browseButton: 'Procurar arquivos',
|
|
14
|
+
sampleButton: 'Carregar exemplo',
|
|
15
|
+
clearButton: 'Limpar',
|
|
16
|
+
inputLabel: 'Entrada de arquivo de tradução',
|
|
17
|
+
formatLabel: 'Formato',
|
|
18
|
+
healthLabel: 'Estado do arquivo',
|
|
19
|
+
readyStatus: 'Pronto para importar',
|
|
20
|
+
reviewStatus: 'Requer revisão',
|
|
21
|
+
emptyCellsLabel: 'Células vazias',
|
|
22
|
+
duplicateKeysLabel: 'Chaves duplicadas',
|
|
23
|
+
malformedRowsLabel: 'Linhas corrompidas',
|
|
24
|
+
cleanRowsLabel: 'Linhas limpas',
|
|
25
|
+
issueListTitle: 'Resultados',
|
|
26
|
+
noIssues: 'Nenhum problema encontrado nesta análise.',
|
|
27
|
+
previewTitle: 'Pré-visualização da tradução',
|
|
28
|
+
previewSubtitle: 'As primeiras linhas mostram a estrutura normalizada que será exportada.',
|
|
29
|
+
exportTitle: 'Exportar arquivo limpo',
|
|
30
|
+
exportSubtitle: 'Duplicados são removidos, colunas ausentes são preenchidas e os valores CSV formatados.',
|
|
31
|
+
downloadButton: 'Baixar arquivo limpo',
|
|
32
|
+
copyButton: 'Copiar resultado',
|
|
33
|
+
copiedMessage: 'Resultado limpo copiado para a área de transferência.',
|
|
34
|
+
emptyIssue: 'Célula de tradução vazia',
|
|
35
|
+
duplicateIssue: 'Chave duplicada removida',
|
|
36
|
+
malformedIssue: 'Erro de colunas ou aspas',
|
|
37
|
+
parseIssue: 'Não foi possível ler o arquivo.',
|
|
38
|
+
rowLabel: 'Linha',
|
|
39
|
+
columnLabel: 'Coluna',
|
|
40
|
+
keyLabel: 'Chave',
|
|
41
|
+
sampleFileName: 'exemplo-localizacao.csv',
|
|
42
|
+
privacyNote: 'Processamento local no navegador',
|
|
43
|
+
waitingTitle: 'Aguardando arquivo',
|
|
44
|
+
waitingSubtitle: 'Arraste um arquivo CSV ou JSON para iniciar a inspeção.',
|
|
45
|
+
fileTypeNote: 'CSV UTF-8 ou JSON estruturado',
|
|
46
|
+
},
|
|
47
|
+
seo: [
|
|
48
|
+
{ type: 'title', level: 2, text: 'Por que arquivos de localização falham na importação' },
|
|
49
|
+
{
|
|
50
|
+
type: 'paragraph',
|
|
51
|
+
html: 'Tabelas de tradução são simples de editar, mas vulneráveis a erros de formatação. Uma vírgula sem escape ou aspas ausentes podem deslocar colunas de idioma.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: 'O importador CSV do Godot e o pacote Unity Localization exigem uma estrutura rigorosa. Esta ferramenta verifica seus arquivos antes da importação.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'stats',
|
|
59
|
+
columns: 4,
|
|
60
|
+
items: [
|
|
61
|
+
{ value: 'CSV', label: 'Verificação de vírgulas' },
|
|
62
|
+
{ value: 'JSON', label: 'Suporte a arrays e mapas' },
|
|
63
|
+
{ value: '0 uploads', label: 'Totalmente local' },
|
|
64
|
+
{ value: '1 clique', label: 'Exportação limpa' },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{ type: 'title', level: 2, text: 'O que o depurador verifica' },
|
|
68
|
+
{
|
|
69
|
+
type: 'comparative',
|
|
70
|
+
columns: 2,
|
|
71
|
+
items: [
|
|
72
|
+
{
|
|
73
|
+
title: 'Detectado antes da importação',
|
|
74
|
+
description: 'Problemas difíceis de notar em arquivos grandes',
|
|
75
|
+
points: ['Células vazias de tradução', 'Chaves duplicadas', 'Linhas com colunas ausentes ou em excesso', 'Sintaxe de aspas inválida'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
title: 'Normalizado na exportação',
|
|
79
|
+
description: 'Correções automáticas seguras',
|
|
80
|
+
points: ['Preenchimento de colunas ausentes', 'Fusão de campos extras na última coluna', 'Manutenção da primeira ocorrência da chave', 'Arquivo original permanece intacto'],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{ type: 'title', level: 2, text: 'Como revisar o arquivo depurado' },
|
|
85
|
+
{
|
|
86
|
+
type: 'paragraph',
|
|
87
|
+
html: 'A limpeza estrutural não substitui a revisão linguística. Use a lista de resultados para preencher traduções faltantes.',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: 'table',
|
|
91
|
+
headers: ['Resultado', 'Significado', 'Ação recomendada'],
|
|
92
|
+
rows: [
|
|
93
|
+
['Célula vazia', 'Coluna de idioma sem texto', 'Traduzir ou confirmar ausência intencional'],
|
|
94
|
+
['Chave duplicada', 'Várias linhas usam a mesma chave', 'Comparar linhas e manter a primeira'],
|
|
95
|
+
['Linha corrompida', 'Contagem de colunas divergente', 'Verificar linha mesclada'],
|
|
96
|
+
['Erro de leitura', 'JSON inválido', 'Corrigir sintaxe antes de importar'],
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{ type: 'title', level: 2, text: 'Regras CSV para jogos' },
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'Campos com vírgulas ou quebras de linha devem estar entre aspas duplas.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'tip',
|
|
106
|
+
title: 'Guarde o original',
|
|
107
|
+
html: 'Mantenha sempre o arquivo original enviado pelo tradutor como backup.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'glossary',
|
|
111
|
+
items: [
|
|
112
|
+
{ term: 'Chave de tradução', definition: 'Identificador único usado pelo código do jogo.' },
|
|
113
|
+
{ term: 'Campo CSV', definition: 'Valor individual entre delimitadores.' },
|
|
114
|
+
{ term: 'Escapamento', definition: 'Uso de aspas para preservar pontuação.' },
|
|
115
|
+
{ term: 'Locale', definition: 'Código de idioma e região como pt, en ou ja.' },
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
faq: [
|
|
120
|
+
{
|
|
121
|
+
question: 'Os arquivos são enviados para um servidor?',
|
|
122
|
+
answer: 'Não, todo o processamento é feito localmente no navegador.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
question: 'O que acontece se uma linha CSV tiver vírgulas extras?',
|
|
126
|
+
answer: 'A linha é marcada como corrompida e os campos extras são unidos na última coluna.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
question: 'Como as chaves duplicadas são limpas?',
|
|
130
|
+
answer: 'A primeira ocorrência é mantida e as seguintes são ignoradas.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
question: 'A ferramenta avalia a qualidade da tradução?',
|
|
134
|
+
answer: 'Não, ela verifica apenas a estrutura do arquivo e se há células vazias.',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
howTo: [
|
|
138
|
+
{ name: 'Escolher o formato', text: 'Selecione CSV ou JSON.' },
|
|
139
|
+
{ name: 'Inspecionar resultados', text: 'Arraste o arquivo e confira a lista de erros.' },
|
|
140
|
+
{ name: 'Exportar e testar', text: 'Baixe o arquivo limpo e importe-o no seu motor.' },
|
|
141
|
+
],
|
|
142
|
+
schemas: [
|
|
143
|
+
{
|
|
144
|
+
'@context': 'https://schema.org',
|
|
145
|
+
'@type': 'SoftwareApplication',
|
|
146
|
+
name: 'Depurador de Arquivos CSV e JSON de Localização para Godot e Unity',
|
|
147
|
+
applicationCategory: 'DeveloperApplication',
|
|
148
|
+
operatingSystem: 'Any',
|
|
149
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
'@context': 'https://schema.org',
|
|
153
|
+
'@type': 'FAQPage',
|
|
154
|
+
mainEntity: [{
|
|
155
|
+
'@type': 'Question',
|
|
156
|
+
name: 'Os arquivos são enviados para um servidor?',
|
|
157
|
+
acceptedAnswer: { '@type': 'Answer', text: 'Não, todo o processamento é feito localmente no navegador.' },
|
|
158
|
+
}],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
'@context': 'https://schema.org',
|
|
162
|
+
'@type': 'HowTo',
|
|
163
|
+
name: 'Como depurar um arquivo de localização',
|
|
164
|
+
step: [
|
|
165
|
+
{ '@type': 'HowToStep', name: 'Escolher o formato', text: 'Selecione CSV ou JSON.' },
|
|
166
|
+
{ '@type': 'HowToStep', name: 'Inspecionar resultados', text: 'Arraste o arquivo e confira a lista de erros.' },
|
|
167
|
+
{ '@type': 'HowToStep', name: 'Exportar e testar', text: 'Baixe o arquivo limpo e importe-o no seu motor.' },
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
bibliography: [
|
|
172
|
+
{ name: 'Documentação ResourceImporterCSVTranslation Godot', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
|
|
173
|
+
{ name: 'Documentação Unity Localization CSV Import', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
|
|
174
|
+
{ name: 'Especificação RFC 4180 CSV', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
|
|
175
|
+
],
|
|
176
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { LocalizationSanitizerUI } from '../ui';
|
|
3
|
+
|
|
4
|
+
export const content: ToolLocaleContent<LocalizationSanitizerUI> = {
|
|
5
|
+
slug: 'ochistka-failov-lokalizacii-godot-unity',
|
|
6
|
+
title: 'Инструмент очистки файлов локализации CSV и JSON для Godot и Unity',
|
|
7
|
+
description: 'Проверяйте файлы переводов CSV и JSON на наличие пустых ячеек, дубликатов ключей и поврежденных строк с последующим экспортом чистой копии.',
|
|
8
|
+
ui: {
|
|
9
|
+
csvTab: 'Файл CSV',
|
|
10
|
+
jsonTab: 'Файл JSON',
|
|
11
|
+
dropTitle: 'Перетащите файл перевода сюда',
|
|
12
|
+
dropSubtitle: 'Проверяйте структуру в браузере с сохранением исходного файла на устройстве.',
|
|
13
|
+
browseButton: 'Обзор файлов',
|
|
14
|
+
sampleButton: 'Загрузить пример',
|
|
15
|
+
clearButton: 'Очистить',
|
|
16
|
+
inputLabel: 'Входной файл перевода',
|
|
17
|
+
formatLabel: 'Формат',
|
|
18
|
+
healthLabel: 'Состояние файла',
|
|
19
|
+
readyStatus: 'Готов к импорту',
|
|
20
|
+
reviewStatus: 'Требуется проверка',
|
|
21
|
+
emptyCellsLabel: 'Пустые ячейки',
|
|
22
|
+
duplicateKeysLabel: 'Дубликаты ключей',
|
|
23
|
+
malformedRowsLabel: 'Поврежденные строки',
|
|
24
|
+
cleanRowsLabel: 'Корректные строки',
|
|
25
|
+
issueListTitle: 'Найденные проблемы',
|
|
26
|
+
noIssues: 'Проблем не обнаружено.',
|
|
27
|
+
previewTitle: 'Предпросмотр перевода',
|
|
28
|
+
previewSubtitle: 'Первые строки показывают нормализованную структуру для экспорта.',
|
|
29
|
+
exportTitle: 'Экспорт очищенного файла',
|
|
30
|
+
exportSubtitle: 'Дубликаты удаляются, недостающие столбцы заполняются, спецсимволы экранируются.',
|
|
31
|
+
downloadButton: 'Скачать чистый файл',
|
|
32
|
+
copyButton: 'Копировать результат',
|
|
33
|
+
copiedMessage: 'Результат скопирован в буфер обмена.',
|
|
34
|
+
emptyIssue: 'Пустая ячейка перевода',
|
|
35
|
+
duplicateIssue: 'Дублирующийся ключ удален',
|
|
36
|
+
malformedIssue: 'Несоответствие столбцов или кавычек',
|
|
37
|
+
parseIssue: 'Не удалось прочитать файл.',
|
|
38
|
+
rowLabel: 'Строка',
|
|
39
|
+
columnLabel: 'Столбец',
|
|
40
|
+
keyLabel: 'Ключ',
|
|
41
|
+
sampleFileName: 'lokalizaciya-primer.csv',
|
|
42
|
+
privacyNote: 'Локальная обработка в браузере',
|
|
43
|
+
waitingTitle: 'Ожидание файла',
|
|
44
|
+
waitingSubtitle: 'Перетащите файл CSV или JSON для начала проверки.',
|
|
45
|
+
fileTypeNote: 'UTF-8 CSV или структурированный JSON',
|
|
46
|
+
},
|
|
47
|
+
seo: [
|
|
48
|
+
{ type: 'title', level: 2, text: 'Почему файлы локализации вызывают ошибки при импорте в движок' },
|
|
49
|
+
{
|
|
50
|
+
type: 'paragraph',
|
|
51
|
+
html: 'Таблицы переводов легко редактировать, но в них легко допустить ошибку. Запятая внутри текста или пропущенная кавычка могут сместить столбцы языков.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'paragraph',
|
|
55
|
+
html: 'Импортер CSV в Godot и пакет Unity Localization требуют строгой структуры. Этот инструмент проверяет файлы перед импортом.',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
type: 'stats',
|
|
59
|
+
columns: 4,
|
|
60
|
+
items: [
|
|
61
|
+
{ value: 'CSV', label: 'Проверка запятых' },
|
|
62
|
+
{ value: 'JSON', label: 'Поддержка массивов и объектов' },
|
|
63
|
+
{ value: '0 отправка', label: '100% локально' },
|
|
64
|
+
{ value: '1 клик', label: 'Чистый экспорт' },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{ type: 'title', level: 2, text: 'Что проверяет инструмент' },
|
|
68
|
+
{
|
|
69
|
+
type: 'comparative',
|
|
70
|
+
columns: 2,
|
|
71
|
+
items: [
|
|
72
|
+
{
|
|
73
|
+
title: 'Обнаружение перед импортом',
|
|
74
|
+
description: 'Ошибки, незаметные в больших файлах',
|
|
75
|
+
points: ['Пустые ячейки перевода', 'Повторяющиеся ключи', 'Строки с неверным числом столбцов', 'Некорректный синтаксис кавычек'],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
title: 'Нормализация при экспорте',
|
|
79
|
+
description: 'Безопасные автоматические исправления',
|
|
80
|
+
points: ['Заполнение недостающих столбцов', 'Объединение лишних полей в последний столбец', 'Сохранение первого вхождения ключа', 'Исходный файл не изменяется'],
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{ type: 'title', level: 2, text: 'Как проверить очищенный файл' },
|
|
85
|
+
{
|
|
86
|
+
type: 'paragraph',
|
|
87
|
+
html: 'Структурная очистка не заменяет языковую вычитку. Используйте список замечаний для заполнения пропущенных переводов.',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: 'table',
|
|
91
|
+
headers: ['Замечание', 'Значение', 'Рекомендуемое действие'],
|
|
92
|
+
rows: [
|
|
93
|
+
['Пустая ячейка', 'Столбец языка не содержит текста', 'Перевести или подтвердить намеренность'],
|
|
94
|
+
['Дубликат ключа', 'Несколько строк используют один ключ', 'Сравнить строки и оставить первую'],
|
|
95
|
+
['Поврежденная строка', 'Число столбцов не совпадает с заголовком', 'Проверить объединенный столбец'],
|
|
96
|
+
['Ошибка чтения', 'Некорректный JSON', 'Исправить синтаксис перед импортом'],
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{ type: 'title', level: 2, text: 'Правила CSV для видеоигр' },
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'Текст, содержащий запятые или переносы строк, должен заключаться в двойные кавычки.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'tip',
|
|
106
|
+
title: 'Сохраняйте оригинал',
|
|
107
|
+
html: 'Всегда сохраняйте исходный файл от переводчика для сравнения.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'glossary',
|
|
111
|
+
items: [
|
|
112
|
+
{ term: 'Ключ перевода', definition: 'Уникальный идентификатор, используемый в коде игры.' },
|
|
113
|
+
{ term: 'Поле CSV', definition: 'Отдельное значение между разделителями.' },
|
|
114
|
+
{ term: 'Экранирование', definition: 'Использование кавычек для сохранения знаков препинания.' },
|
|
115
|
+
{ term: 'Локаль', definition: 'Код языка и региона, например ru, en или ja.' },
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
faq: [
|
|
120
|
+
{
|
|
121
|
+
question: 'Передаются ли файлы на сервер?',
|
|
122
|
+
answer: 'Нет, вся обработка происходит исключительно локально в браузере.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
question: 'Что происходит при наличии лишних запятых?',
|
|
126
|
+
answer: 'Строка помечается как поврежденная, а лишние поля объединяются в последний столбец.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
question: 'Как удаляются дубликаты ключей?',
|
|
130
|
+
answer: 'Сохраняется первое вхождение ключа, последующие игнорируются.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
question: 'Проверяется ли качество перевода?',
|
|
134
|
+
answer: 'Нет, проверяется только структура файла и наличие пустых ячеек.',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
howTo: [
|
|
138
|
+
{ name: 'Выбрать формат', text: 'Выберите CSV или JSON.' },
|
|
139
|
+
{ name: 'Проверить замечания', text: 'Загрузите файл и просмотрите список ошибок.' },
|
|
140
|
+
{ name: 'Экспортировать и протестировать', text: 'Скачайте чистый файл и импортируйте его в движок.' },
|
|
141
|
+
],
|
|
142
|
+
schemas: [
|
|
143
|
+
{
|
|
144
|
+
'@context': 'https://schema.org',
|
|
145
|
+
'@type': 'SoftwareApplication',
|
|
146
|
+
name: 'Инструмент очистки файлов локализации CSV и JSON для Godot и Unity',
|
|
147
|
+
applicationCategory: 'DeveloperApplication',
|
|
148
|
+
operatingSystem: 'Any',
|
|
149
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'RUB' },
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
'@context': 'https://schema.org',
|
|
153
|
+
'@type': 'FAQPage',
|
|
154
|
+
mainEntity: [{
|
|
155
|
+
'@type': 'Question',
|
|
156
|
+
name: 'Передаются ли файлы на сервер?',
|
|
157
|
+
acceptedAnswer: { '@type': 'Answer', text: 'Нет, вся обработка происходит исключительно локально в браузере.' },
|
|
158
|
+
}],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
'@context': 'https://schema.org',
|
|
162
|
+
'@type': 'HowTo',
|
|
163
|
+
name: 'Как очистить файл локализации игры',
|
|
164
|
+
step: [
|
|
165
|
+
{ '@type': 'HowToStep', name: 'Выбрать формат', text: 'Выберите CSV или JSON.' },
|
|
166
|
+
{ '@type': 'HowToStep', name: 'Проверить замечания', text: 'Загрузите файл и просмотрите список ошибок.' },
|
|
167
|
+
{ '@type': 'HowToStep', name: 'Экспортировать и протестировать', text: 'Скачайте чистый файл и импортируйте его в движок.' },
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
bibliography: [
|
|
172
|
+
{ name: 'Документация Godot ResourceImporterCSVTranslation', url: 'https://docs.godotengine.org/en/stable/classes/class_resourceimportercsvtranslation.html' },
|
|
173
|
+
{ name: 'Документация Unity Localization CSV Import', url: 'https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/CSV.html' },
|
|
174
|
+
{ name: 'Спецификация RFC 4180 CSV', url: 'https://datatracker.ietf.org/doc/html/rfc4180' },
|
|
175
|
+
],
|
|
176
|
+
};
|