omni-viewer-core 0.1.0 → 0.2.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 (40) hide show
  1. package/dist/i18n/catalog.de.d.ts +1 -0
  2. package/dist/i18n/catalog.de.js +68 -0
  3. package/dist/i18n/catalog.en.js +3 -0
  4. package/dist/i18n/catalog.fr.d.ts +1 -0
  5. package/dist/i18n/catalog.fr.js +68 -0
  6. package/dist/i18n/catalog.it.d.ts +1 -0
  7. package/dist/i18n/catalog.it.js +68 -0
  8. package/dist/i18n/catalog.ja.d.ts +1 -0
  9. package/dist/i18n/catalog.ja.js +288 -0
  10. package/dist/i18n/catalog.ko.js +372 -26
  11. package/dist/i18n/catalog.th.d.ts +1 -0
  12. package/dist/i18n/catalog.th.js +68 -0
  13. package/dist/i18n/catalog.zh-cn.d.ts +1 -0
  14. package/dist/i18n/catalog.zh-cn.js +265 -0
  15. package/dist/i18n/catalog.zh-tw.d.ts +1 -0
  16. package/dist/i18n/catalog.zh-tw.js +52 -0
  17. package/dist/i18n/index.d.ts +7 -0
  18. package/dist/i18n/index.js +35 -2
  19. package/dist/parsers/archive/index.d.ts +16 -2
  20. package/dist/parsers/archive/index.js +39 -11
  21. package/dist/parsers/archive/model.d.ts +20 -0
  22. package/dist/parsers/audio/index.d.ts +3 -0
  23. package/dist/parsers/audio/index.js +5 -0
  24. package/dist/parsers/video/index.d.ts +3 -0
  25. package/dist/parsers/video/index.js +3 -0
  26. package/dist/styles/archive.css +1 -0
  27. package/dist/styles/audio.css +8 -0
  28. package/dist/styles/ppt.css +1 -1
  29. package/dist/viewers/archive/index.d.ts +17 -1
  30. package/dist/viewers/archive/index.js +124 -21
  31. package/dist/viewers/archive/styles.d.ts +1 -1
  32. package/dist/viewers/archive/styles.js +1 -0
  33. package/dist/viewers/audio/styles.js +8 -0
  34. package/dist/viewers/ppt/chart.js +11 -4
  35. package/dist/viewers/ppt/render.js +30 -3
  36. package/dist/viewers/ppt/styles.d.ts +1 -1
  37. package/dist/viewers/ppt/styles.js +1 -1
  38. package/package.json +2 -2
  39. package/dist/viewers/hwp/self-loading.d.ts +0 -2
  40. package/dist/viewers/hwp/self-loading.js +0 -6
@@ -1,5 +1,6 @@
1
- // Korean messages owned by core. Missing keys intentionally fall back to the
2
- // English source catalog in i18n/index.ts.
1
+ // Korean message catalog. Every key in catalog.en.ts is translated here; any key
2
+ // that is ever missing intentionally falls back to the English source catalog in
3
+ // i18n/index.ts. Format names and proto keywords are intentionally left verbatim.
3
4
  export const CATALOG_KO = {
4
5
  'audio.title': '오디오', 'video.title': '비디오', 'dbc.title': 'CAN 데이터베이스',
5
6
  'audio.play': '재생', 'audio.pause': '일시정지', 'audio.stop': '정지',
@@ -35,34 +36,379 @@ export const CATALOG_KO = {
35
36
  'shapefile.noRecord': '이 피처와 일치하는 속성 레코드가 없습니다.',
36
37
  'shapefile.dbfFailed': '속성 테이블(.dbf)을 읽을 수 없습니다:',
37
38
  'shapefile.reprojectFailed': '재투영에 실패하여 원본 좌표계로 표시합니다.',
38
- 'avro.title': 'Apache Avro',
39
- 'bag.title': 'ROS bag',
40
- 'stp.title': 'STEP 모델',
41
- 'db3.title': 'SQLite 데이터베이스',
42
- 'reqif.title': '요구사항 교환 형식',
43
- 'automotive.search': '표 검색…',
44
- 'automotive.copyJson': 'JSON 복사',
45
- 'automotive.rawPreview': '원문 미리보기',
46
- 'automotive.noData': '표시할 데이터가 없습니다.',
39
+ 'avro.title': 'Apache Avro', 'bag.title': 'ROS bag', 'stp.title': 'STEP 모델',
40
+ 'db3.title': 'SQLite 데이터베이스', 'reqif.title': '요구사항 교환 형식',
41
+ 'automotive.search': ' 검색…', 'automotive.copyJson': 'JSON 복사',
42
+ 'automotive.rawPreview': '원문 미리보기', 'automotive.noData': '표시할 데이터가 없습니다.',
47
43
  'automotive.rowsShown': '전체 {total}행 중 {shown}행 표시',
48
- 'mat.title': 'MATLAB MAT 파일',
49
- 'mat.search': '변수와 메타데이터 검색…',
50
- 'mat.copyJson': 'JSON 복사',
51
- 'mat.rawPreview': '원시 미리보기',
52
- 'mat.noMatches': '검색 조건과 일치하는 행이 없습니다.',
53
- 'mat.rowsShown': '전체 {total}{shown}행 표시',
54
- 'hwp.title': '한글 문서',
55
- 'hwp.zoomIn': '확대',
56
- 'hwp.zoomOut': '축소',
57
- 'hwp.reset': '초기화',
58
- 'hwp.pages': '{count}페이지',
59
- 'hwp.pageLabel': '{page}페이지',
60
- 'hwp.empty': '표시할 페이지가 없습니다.',
61
- 'hwp.loadMorePages': '다음 페이지 불러오기',
44
+ 'mat.title': 'MATLAB MAT 파일', 'mat.search': '변수와 메타데이터 검색…',
45
+ 'mat.copyJson': 'JSON 복사', 'mat.rawPreview': '원시 미리보기',
46
+ 'mat.noMatches': '검색 조건과 일치하는 행이 없습니다.', 'mat.rowsShown': '전체 {total}행 중 {shown}행 표시',
47
+ 'hdf5.title': 'HDF5', 'hdf5.search': '표 검색…', 'hdf5.copyJson': 'JSON 복사',
48
+ 'hdf5.structure': '구조', 'hdf5.noData': '표시할 데이터가 없습니다.',
49
+ 'hdf5.matchingRows': '일치하는 행 {count}',
50
+ 'hdf5.matchingRowsLimited': '전체 {total}행 중 일치하는 {visible}행 표시',
51
+ 'proto.title': 'Protocol Buffer', 'proto.summary': '{syntax} · {package} · 메시지 {messages}개 · 서비스 {services}개',
52
+ 'proto.noPackage': '패키지 없음', 'proto.search': '메시지, 필드, enum, RPC 검색', 'proto.copyPanel': '패널 복사',
53
+ 'proto.panel.tree': '메시지 트리', 'proto.panel.types': '타입', 'proto.panel.relationships': '관계',
54
+ 'proto.panel.reverse': '사용처', 'proto.panel.json': 'JSON 예시', 'proto.panel.breaking': '호환성 변경',
55
+ 'proto.panel.imports': 'Import', 'proto.panel.grpc': 'gRPC', 'proto.panel.docs': '문서',
56
+ 'proto.kind.message': 'message', 'proto.kind.enum': 'enum', 'proto.kind.service': 'service', 'proto.kind.field': 'field',
57
+ 'proto.kind.repeated': 'repeated', 'proto.kind.oneof': 'oneof', 'proto.kind.value': 'value', 'proto.kind.rpc': 'rpc',
58
+ 'proto.kind.stream': 'stream', 'proto.kind.import': 'import',
59
+ 'proto.reverseRow': '{from}이(가) {name}을(를) 통해 {to}을(를) 사용합니다', 'proto.noReferences': '{name}에 대한 참조를 찾을 수 없습니다.',
60
+ 'proto.noMessages': '메시지를 찾을 수 없습니다.', 'proto.noDocumentation': '문서 주석이 없습니다.',
61
+ 'proto.noDeclarations': '선언을 찾을 수 없습니다.', 'proto.breaking.placeholder': '이전 .proto 내용을 여기에 붙여넣으세요',
62
+ 'proto.breaking.compare': '비교', 'proto.breaking.breaking': '호환성 파괴',
63
+ 'proto.breaking.none': '구조 비교에서 호환성을 파괴하는 변경이 발견되지 않았습니다.',
64
+ 'proto.breaking.messageRemoved': '메시지 삭제됨: {name}.',
65
+ 'proto.breaking.fieldRemoved': '필드 삭제됨: {message}.{field} (번호 {number}).',
66
+ 'proto.breaking.fieldChanged': '{message}에서 필드 번호 {number}의 이름 또는 타입이 변경되었습니다.',
67
+ 'parquet.title': 'Parquet', 'parquet.search': '행 검색…', 'parquet.raw': '원시', 'parquet.table': '표', 'parquet.copyJson': 'JSON 복사', 'parquet.exportJson': 'JSON 내보내기', 'parquet.loadMore': '다음 {count}행 불러오기', 'parquet.loading': '불러오는 중…', 'parquet.loadFailed': '행을 더 불러올 수 없습니다: {message}', 'parquet.rows': '행', 'parquet.columns': '열', 'parquet.limited': '대용량 파일 미리보기: 전체 {total}행 중 {loaded}행 로드됨.', 'parquet.copyCell': '셀 값 복사', 'parquet.copyRow': '행을 JSON으로 복사', 'parquet.copyColumn': '열 값 복사', 'parquet.autoFit': '열 자동 맞춤', 'parquet.resize': '드래그하여 크기 조절 · 더블클릭하여 자동 맞춤', 'parquet.copyTable': '표 복사', 'parquet.copied': '클립보드에 복사됨',
68
+ 'word.title': 'Word 문서', 'word.zoomIn': '확대', 'word.zoomOut': '축소',
69
+ 'word.reset': '초기화', 'word.print': '인쇄', 'word.printUnavailable': '이 플랫폼에서는 인쇄를 사용할 수 없습니다.',
70
+ 'word.empty': '이 문서에는 읽을 수 있는 텍스트가 없습니다.',
71
+ 'diag.word.invalid-format': '이 파일을 Word 문서로 읽을 수 없습니다.',
72
+ 'diag.word.missing-dependency': '이 플랫폼에 DOCX 렌더러가 설치되어 있지 않습니다.',
73
+ 'diag.word.limit-exceeded': '이 Word 문서는 50MB 한도를 초과합니다.',
74
+ 'diag.word.decompression-limit': '이 Word 문서는 안전하게 열 수 있는 것보다 많은 압축 해제 데이터를 선언합니다.',
75
+ 'diag.word.legacy-partial': '일부 구형 Word 서식은 표시할 수 없습니다.',
76
+ 'diag.word.embedded-partial': '일부 포함된 Word 객체는 표시할 수 없습니다.', 'word.image': '포함된 이미지',
77
+ 'hwp.title': '한글 문서', 'hwp.zoomIn': '확대', 'hwp.zoomOut': '축소',
78
+ 'hwp.reset': '초기화', 'hwp.pages': '{count}페이지', 'hwp.pageLabel': '{page}페이지',
79
+ 'hwp.empty': '표시할 페이지가 없습니다.', 'hwp.loadMorePages': '다음 페이지 불러오기',
62
80
  'hwp.loading': 'rhwp로 HWP/HWPX 파일을 불러오는 중…',
63
81
  'diag.hwp.missing-dependency': '이 환경에 HWP 렌더러가 설치되어 있지 않습니다.',
64
82
  'diag.hwp.invalid-format': 'HWP 문서를 읽을 수 없습니다.',
65
83
  'diag.hwp.corrupted': 'HWP 문서가 손상되었거나 페이지 데이터가 올바르지 않습니다.',
66
84
  'diag.hwp.limit-exceeded': '50MB를 초과하는 HWP 문서는 열 수 없습니다.',
67
- 'diag.hwp.page-limit': '전체 {total}페이지 중 {rendered}페이지를 불러왔습니다.'
85
+ 'diag.hwp.page-limit': '전체 {total}페이지 중 {rendered}페이지를 불러왔습니다.',
86
+ 'ppt.title': 'PowerPoint', 'ppt.previous': '이전 슬라이드', 'ppt.next': '다음 슬라이드',
87
+ 'ppt.jump': '슬라이드 이동', 'ppt.mode.single': '단일 슬라이드', 'ppt.mode.continuous': '연속',
88
+ 'ppt.empty': '이 프레젠테이션에는 슬라이드가 없습니다.',
89
+ 'diag.ppt.invalid-format': '이 파일을 PowerPoint 프레젠테이션으로 읽을 수 없습니다.',
90
+ 'diag.ppt.empty': '이 프레젠테이션에는 렌더링할 수 있는 슬라이드가 없습니다.',
91
+ 'diag.ppt.pdf-missing-dependency': 'PDF 폴백에는 이 플랫폼의 PDF.js가 필요합니다.',
92
+ 'diag.ppt.limit-exceeded': '이 프레젠테이션의 일부만 불러올 수 있었습니다.',
93
+ 'markdown.title': 'Markdown', 'markdown.preview': '미리보기', 'markdown.split': '분할', 'markdown.source': '소스',
94
+ 'markdown.render': '렌더링', 'markdown.copyHtml': 'HTML 복사', 'markdown.copySource': '소스 복사',
95
+ 'markdown.undo': '실행 취소', 'markdown.redo': '다시 실행', 'markdown.ready': '준비됨',
96
+ 'markdown.rendering': '렌더링 중', 'markdown.rendered': '렌더링됨', 'markdown.renderFailed': '렌더링 실패',
97
+ 'markdown.invalid': '유효하지 않음', 'markdown.modified': '수정됨', 'markdown.editable': '편집 가능',
98
+ 'markdown.edited': '편집됨', 'markdown.htmlCopied': 'HTML 복사됨', 'markdown.sourceCopied': '소스 복사됨',
99
+ 'markdown.summary': '{lines}줄, {words}단어', 'markdown.renderedDiagrams': '렌더링됨 · 다이어그램 {count}개',
100
+ 'markdown.diagramFailed': '다이어그램을 렌더링할 수 없습니다.', 'markdown.toc': '목차',
101
+ 'markdown.copyCode': '코드 복사', 'markdown.assetUnavailable': '이미지를 사용할 수 없음',
102
+ 'diag.markdown.limit-exceeded': 'Markdown 문서가 지원 한도를 초과합니다.',
103
+ 'archive.title': '압축 파일', 'archive.search': '항목 검색', 'archive.entries': '항목 {count}개',
104
+ 'archive.previewUnavailable': '미리보기를 사용할 수 없음', 'archive.mediaUnsupported': '미디어 미리보기는 지원되지 않습니다.',
105
+ 'archive.encrypted': '이 압축 파일은 암호화되어 있습니다.', 'diag.archive.invalid-format': '이 파일을 압축 파일로 읽을 수 없습니다.',
106
+ 'diag.archive.limit-exceeded': '압축 파일이 지원 한도를 초과합니다.',
107
+ 'archive.preview': '압축 파일 미리보기', 'archive.summary': '읽기 전용 미리보기 모드로 압축 파일 구조를 탐색합니다.',
108
+ 'archive.filter': '필터', 'archive.path': '경로', 'archive.type': '종류',
109
+ 'archive.compressedSize': '압축 크기', 'archive.originalSize': '원본 크기', 'archive.modified': '수정 날짜',
110
+ 'archive.files': '파일', 'archive.directories': '디렉터리', 'archive.visible': '표시됨',
111
+ 'archive.file': '파일', 'archive.directory': '디렉터리', 'archive.noMatches': '일치하는 항목이 없습니다.',
112
+ 'archive.entryPreview': '항목 미리보기', 'archive.chooseFile': '파일 선택', 'archive.idle': '대기 중',
113
+ 'archive.selectHint': '압축 파일 항목을 선택하면 여기에서 내용을 확인할 수 있습니다.', 'archive.noSelection': '선택된 파일이 없습니다.',
114
+ 'archive.loading': '불러오는 중', 'archive.loadingHint': '빠른 미리보기를 위해 압축 파일에서 파일 내용을 가져오는 중입니다.',
115
+ 'archive.loadingContent': '미리보기 불러오는 중…', 'archive.ready': '준비됨',
116
+ 'archive.textReady': '선택한 압축 파일 항목을 일반 텍스트로 표시합니다.',
117
+ 'archive.binaryReady': '선택한 압축 파일 항목을 16진수 미리보기로 표시합니다.',
118
+ 'archive.androidBinaryXmlReady': 'Android 바이너리 XML에서 디코딩했습니다.',
119
+ 'archive.audioReady': '선택한 오디오 항목을 재생합니다.',
120
+ 'archive.imageReady': '선택한 이미지 항목을 표시합니다.',
121
+ 'archive.videoReady': '선택한 비디오 항목을 재생합니다.',
122
+ 'archive.directoryHint': '디렉터리 항목에는 인라인 파일 내용이 없습니다.',
123
+ 'archive.directoryContent': '이 항목은 파일 내용이 아니라 하위 항목을 포함합니다.',
124
+ 'archive.saveEntry': '항목 저장', 'archive.savingEntry': '항목 저장 중…',
125
+ 'archive.saveFailed': '선택한 항목을 저장할 수 없습니다.',
126
+ 'diag.toml.invalid-table': '잘못된 TOML 테이블 선언입니다.',
127
+ 'diag.toml.invalid-assignment': 'TOML 키/값 할당이 필요합니다.',
128
+ 'diag.toml.invalid-key': '잘못된 TOML 키입니다.',
129
+ 'diag.toml.invalid-inline-table': '잘못된 TOML 인라인 테이블 항목입니다.',
130
+ 'diag.toml.duplicate-key': '중복된 TOML 키입니다.',
131
+ 'diag.toml.max-depth': 'TOML 중첩이 너무 깊습니다.',
132
+ 'diag.toml.node-limit': 'TOML 노드 한도에 도달했습니다.',
133
+ 'diag.toml.table-limit': 'TOML 테이블 한도에 도달했습니다.',
134
+ 'diag.toml.array-limit': 'TOML 배열 한도에 도달했습니다.',
135
+ 'diag.toml.duplicate-table': '중복된 TOML 테이블입니다.',
136
+ 'diag.toml.unclosed-value': 'TOML 값이 닫히지 않았습니다.',
137
+ 'diag.jsonl.invalid-line': '{line}번째 줄이 유효한 JSON이 아닙니다.',
138
+ 'diag.jsonl.line-limit': '{line}번째 줄이 JSONL 줄 한도를 초과합니다.',
139
+ 'diag.yaml.missing-dependency': '이 플랫폼에 YAML 파서가 설치되어 있지 않습니다.',
140
+ 'diag.yaml.invalid': '이 파일을 YAML로 파싱할 수 없습니다.',
141
+ 'diag.yaml.document-limit': '처음 {count}개의 YAML 문서만 파싱되었습니다.',
142
+ 'diag.yaml.node-limit': 'YAML 노드 한도에 도달했습니다.',
143
+ 'diag.yaml.depth-limit': 'YAML 중첩 깊이 한도에 도달했습니다.',
144
+ 'diag.yaml.alias-limit': 'YAML 별칭 한도에 도달했습니다.',
145
+ 'structured.tree': '트리', 'structured.flat': '평면', 'structured.json': 'JSON', 'structured.raw': '원시', 'structured.expandAll': '모두 펼치기',
146
+ 'structured.collapseAll': '모두 접기', 'structured.expand': '펼치기', 'structured.collapse': '접기',
147
+ 'structured.search': '검색', 'structured.copy': '복사', 'structured.copyPath': '경로',
148
+ 'structured.copyValue': '값', 'structured.copyJson': 'JSON',
149
+ 'structured.source': '소스', 'structured.sourceDescription': '편집 가능한 원본 텍스트',
150
+ 'structured.treeDescription': '구조화된 미리보기',
151
+ 'toml.treeView': 'TOML', 'yaml.treeView': 'YAML', 'jsonl.title': 'JSON Lines',
152
+ 'jsonl.loadMore': '더 불러오기', 'jsonl.loadAll': '모두 불러오기', 'jsonl.save': '저장',
153
+ 'jsonl.editUnavailable': '편집하려면 전체 파일이 필요합니다.', 'diag.jsonl.load-failed': 'JSON Lines 데이터를 더 불러올 수 없습니다.',
154
+ 'jsonl.add': '줄 추가', 'jsonl.delete': '선택 삭제', 'jsonl.edit': '편집', 'jsonl.apply': '적용',
155
+ 'jsonl.cancel': '취소', 'jsonl.preview': '검색과 선택은 불러온 미리보기에만 적용됩니다.',
156
+ 'jsonl.showMore': '5,000줄 더 보기', 'jsonl.invalidSave': '저장하기 전에 잘못 편집된 줄을 수정하세요.',
157
+ 'jsonl.rowValid': '{line}번째 줄, 유효한 JSON', 'jsonl.rowInvalid': '{line}번째 줄, 유효하지 않은 JSON',
158
+ // 공통 진단
159
+ 'diag.limit-exceeded.rows': '처음 {count}행만 파싱되었습니다(행 한도 도달).',
160
+ 'diag.limit-exceeded.input': '파일이 지원하는 최대 크기({maxBytes}바이트)를 초과합니다.',
161
+ 'diag.limit-exceeded.decompressed': '압축 파일이 지원 한도({maxBytes}바이트)보다 많은 압축 해제 데이터를 선언합니다.',
162
+ 'diag.aborted': '파싱이 취소되었습니다.',
163
+ 'diag.csv.ragged-rows': '{count}개 행의 열 개수가 달라 채우거나 잘렸습니다.',
164
+ // JSON 파서 진단 (docs/parsers/json.md)
165
+ 'diag.limit-exceeded.nodes': '처음 {count}개 노드만 파싱되었습니다(노드 한도 도달).',
166
+ 'diag.json.invalid': '이 파일을 JSON으로 파싱할 수 없습니다.',
167
+ 'diag.json.invalid-token': 'JSON에 예상치 못한 문자가 있어 여기서 파싱을 중단했습니다.',
168
+ 'diag.json.unexpected-eof': 'JSON이 예기치 않게 끝났습니다.',
169
+ 'diag.json.unterminated-string': '입력이 끝나기 전에 문자열이 닫히지 않았습니다.',
170
+ 'diag.json.duplicate-key': '중복된 키 "{key}"; 두 항목 모두 유지됩니다.',
171
+ 'diag.json.trailing-content': 'JSON 값 뒤의 추가 내용은 무시되었습니다.',
172
+ 'diag.json.max-depth': '중첩이 너무 깊어 깊이 한도에서 파싱을 중단했습니다.',
173
+ 'diag.json.invalid-escape': '문자열에 잘못된 이스케이프 시퀀스가 있습니다.',
174
+ 'diag.json.invalid-unicode-escape': '잘못된 \\u 이스케이프입니다. 16진수 네 자리가 필요합니다.',
175
+ 'diag.json.control-char': '문자열에 이스케이프되지 않은 제어 문자가 있습니다.',
176
+ // Excel 파서 진단 (docs/viewers/excel.md)
177
+ 'diag.limit-exceeded.cells': '처음 {count}개 셀만 파싱되었습니다(셀 한도 도달).',
178
+ 'diag.excel.invalid-format': '이 파일을 스프레드시트로 읽을 수 없습니다.',
179
+ 'diag.excel.password-required': '이 스프레드시트는 암호로 보호되어 있습니다.',
180
+ 'diag.excel.empty-workbook': '통합 문서에 데이터가 없습니다.',
181
+ 'diag.excel.missing-dependency': '이 플랫폼에서 스프레드시트 엔진을 불러올 수 없습니다.',
182
+ // 공통 뷰어 UI
183
+ 'common.rows': '{count}행',
184
+ 'common.columns': '{count}열',
185
+ 'common.page': '{page} / {pages} 페이지',
186
+ 'common.prevPage': '이전 페이지',
187
+ 'common.nextPage': '다음 페이지',
188
+ 'common.rowsMatched': '전체 {total}행 중 {matched}행 일치',
189
+ 'common.copied': '클립보드에 복사됨',
190
+ 'common.noClipboard': '이 플랫폼에서는 복사를 사용할 수 없습니다',
191
+ 'common.copyTooLarge': '너무 커서 클립보드에 복사할 수 없습니다({size}바이트). 대신 파일 내보내기를 사용하세요.',
192
+ 'common.noFileSave': '이 플랫폼에서는 파일 저장을 사용할 수 없습니다',
193
+ 'common.saved': '{name} 저장됨',
194
+ 'common.savedToOriginal': '저장됨',
195
+ 'common.saveFailed': '저장 실패',
196
+ 'common.unsaved': '저장되지 않은 변경 사항',
197
+ 'common.noWriteback': '원본 파일에는 저장할 수 없습니다 — 파일 내보내기를 사용하세요.',
198
+ // CSV 뷰어
199
+ 'csv.delimiter': '구분자',
200
+ 'csv.delimiter.auto': '자동 감지',
201
+ 'csv.delimiter.comma': '쉼표 (,)',
202
+ 'csv.delimiter.semicolon': '세미콜론 (;)',
203
+ 'csv.delimiter.tab': '탭',
204
+ 'csv.delimiter.pipe': '파이프 (|)',
205
+ 'csv.copyTsv': 'TSV로 복사',
206
+ 'csv.copyJson': 'JSON으로 복사',
207
+ 'csv.exportFile': '내보내기',
208
+ 'csv.exportFile.hint': '현재 검색 및 정렬 결과를 새 파일로 저장',
209
+ 'csv.editUnavailable': '편집하려면 완전히 파싱된 파일이 필요합니다',
210
+ 'csv.addRow': '행 추가',
211
+ 'csv.addColumn': '열 추가',
212
+ 'csv.insertRowBelow': '아래에 행 삽입',
213
+ 'csv.deleteRow': '행 삭제',
214
+ 'csv.insertColumnLeft': '왼쪽에 열 삽입',
215
+ 'csv.insertColumnRight': '오른쪽에 열 삽입',
216
+ 'csv.deleteColumn': '열 삭제',
217
+ 'csv.undo': '실행 취소',
218
+ 'csv.redo': '다시 실행',
219
+ 'csv.save': '저장',
220
+ 'csv.saveAs': '다른 이름으로 저장',
221
+ 'csv.statistics': '통계',
222
+ 'csv.rawView': '원시',
223
+ 'csv.tableView': '표',
224
+ 'csv.sort.hint': '클릭하여 정렬',
225
+ 'csv.header.hint': '클릭하여 정렬 · 더블클릭하여 이름 변경',
226
+ 'csv.resizeColumn': '드래그하여 크기 조절 · 더블클릭하여 초기화',
227
+ 'csv.search': '검색',
228
+ 'csv.noMatches': '불러온 범위에 일치하는 행이 없습니다.',
229
+ 'csv.rowNumbers': '행 번호',
230
+ 'csv.pageSize': '페이지당 행 수',
231
+ 'csv.stats.compact.count': 'n={count}',
232
+ 'csv.stats.compact.nulls': 'null {percent}',
233
+ 'csv.stats.compact.numeric': 'μ{mean} · {min}~{max}',
234
+ 'csv.stats.count': '개수',
235
+ 'csv.stats.nulls': 'Null',
236
+ 'csv.stats.mean': '평균',
237
+ 'csv.stats.min': '최솟값',
238
+ 'csv.stats.max': '최댓값',
239
+ 'csv.empty': '이 파일에는 행이 없습니다.',
240
+ // Excel 뷰어
241
+ 'excel.tableView': '스프레드시트',
242
+ 'excel.sheet': '시트',
243
+ 'excel.search': '시트에서 검색…',
244
+ 'excel.viewMode': '보기',
245
+ 'excel.tableViewLabel': '표',
246
+ 'excel.gridView': '그리드',
247
+ 'excel.rawView': '원시',
248
+ 'excel.gridTruncated': '큰 시트 — 처음 {count}행만 표시합니다.',
249
+ 'excel.tableViewToggle': '표 보기',
250
+ 'excel.copyTsv': 'TSV로 복사',
251
+ 'excel.copyJson': 'JSON으로 복사',
252
+ 'excel.export': 'XLSX 내보내기',
253
+ 'excel.matchedCells': '일치하는 셀 {count}개',
254
+ 'excel.sortHint': '클릭하여 정렬 · 더블클릭하여 이름 변경',
255
+ 'excel.resizeColumn': '드래그하여 크기 조절 · 더블클릭하여 초기화',
256
+ 'excel.editHint': '더블클릭하여 편집',
257
+ 'excel.editUnavailable': '편집하려면 완전히 파싱된 스프레드시트가 필요합니다.',
258
+ 'excel.undo': '실행 취소',
259
+ 'excel.redo': '다시 실행',
260
+ 'excel.insertRowBelow': '아래에 행 삽입',
261
+ 'excel.deleteRow': '행 삭제',
262
+ 'excel.empty': '이 시트에는 셀이 없습니다.',
263
+ // JSON 뷰어
264
+ 'json.treeView': 'JSON',
265
+ 'json.view.tree': '트리',
266
+ 'json.view.source': '소스',
267
+ 'json.save': '저장',
268
+ 'json.saveAs': '다른 이름으로 저장',
269
+ 'json.editor.title': '편집기',
270
+ 'json.editor.description': '소스 텍스트를 편집하고 작업을 적용합니다',
271
+ 'json.preview.title': '미리보기',
272
+ 'json.preview.description': '구문 강조된 JSON',
273
+ 'json.form.verbatim': '원본',
274
+ 'json.form.pretty': '정렬',
275
+ 'json.form.minified': '압축',
276
+ 'json.expandAll': '모두 펼치기',
277
+ 'json.collapseAll': '모두 접기',
278
+ 'json.expandNode': '펼치기',
279
+ 'json.collapseNode': '접기',
280
+ 'json.search': '검색',
281
+ 'json.matchInfo': '{current} / {total}',
282
+ 'json.noMatches': '일치 항목 없음',
283
+ 'json.prevMatch': '이전 일치',
284
+ 'json.nextMatch': '다음 일치',
285
+ 'json.copyPath': '경로',
286
+ 'json.copyValue': '값',
287
+ 'json.stats': '노드 {total}개 · 깊이 {depth}',
288
+ 'json.empty': '비어 있음',
289
+ // 도구 버튼 레이블
290
+ 'json.tool.format': '서식',
291
+ 'json.tool.minify': '압축',
292
+ 'json.tool.sort': '키 정렬',
293
+ 'json.tool.validate': '검증',
294
+ 'json.tool.escape': '이스케이프',
295
+ 'json.tool.unescape': '언이스케이프',
296
+ 'json.tool.base64Encode': 'Base64 →',
297
+ 'json.tool.base64Decode': 'Base64 ←',
298
+ 'json.tool.toCsv': '→ CSV',
299
+ 'json.tool.toXml': '→ XML',
300
+ 'json.tool.toYaml': '→ YAML',
301
+ // 도구 결과 메시지
302
+ 'json.tool.formatted': '서식 적용됨',
303
+ 'json.tool.minified': '압축됨',
304
+ 'json.tool.sorted': '키 정렬됨',
305
+ 'json.tool.escaped': '이스케이프됨',
306
+ 'json.tool.unescaped': '언이스케이프됨',
307
+ 'json.tool.base64Encoded': 'Base64 인코딩됨',
308
+ 'json.tool.base64Decoded': 'Base64 디코딩됨',
309
+ 'json.tool.valid': '유효한 JSON: {summary}',
310
+ 'json.tool.invalid': '유효하지 않은 JSON',
311
+ 'json.tool.applied': '편집기에 적용됨',
312
+ 'json.tool.failed': '작업 실패',
313
+ 'json.tool.unescapeFailed': '텍스트를 언이스케이프할 수 없습니다',
314
+ 'json.tool.base64Failed': '유효한 Base64가 아닙니다',
315
+ 'json.tool.csvRequiresObjects': 'CSV에는 객체 또는 객체 배열이 필요합니다',
316
+ 'json.tool.csvOutput': 'CSV 출력',
317
+ 'json.tool.xmlOutput': 'XML 출력',
318
+ 'json.tool.yamlOutput': 'YAML 출력',
319
+ 'json.result.copy': '복사',
320
+ 'json.result.replace': '편집기 교체',
321
+ 'json.result.close': '닫기',
322
+ // PDF 뷰어
323
+ 'pdf.title': 'PDF',
324
+ 'pdf.loading': 'PDF 불러오는 중…',
325
+ 'pdf.loadFailed': '이 PDF를 불러올 수 없습니다.',
326
+ 'pdf.pages': '페이지',
327
+ 'pdf.goToPage': '페이지 이동',
328
+ 'pdf.zoomIn': '확대',
329
+ 'pdf.zoomOut': '축소',
330
+ 'pdf.viewOptions': '보기 옵션',
331
+ 'pdf.fitWidth': '너비 맞춤',
332
+ 'pdf.fitHeight': '높이 맞춤',
333
+ 'pdf.singlePage': '한 페이지',
334
+ 'pdf.twoPagesOdd': '두 페이지(홀수 페이지 왼쪽)',
335
+ 'pdf.twoPagesEven': '두 페이지(짝수 페이지 왼쪽)',
336
+ 'pdf.matchTheme': '테마 색상 맞춤',
337
+ 'pdf.resetPages': '페이지 초기화',
338
+ 'pdf.annotationText': '텍스트 추가',
339
+ 'pdf.annotationSize': '텍스트 크기',
340
+ 'pdf.annotationColor': '텍스트 색상',
341
+ 'pdf.save': '저장',
342
+ 'pdf.saveAs': '다른 이름으로 저장',
343
+ 'pdf.merge': 'PDF 병합',
344
+ 'pdf.merging': 'PDF 병합 중…',
345
+ 'pdf.mergeComplete': 'PDF가 병합되었습니다. 저장 또는 다른 이름으로 저장하여 변경 사항을 유지하세요.',
346
+ 'pdf.mergeFailed': '이 PDF를 병합할 수 없습니다.',
347
+ 'pdf.signature': '서명',
348
+ 'pdf.signatureColor': '서명 색상',
349
+ 'pdf.signatureClear': '지우기',
350
+ 'pdf.signatureUse': '서명 사용',
351
+ 'pdf.signaturePlace': '페이지를 클릭하여 서명을 배치하세요.',
352
+ 'pdf.highlight': '형광펜',
353
+ 'pdf.highlightColor': '형광펜 색상',
354
+ 'pdf.highlightSelect': '강조할 텍스트를 선택하세요.',
355
+ 'pdf.markupOptions': '텍스트 마크업 옵션',
356
+ 'pdf.underline': '밑줄',
357
+ 'pdf.underlineColor': '밑줄 색상',
358
+ 'pdf.strikeout': '취소선',
359
+ 'pdf.strikeoutColor': '취소선 색상',
360
+ 'pdf.cancel': '취소',
361
+ 'pdf.textPlace': '페이지를 클릭하여 텍스트를 배치하세요.',
362
+ 'pdf.deletePage': '페이지 삭제',
363
+ 'pdf.deleteAnnotation': '주석 삭제',
364
+ 'pdf.password': '암호',
365
+ 'pdf.passwordRequired': '이 PDF에는 암호가 필요합니다.',
366
+ 'pdf.passwordIncorrect': '암호가 올바르지 않습니다. 다시 시도하세요.',
367
+ 'pdf.passwordSubmit': '열기',
368
+ 'pdf.editingUnavailable': '이 플랫폼에서는 PDF 편집을 사용할 수 없습니다',
369
+ 'pdf.noFilePick': '이 플랫폼에서는 병합할 파일 선택을 사용할 수 없습니다',
370
+ // 이미지 뷰어 (docs/viewers/image.md)
371
+ 'image.title': '이미지',
372
+ 'image.loading': '이미지 불러오는 중…',
373
+ 'image.loadFailed': '이 이미지를 표시할 수 없습니다.',
374
+ 'image.status': '확대 {zoom}%, 회전 {rotation}도',
375
+ // 도구 모음
376
+ 'image.zoomIn': '확대',
377
+ 'image.zoomOut': '축소',
378
+ 'image.fit': '맞춤',
379
+ 'image.rotate': '90° 회전',
380
+ 'image.flipH': '좌우 반전',
381
+ 'image.flipV': '상하 반전',
382
+ 'image.grid': '격자',
383
+ 'image.reset': '초기화',
384
+ 'image.filter': '필터',
385
+ 'image.preset.original': '원본',
386
+ 'image.preset.bright': '밝게',
387
+ 'image.preset.dark': '어둡게',
388
+ 'image.preset.vintage': '빈티지',
389
+ 'image.preset.bw': '흑백',
390
+ // 진단
391
+ 'diag.image.invalid-format': '이 파일을 이미지로 디코딩할 수 없습니다.',
392
+ 'diag.image.corrupted': '이미지 데이터가 손상되어 완전히 디코딩할 수 없습니다.',
393
+ 'diag.image.animated-first-frame': '움직이는 이미지 — 첫 프레임만 표시합니다.',
394
+ 'diag.image.svg-external-blocked': '이 SVG의 외부 참조가 보안을 위해 차단되었습니다.',
395
+ 'diag.image.limit-exceeded.pixels': '이미지가 너무 커서 축소된 미리보기를 표시합니다.',
396
+ 'diag.image.limit-exceeded.canvas': '이미지가 너무 커서 이 플랫폼에서 편집하거나 내보낼 수 없습니다.',
397
+ // 선택적 서비스 도구 (image.md I8)
398
+ 'image.tool.removeBackground': '배경 제거',
399
+ 'image.tool.removeBackground.unavailable': '이 플랫폼에서는 배경 제거를 사용할 수 없습니다',
400
+ 'image.bgRemoval.working': '배경 제거 중…',
401
+ 'image.bgRemoval.failed': '배경 제거에 실패했습니다.',
402
+ 'image.tool.detectSprites': '스프라이트 감지',
403
+ 'image.tool.detectSprites.unavailable': '이 플랫폼에서는 스프라이트 감지를 사용할 수 없습니다',
404
+ 'image.spriteDetection.working': '스프라이트 감지 중…',
405
+ 'image.spriteDetection.failed': '스프라이트 감지에 실패했습니다.',
406
+ 'image.saveAsPng': 'PNG로 저장',
407
+ 'image.saveAsPng.note': '편집된 이미지는 PNG(.png)로 저장됩니다.',
408
+ // 폴백 뷰어
409
+ 'fallback.title.text': '텍스트 미리보기',
410
+ 'fallback.title.hex': '16진수 미리보기',
411
+ 'fallback.truncated': '미리보기가 처음 {bytes}바이트로 잘렸습니다.',
412
+ 'fallback.reason.missing-dependency': '이 플랫폼에서 전체 뷰어를 불러올 수 없습니다.',
413
+ 'fallback.reason.unsupported': '이 파일 형식에 사용할 수 있는 뷰어가 없습니다.'
68
414
  };
@@ -0,0 +1 @@
1
+ export declare const CATALOG_TH: Record<string, string>;
@@ -0,0 +1,68 @@
1
+ // Thai messages owned by core. Missing keys intentionally fall back to the
2
+ // English source catalog in i18n/index.ts.
3
+ export const CATALOG_TH = {
4
+ 'audio.title': 'เสียง', 'video.title': 'วิดีโอ', 'dbc.title': 'ฐานข้อมูล CAN',
5
+ 'audio.play': 'เล่น', 'audio.pause': 'หยุดชั่วคราว', 'audio.stop': 'หยุด',
6
+ 'audio.loop': 'วนซ้ำ', 'audio.clearRegions': 'ล้างช่วงที่เลือก', 'audio.volume': 'ระดับเสียง',
7
+ 'audio.zoom': 'ซูม', 'audio.zoomIn': 'ซูมเข้า', 'audio.zoomOut': 'ซูมออก', 'audio.zoomFit': 'พอดี',
8
+ 'audio.visualization': 'มุมมอง', 'audio.vis.waveform': 'รูปคลื่น', 'audio.vis.spectrogram': 'สเปกโตรแกรม',
9
+ 'audio.info.duration': 'ความยาว', 'audio.info.sampleRate': 'อัตราสุ่มตัวอย่าง', 'audio.info.channels': 'ช่องสัญญาณ',
10
+ 'audio.info.bitDepth': 'ความลึกบิต', 'audio.info.format': 'รูปแบบ', 'audio.info.fileSize': 'ขนาดไฟล์',
11
+ 'audio.loading': 'กำลังถอดรหัสเสียง…',
12
+ 'audio.status.region': 'ช่วง {start} – {end} ({duration} วินาที)',
13
+ 'audio.status.looping': 'กำลังวนซ้ำช่วงที่เลือก', 'audio.status.loopTrack': 'กำลังวนซ้ำทั้งแทร็ก',
14
+ 'audio.fallback': 'เครื่องมือแสดงรูปคลื่นใช้งานไม่ได้ — กำลังใช้โปรแกรมเล่นพื้นฐาน',
15
+ 'audio.error.decode': 'เบราว์เซอร์ไม่สามารถถอดรหัสตัวแปลงสัญญาณเสียงนี้ได้ ลองใช้โฮสต์ที่มีตัวแปลงสัญญาณที่ต้องการหรือแปลงไฟล์',
16
+ 'video.play': 'เล่น', 'video.pause': 'หยุดชั่วคราว', 'video.stop': 'หยุด',
17
+ 'video.skipBack': '⏪ -{seconds} วินาที', 'video.skipForward': '⏩ +{seconds} วินาที',
18
+ 'video.speed': 'ความเร็ว', 'video.zoom': 'ซูม', 'video.zoomIn': 'ซูมเข้า',
19
+ 'video.zoomOut': 'ซูมออก', 'video.zoomFit': 'พอดี',
20
+ 'video.info.duration': 'ความยาว', 'video.info.resolution': 'ความละเอียด',
21
+ 'video.info.format': 'รูปแบบ', 'video.info.fileSize': 'ขนาดไฟล์',
22
+ 'video.error.empty': 'ไฟล์สื่อว่างเปล่า',
23
+ 'video.error.tooLarge': 'ไฟล์เกินขีดจำกัดการแสดงตัวอย่างของเบราว์เซอร์ ({limit})',
24
+ 'video.error.source': 'สภาพแวดล้อมนี้ไม่สามารถสร้างแหล่งสื่อของเบราว์เซอร์ได้',
25
+ 'video.error.decode': 'เบราว์เซอร์ไม่สามารถถอดรหัสตัวแปลงสัญญาณวิดีโอนี้ได้ ลองใช้โฮสต์ที่มีตัวแปลงสัญญาณที่ต้องการหรือแปลงไฟล์',
26
+ 'arxml.title': 'AUTOSAR XML', 'a2l.title': 'ASAM A2L', 'asc.title': 'บันทึก Vector ASC',
27
+ 'blf.title': 'บันทึก Vector BLF', 'mf4.title': 'ASAM MDF 4', 'pcap.title': 'การจับ PCAP',
28
+ 'pcapng.title': 'การจับ PCAPNG', 'mermaid.title': 'ไดอะแกรม Mermaid',
29
+ 'plantuml.title': 'ไดอะแกรม PlantUML', 'shapefile.title': 'ESRI Shapefile', 'psd.title': 'เอกสาร Photoshop',
30
+ 'shapefile.zoomIn': 'ซูมเข้า', 'shapefile.zoomOut': 'ซูมออก', 'shapefile.reset': 'รีเซ็ตมุมมอง',
31
+ 'shapefile.projection': 'การฉาย: {name}', 'shapefile.attributes': 'แอตทริบิวต์ของฟีเจอร์',
32
+ 'shapefile.featureLabel': 'ฟีเจอร์ {id}',
33
+ 'shapefile.noSelection': 'คลิกฟีเจอร์บนแผนที่เพื่อดูแอตทริบิวต์',
34
+ 'shapefile.noAttributes': 'ไม่มีตารางแอตทริบิวต์ (.dbf) สำหรับ shapefile นี้',
35
+ 'shapefile.noRecord': 'ฟีเจอร์นี้ไม่มีระเบียนแอตทริบิวต์ที่ตรงกัน',
36
+ 'shapefile.dbfFailed': 'ไม่สามารถอ่านตารางแอตทริบิวต์ (.dbf) ได้:',
37
+ 'shapefile.reprojectFailed': 'การฉายใหม่ล้มเหลว — แสดงพิกัดในการฉายดั้งเดิม',
38
+ 'avro.title': 'Apache Avro',
39
+ 'bag.title': 'ROS bag',
40
+ 'stp.title': 'โมเดล STEP',
41
+ 'db3.title': 'ฐานข้อมูล SQLite',
42
+ 'reqif.title': 'รูปแบบแลกเปลี่ยนข้อกำหนด',
43
+ 'automotive.search': 'ค้นหาในตาราง…',
44
+ 'automotive.copyJson': 'คัดลอก JSON',
45
+ 'automotive.rawPreview': 'ตัวอย่างข้อมูลดิบ',
46
+ 'automotive.noData': 'ไม่มีข้อมูล',
47
+ 'automotive.rowsShown': 'แสดง {shown} / {total} แถว',
48
+ 'mat.title': 'ไฟล์ MATLAB MAT',
49
+ 'mat.search': 'ค้นหาตัวแปรและข้อมูลเมตา…',
50
+ 'mat.copyJson': 'คัดลอก JSON',
51
+ 'mat.rawPreview': 'ตัวอย่างข้อมูลดิบ',
52
+ 'mat.noMatches': 'ไม่มีแถวที่ตรงกับการค้นหาปัจจุบัน',
53
+ 'mat.rowsShown': 'แสดง {shown} / {total} แถว',
54
+ 'hwp.title': 'เอกสาร HWP',
55
+ 'hwp.zoomIn': 'ซูมเข้า',
56
+ 'hwp.zoomOut': 'ซูมออก',
57
+ 'hwp.reset': 'รีเซ็ต',
58
+ 'hwp.pages': '{count} หน้า',
59
+ 'hwp.pageLabel': 'หน้า {page}',
60
+ 'hwp.empty': 'เอกสารนี้ไม่มีหน้า',
61
+ 'hwp.loadMorePages': 'โหลดหน้าถัดไป',
62
+ 'hwp.loading': 'กำลังโหลด HWP/HWPX ด้วย rhwp…',
63
+ 'diag.hwp.missing-dependency': 'ไม่ได้ติดตั้งตัวแสดงผล HWP บนแพลตฟอร์มนี้',
64
+ 'diag.hwp.invalid-format': 'ไม่สามารถอ่านไฟล์นี้เป็นเอกสาร HWP ได้',
65
+ 'diag.hwp.corrupted': 'เอกสาร HWP นี้เสียหายหรือมีข้อมูลหน้าที่ไม่ถูกต้อง',
66
+ 'diag.hwp.limit-exceeded': 'เอกสาร HWP นี้เกินขีดจำกัด 50 MB',
67
+ 'diag.hwp.page-limit': 'ตัวอย่างเอกสารขนาดใหญ่: แสดง {rendered} หน้าแรกจาก {total} หน้า'
68
+ };
@@ -0,0 +1 @@
1
+ export declare const CATALOG_ZH_CN: Record<string, string>;