hdTrans는 하나의 정적 라이브러리(hdTransCore)와 그 위의 얇은 프런트엔드로 되어 있습니다.
| 프런트엔드 | 소스 | 인터페이스 |
|---|---|---|
CLI hdtrans |
src/cli/ |
표준 입출력, UTF-8 |
hdTransEngine (dll/so/dylib) |
src/cshared/ |
C API, UTF-8 (include/core/hdtrans.h) |
J2KEngine.dll |
src/j2kengine/ |
이지트랜스 호환 J2K_*, Shift-JIS/CP949 또는 UTF-16 |
| WebAssembly, TypeScript | src/wasm/, web/src/translator.ts |
Embind, HdTrans 클래스 (TypeScript API) |
| C++ | include/core/engine.h |
hdTrans::Engine, hdTrans::Session |
배포 파일을 받아 압축을 푼 폴더에서 실행합니다. 입력과 출력은 UTF-8입니다.
Windows:
.\hdtrans.exe --in script.ja.txt --out script.ko.txt
.\hdtrans.exe --each --in lines.ja.txt --out lines.ko.txtLinux, macOS:
./hdtrans --in script.ja.txt --out script.ko.txt
./hdtrans --each --in lines.ja.txt --out lines.ko.txt기본 사전 스냅샷을 자동으로 읽으므로 --dicts는 필요 없습니다.
모든 운영체제에서 실행 파일 옆 hdtrans-data/dicts.hdsnap을 씁니다.
기본은 파일 전체가 한 문서이며 --each는 줄마다 따로 번역합니다. 게임 대사처럼 줄마다 따로 들어오는 글은 --each가
연결 도구의 결과와 같습니다. 두 방식의 차이는 README에 있습니다.
Node.js 22 이상에서 전역 설치하거나 npx로 실행합니다. 패키지의 WASM 엔진과 기본 사전을 씁니다.
npm install -g hdtrans
hdtrans "今日は本を読みます。"
npx hdtrans "今日は本を読みます。"hdtrans --version
hdtrans --json "競走で勝った。"
hdtrans --in input.txt --out output.txt
hdtrans --json --file input.txt --out result.json
hdtrans --why --userdict userdict.txt "蒼月は学生です。"지원 옵션은 --in(--file), --out, --json, --why, --userdict, --ehnd, --wrapped, --context, --version, --help입니다.
입력은 UTF-8 파일, 문장 인자나 표준 입력입니다. --json은 { text, choices, logs } 객체를 출력하고,
--out과 함께 쓰면 JSON을 파일에 저장합니다. 로그와 오류는 표준 오류로 보냅니다.
--in과 직접 문장을 함께 지정할 수 없으며 -- 뒤의 인자는 옵션으로 해석하지 않습니다.
npm CLI의 --userdict는 파일 하나를 받으며 중복 지정은 오류입니다.
--ehnd DIR로 Ehnd 파일 묶음을 명시적으로 적용합니다. 현재 폴더의 사전이나 설정 파일은 자동으로 읽지 않습니다.
사전 컴파일, --each 등 아래 네이티브 전용 옵션은 npm CLI에서 지원하지 않습니다.
--version은 양쪽 CLI에서 사전을 실제로 로드한 뒤 hdTrans v<엔진> (<실행 방식>) / dict <사전>을 출력합니다.
실행 방식은 배포판이 native, npm판이 wasm입니다.
버전 정보가 없는 직접 편집한 사전은 development (unversioned)로 표시합니다.
표준 입력(또는 --in FILE)의 UTF-8을 읽어 번역을 표준 출력에 씁니다. 기본으로 입력 전체가 한 세션,
한 문서이며, 출력 줄은 \n으로 잇고 끝에 줄바꿈을 붙이지 않습니다. --each와 --raw는 줄마다 번역하고
각 줄 뒤에 \n을 붙입니다.
hdtrans [--json] [--version] [--verbose] [--config FILE] [--dicts PATH,...] [--userdict PATH]... [--ehnd DIR] [--each | --raw] [--reference] [--verify-dicts] [--compile-dicts | --compile-snapshot FILE | --no-cache] [--why] [--select-shadow] [--misread] [--no-cg] [--cg-learned] [--speech LEVEL] [--wrapped] [--context FILE] [--stages DIR] [--rule-counts FILE] [--in FILE | --file FILE] [--out FILE] [--] [text]
| 옵션 | 설명 |
|---|---|
--config FILE |
기본 user/hdtrans.config.yaml 대신 읽을 설정 파일 |
--dicts PATH[,PATH...] |
사전 폴더 목록 또는 컴파일한 사전 .hdsnap 파일. 스냅샷 하나면 원본 폴더 없이 읽음. 기본값은 hdtrans-data/dicts.hdsnap |
--userdict PATH |
사용자 사전 파일이나 폴더. 여러 번 지정 가능. 기본값은 데이터 루트 user/의 userdict*.txt, userdict*.tsv. 빈 값이면 끔. 잘못된 줄 처리 |
--in FILE, --file FILE |
표준 입력 대신 UTF-8 파일을 읽음 |
--out FILE |
결과를 UTF-8 파일로 저장. 생략하면 표준 출력. --json과 함께 쓰면 JSON 저장 |
--json |
{ text, choices, logs } 객체를 JSON으로 출력. WASM과 같은 선택 기록과 필터 로그 |
--version, -v |
선택한 사전을 로드하고 엔진 버전, native/WASM 구분, 사전 버전을 한 줄로 출력 |
--verbose |
읽은 사전 파일 정보와 Ehnd 활성화 상태를 표준 오류에 씀. 번역 출력은 바꾸지 않으며 --version과 함께 쓰면 읽기 정보는 출력하지 않음. 긴 옵션만 지원 |
--help |
프로그램과 작성자 정보, 사용법 출력 |
--ehnd DIR |
Ehnd 폴더 DIR의 필터, SkipLayer, 사용자 사전을 씀. 기본으로 쓰지 않으며 설정 파일로도 켤 수 있음. 건너뛴 줄은 표준 오류에 씀 (ehnd-compat.md) |
--each |
줄마다 따로 번역. 앞 줄이 다음 줄 결과를 바꾸지 않음 |
--raw |
줄마다 단어 파이프라인만으로 번역 |
--wrapped |
입력이 문장 중간에서 잘려 있음 (자막, 후킹 텍스트). 줄 수는 유지됨. 빈 줄은 늘 문장 경계. 줄 끝 화살표(➡, →, →, ⇒)는 다음 줄로 이어지며 번역 끝에 한 칸 띄어 남음, 규칙은 spec/layout.md의 LAY-14. --each, --raw와 함께 쓸 수 없고, 설정 파일의 wrapped는 그 둘에서 쓰지 않음 |
--context FILE |
FILE의 UTF-8 줄을 입력 앞에 오는 같은 문서로 읽음. 이름, 「」 대사, 가족 호칭, 뜻 같은 단서로만 번역하고 출력하지 않음. --wrapped이면 입력이 이어 가는 문장의 앞부분. 끝의 줄바꿈 하나는 줄로 세지 않음. --each, --raw와 함께 쓸 수 없음 |
--reference |
번역 개선 규칙을 끈 기준 모드 |
--verify-dicts |
원본 해시와 모든 캐시 세그먼트를 검사하고 읽은 사전 정보를 표준 오류에 씀. 펼 수 없는 표지(품사 코드의 부류와 어긋나거나 표에 없는 계열)를 쓴 사전 줄(rule-language.md)이나 기본, 어휘 계층의 명사 줄 중 번역이 하기로 끝나는 한 낱말(출항하기, dictionary-files.md), 번역에 가나나 한자가 있는 사전 줄이 있으면 나열하고 실패 |
--compile-dicts |
사전 캐시를 컴파일, 검사하고 종료. 캐시 경로 또는 up to date를 출력 |
--compile-snapshot FILE |
기본 사전 전체를 FILE(.hdsnap)에 컴파일하고 종료. FILE을 출력. 펼 수 없는 표지를 쓴 줄이 있으면 나열하고 실패 |
--no-cache |
사전 캐시를 끔 (--compile-dicts, --compile-snapshot과 함께 쓸 수 없음). .hdsnap은 그대로 읽음 |
--why |
단어와 어미 선택, shadow 점수, 처리 단계와 Ehnd 필터 실행 로그를 표준 오류에 씀 |
--select-shadow |
번역은 바꾸지 않고 가장 짧은 대상(shortest-target)으로 점수를 매김. --why에 나타남 |
--misread |
오독 필터(misreadFilter)를 켬: 모델이 오독으로 점수를 매긴 선택 후보를 대안으로 바꿈 (misread-classifier.md) |
--no-cg |
CG-lite 손 규칙(cgRules, 기본 켬)을 끔: 오독 결정의 후보를 지우거나 고르는 규칙표 |
--cg-learned |
학습 규칙(cgLearned, 기본 끔)도 켬 |
--speech LEVEL |
대사의 말투. strict(기본): 번역의 -다를 그대로 두되, 일본어가 반말 표지(문장 끝 よ, ね, わ, じゃん, さ, もん, って, かな, かしら, 축약 ちゃう, てる, とく, ねえ)를 가진 「」 대사는 상태와 과거, 판단(다르다 → 달라, 했다 → 했어, 학생이다 → 학생이야)과 것, 무엇(것은 → 건, 무엇을 → 뭘)만 해체로 씀. !, ?, 문장 끝 말줄임 앞의 서술어는 「」 밖에서도 해체(暑い! → 더워!). soft: 「」 안(앞 줄에서 열린 「」 포함)의 -다를 해체로 씀(간다 → 갈 거야, 다르다 → 달라, 학생이다 → 학생이야). 「」를 쓰지 않는 글의 줄도 대사로 보이면 해체로 씀: 반말 문장 끝 조사가 있거나, 。, !, ?, 말줄임, 쉼표, 줄표로 끝나지 않는 줄(それは違う → 그건 달라). 。로 끝나고 조사가 없는 줄, 전각 공백으로 들여쓴 줄, 이름:설명 같은 줄은 -다로 두고, 끝으로만 대사로 본 줄의 동작 현재형도 그대로 둠(もう帰る → 이제 돌아간다). 두 값 모두 평서형 의문문은 해체로 묻고(大丈夫か? → 괜찮아?, 行っただろう? → 갔지?), 공손체(です, ます)와 고풍 말투(ておる, じゃ), 『』 안, 인용한 말(「…」という)은 그대로 둠. --reference에서는 strict |
--stages DIR |
단계 기록을 DIR에 씀 (testing.md) |
--rule-counts FILE |
선택 규칙과 구문 표의 행마다 실행 횟수와 참이 된 횟수를 FILE에 TSV로 씀: kind(L, G, cx), index(전역 규칙은 PRIO, 구문 표는 행 id), pumsa, number, ugan, runs, fires (rule-language.md) |
기존 -in, -why 같은 단일 하이픈 옵션도 받습니다. 직접 문장을 인자로 넘길 수 있고, -- 뒤는 옵션으로 해석하지 않습니다.
--in과 직접 문장을 함께 지정하면 오류입니다. npm CLI와 공통 옵션의 이름과 의미가 같으며, npm판의 실행 엔진은 WASM입니다.
종료 코드: 0 성공, 1 사전을 못 불러옴, 입력 읽기 실패, 캐시 오류, 명시한 설정 파일 없음, 2 알 수 없는 옵션(사용법 출력).
--why의 표준 오류 출력은 탭으로 구분한 줄입니다. WHY-LINE <줄>이 입력 줄마다 나오고, 단어마다
WHY <줄> <청크> <문장> <토큰>:<시작> <표면형> <선택> <출처> <id> <번역> <직접 선택> <출처> <id> <층> <규칙> <어미 층> <어미 규칙>,
그 아래에 SHADOW 줄이 붙습니다. Ehnd 필터 실행 로그도 함께 나오며, 번역문은 표준 출력에만 씁니다.
층과 규칙은 후보와 어미를 정한 실행 층과 규칙(local
L925, 전역 규칙은 파일:GPRIO)입니다(pipeline-layers.md). 탭, 줄바꿈, 백슬래시는 \t, \n, \\로 이스케이프합니다.
| 환경 변수 | 설명 |
|---|---|
HDTRANS_CACHE_DIR |
캐시 폴더 (절대 경로). 빈 값, 상대 경로(경고 출력), off(대소문자 무관)는 캐시를 끔 |
HDTRANS_SNAPSHOT=off |
캐시를 끔 |
HDTRANS_VERIFY_DICTS=1 |
--verify-dicts와 같음 |
HDTRANS_DRIVER_DUMP=DIR |
--stages DIR과 같음 |
실행 파일이나 DLL 옆 hdtrans-data/가 데이터 루트입니다. 이름은 대소문자를 가리지 않습니다.
기본 사전 dicts.hdsnap은 필수이고, user/, 설정 파일과 ehnd/는 선택입니다.
다른 사전은 --dicts, 다른 설정은 --config로 지정합니다.
데이터 루트의 user/hdtrans.config.yaml을 시작할 때 읽습니다. DLL은 hdTrans_Reload나
J2K_ReloadUserDict에서도 다시 읽습니다. 파일이 없으면 기본값을 쓰며 Ehnd는 자동으로 켜지지 않습니다.
배포본의 user/에는 견본만 있습니다. hdtrans.config.example.yaml을
같은 폴더의 hdtrans.config.yaml로 복사해 고칩니다. 상대 경로는 설정 파일의 폴더 기준이며,
CLI 플래그가 파일보다 우선합니다.
| 키 | 값과 기존 옵션 |
|---|---|
dicts |
경로 하나 또는 경로 목록, --dicts처럼 순서대로 읽음 |
userdict |
사용자 사전 파일이나 폴더 경로 또는 경로 목록. 기본 탐색을 대신하며 목록 뒤쪽이 우선 |
ehnd |
경로 또는 true(hdtrans-data/ehnd/), false나 생략은 꺼짐. --ehnd와 같은 필터와 사용자 사전을 함께 적용 |
cache |
경로 또는 off, HDTRANS_CACHE_DIR에 적용. --no-cache가 우선 |
cg |
bool, 기본 true. false는 --no-cg |
misread |
bool, 기본 false. true는 --misread |
reference |
bool, 기본 false. true는 --reference |
speech |
strict(기본) 또는 soft, --speech와 같음 |
wrapped |
bool, 기본 false. 입력이 문장 중간에서 잘려 있음 (자막, 후킹 텍스트). 줄 수는 유지됨. true는 --wrapped |
strict_dict |
bool. 잘못된 줄 처리 |
cache를 지우거나 DLL을 종료하면 적용 전 환경변수를 복원합니다. HDTRANS_SNAPSHOT=off는 그대로 유효합니다.
알 수 없는 키와 잘못된 값은 건너뛰고, 문법 오류 앞의 정상 항목은 유지합니다. 진단은 CLI의 표준 오류,
C API의 hdTrans_UserDictError, J2K의 디버거 출력으로 알립니다.
C API의 비어 있지 않은 dirs와 명시적인 hdTrans_OpenEhnd는 파일보다 우선합니다.
WebAssembly의 HdTrans 클래스는 YAML 대신 초기화 옵션과 사용자 사전, Ehnd 설정 메서드를 받습니다(TypeScript API).
창 하나에 단문 번역, 문서 번역, 사전, 로그 탭이 있습니다. 실행 파일 옆의 hdtrans-data/에서 사전, 사용자 사전,
설정을 엔진을 처음 불러올 때 읽습니다. 설정 파일 변경은 다음 사전 다시 읽기가 성공하면 함께 반영합니다.
문서 번역은 Shift-JIS, UTF-8(BOM 유무 무관), UTF-16LE(BOM)를 읽고
UTF-8 BOM으로 저장합니다. 줄바꿈은 원문의 첫 줄바꿈(CRLF, LF 또는 CR)을 따릅니다. 파일마다 문서 전체를 한 번에 번역하므로 문맥이 그 파일 안에서 이어집니다.
- 파일 여러 개를 목록에 넣어 차례로 번역합니다. 창에 끌어 놓은 파일은 문서 번역 탭의 목록 끝에 붙고, 이미 있는 파일과 폴더는 무시합니다. 미리보기는 고른 파일입니다.
- 결과 이름은
원래이름_번역.txt입니다. 원본 파일과 같은 폴더에 저장(기본)을 끄면 찾기로 고른 폴더에 씁니다. - 결과가 원문 파일을 덮어쓰게 되면 시작하지 않습니다. 결과 파일이 이미 있으면 한 번 묻고 모두 덮어쓰거나 있는 파일을 건너뜁니다.
- 중단은 지금 파일을 마친 뒤 그 결과와 남은 파일을 저장하지 않습니다. 이미 저장한 파일은 그대로 둡니다.
- 사전 탭은 GUI가 읽는 사용자 사전 파일(기본
user/userdict*.txt,userdict*.tsv)을 보여 줍니다. 항목은 한 줄씩 추가, 수정, 삭제하며 바로 파일에 저장하고 다음 번역부터 반영합니다. 주석, 빈 줄과 BOM, 줄바꿈 방식은 그대로 둡니다. 열 형식 파일은 편집하지 않습니다. - 사전을 끄면 파일 이름 끝에
.off를 붙여 CLI와 연결 도구도 읽지 않게 하고, 켜면 되돌립니다. 가져오기와 사전 탭에 끌어 놓은 파일은userdict-이름.txt로 UTF-8로 복사하고, 내보내기는 파일을 그대로 저장합니다. 목록에서 이름을 고치면 파일 이름이 바뀝니다. - 로그 탭은 사전 읽기 정보와 경고, 문서 파일 오류를 시간, 종류, 메시지로 최신 300건까지 보여 줍니다. 복사와 지우기를 쓸 수 있고 창 아래 상태를 누르면 로그로 이동합니다. 기록은 메모리에만 두며 창을 닫으면 없어집니다.
헤더: include/core/hdtrans.h. Windows에서 DLL을 쓰는 쪽은 HDTRANS_USE_DLL을 정의합니다.
- 문자열은 모두 UTF-8입니다.
- 프로세스에 엔진 하나, 세션 하나입니다. 호출마다 따로 번역하므로 앞에서 번역한 텍스트가 다음 결과를 바꾸지 않습니다.
한 호출에 여러 줄(
\n)을 넣으면 그 안에서만 앞뒤 줄을 참고합니다. - 말투는 설정 파일의
speech(strict기본,soft)로 정하며hdTrans_Reload에서 다시 읽습니다. 호출마다 바꾸는 함수는 없습니다. - 잘린 입력은 설정 파일의
wrapped로 알리며hdTrans_Reload에서 다시 읽습니다.wrapped: true: 입력이 문장 중간에서 잘려 있음 (자막, 후킹 텍스트). 줄 수는 유지됨. - 앞 호출의 줄을 참고하려면
hdTrans_TranslateContext에 그 줄을 함께 넘깁니다. - 호출은 스레드 안전하지만 재진입은 안 됩니다. 라이브러리를 내리기 전에 모든 호출을 끝내야 합니다.
- 초기화, 다시 읽기, 종료는 대기 중인 번역보다 먼저 처리됩니다.
- 데이터 루트
user/의userdict*.txt,userdict*.tsv를 사전 폴더 다음에 읽고, 추가, 변경, 삭제를 자동 반영합니다 (dictionary-files.md). 진단은hdTrans_UserDictError로 확인합니다. - Ehnd는 설정 파일의
ehnd나hdTrans_OpenEhnd로 켭니다. 켠 폴더가 바뀌면 함께 다시 읽습니다 (ehnd-compat.md). - Windows에서 프로세스 종료 시에는 엔진을 정리하지 않고 OS에 맡기며,
FreeLibrary로 내릴 때는 진행 중인 다시 읽기를 기다리지 않습니다. 깔끔하게 정리하려면hdTrans_Terminate를 부릅니다.
hdTrans_Options의 strict_dict 정책은 잘못된 줄 처리를 보세요.
| 필드 | 값 |
|---|---|
uint32_t size |
sizeof(hdTrans_Options). 없는 필드는 기본값, 뒤에 추가된 필드는 무시 |
uint32_t strict_dict |
0 설정/기본값, 1 strict, 2 skip |
| 함수 | 설명 |
|---|---|
int hdTrans_SetOptions(const hdTrans_Options* options) |
다음 사전 불러오기에 적용하며 진행 중인 불러오기는 취소하지 않음. 초기화 전에도 사용 가능. NULL 또는 size 0은 기본값으로 초기화. 0 성공, -1 잘못된 크기나 값(기존 옵션 유지) |
int hdTrans_Initialize(const char* dirs) |
사전 목록을 불러옴. dirs는 NUL로 구분하고 NUL 두 개로 끝나며 뒤 폴더가 앞을 덮어씀. .hdsnap 하나만 넘겨도 됨. NULL이나 빈 목록이면 설정의 dicts, 없으면 데이터 루트의 dicts.hdsnap을 찾음. 0 성공, -1은 불러오기 실패 또는 동시에 진행된 Terminate, Initialize, Reload가 이 불러오기를 취소함 |
void hdTrans_Terminate(void) |
세션과 사전 해제, 옵션을 기본값으로 초기화. 여러 번 불러도 되고, 다시 Initialize할 수 있음 |
int hdTrans_Translate(const char* text, size_t n, char** out, size_t* outn) |
text[0..n)(\n으로 구분한 한 줄 이상)을 프로세스 세션에서 번역. *out에 NUL로 끝나는 버퍼, *outn에 길이(NUL 제외). 0 성공, -1 초기화 전, 종료 후 |
int hdTrans_TranslateContext(const char* context, size_t cn, const char* text, size_t n, char** out, size_t* outn) |
context[0..cn)의 줄을 text 앞에 오는 같은 문서로 읽고 text의 줄만 hdTrans_Translate처럼 돌려줌. 문맥 줄은 단서와, wrapped이면 text가 이어 가는 문장의 앞부분으로만 쓰고 호출 뒤에 남기지 않음. NULL이나 cn 0은 문맥 없음. 0 성공, -1 초기화 전, 종료 후 |
int hdTrans_Reset(void) |
엔진의 지금 사전을 세션에 가져옴. 번역은 원래 호출마다 따로라서 결과는 바뀌지 않음. 0 성공, -1 초기화 전, 종료 후 |
int hdTrans_Reload(void) |
설정 파일과 사전 폴더, 사용자 사전, 켜 둔 Ehnd 폴더를 다시 불러옴. 0 성공, -1 초기화 전, 종료 후, 실패(이전 사전 유지) |
int hdTrans_UserDictError(char** out, size_t* outn) |
설정 파일 진단과 마지막 사용자 사전 읽기 오류(오류마다 한 줄, 없으면 빈 문자열)를 hdTrans_Translate처럼 버퍼로 돌려줌. 초기화에 성공해도 처음부터 없는 명시 사용자 경로의 경고가 있을 수 있음. 읽기 INFO는 포함하지 않음. 0 성공, -1 초기화 전, 종료 후 |
int hdTrans_OpenEhnd(const char* dir) |
Ehnd 폴더 dir의 필터와 사용자 사전을 이후 번역에 씀(NULL이나 빈 값은 뗌). 사용자 사전처럼 자동으로 다시 읽음. 0 성공, -1 초기화 전, 종료 후, 폴더를 못 읽음 |
int hdTrans_FilterErrors(char** out, size_t* outn) |
필터 파일과 Ehnd 폴더 진단(파일:줄: 이유, 줄마다 하나)을 버퍼로 돌려줌. 처음부터 없는 명시 Ehnd 경로의 비치명적 경고는 이 함수에만 포함하며 읽기 INFO는 포함하지 않음. 0 성공, -1 초기화 전, 종료 후 |
void hdTrans_FreeMem(void* p) |
hdTrans_Translate가 돌려준 버퍼 해제 |
const char* hdTrans_Version(void) |
라이브러리 버전 문자열 |
#include "core/hdtrans.h"
if (hdTrans_Initialize(NULL) != 0) return 1;
const char* text = "猫が好きです。";
char* out = NULL;
size_t outn = 0;
if (hdTrans_Translate(text, strlen(text), &out, &outn) == 0) {
fwrite(out, 1, outn, stdout);
hdTrans_FreeMem(out);
}
hdTrans_Terminate();C API는 사전 캐시를 읽기만 하고 새로 저장하지 않습니다(dictionary-files.md).
이지트랜스의 J2KEngine.dll과 같은 이름의 함수를 __stdcall로 내보냅니다(src/j2kengine/j2kengine.def).
Windows 전용이며, 이지트랜스를 불러오는 도구는 대부분 32비트이므로 x86 빌드를 씁니다.
- 기본 사전은 설정의
dicts, 없으면 데이터 루트의dicts.hdsnap을 찾습니다. 사용자 사전은user/의userdict*.txt,userdict*.tsv에서 따로 읽습니다. 호스트가 넘기는 사전 경로는 무시합니다. 사용자 사전의 추가, 변경, 삭제는 자동 반영됩니다(dictionary-files.md). 진단은 디버거 출력(OutputDebugString)에 씁니다. - Ehnd는 설정 파일의
ehnd로 켭니다. 켠 폴더가 바뀌면 함께 다시 읽으며 건너뛴 줄은 디버거 출력에 씁니다 (ehnd-compat.md). - 프로세스 종료 시에는 엔진을 정리하지 않고,
FreeLibrary로 내릴 때는 진행 중인 다시 읽기를 기다리지 않습니다. - Shift-JIS(932), CP949(949), UTF-16 변환은 OS 함수로 이 경계에서만 합니다. 엔진 안에는 코드 페이지 표가 없습니다.
- 반환 버퍼는 프로세스 힙에 할당하며
J2K_FreeMem으로 해제합니다. - 호출은 스레드 안전하지만 재진입은 안 됩니다.
| 함수 | 동작 |
|---|---|
J2K_Initialize(char* dicPath) |
사전을 불러옴. 1 성공(이미 초기화되어 있어도 1), 0 실패, 취소 |
J2K_InitializeEx(char* dicPath, char* mainDir) |
J2K_Initialize와 같음 |
J2K_Terminate() |
세션과 사전 해제, 1 |
J2K_TranslateMMNT(HWND, char* text) |
Shift-JIS 입력, CP949 출력 |
J2K_TranslateMMNTW(HWND, const wchar_t* text) |
UTF-16 입력, UTF-16 출력 |
J2K_TranslateMM, J2K_TranslateMMEx, J2K_TranslateChat |
J2K_TranslateMMNT와 같음 |
J2K_TranslateFM(HWND, char* fileName) |
파일 번역 없음, null |
J2K_FreeMem(void*) |
번역 결과 해제 |
J2K_ReloadUserDict() |
설정 파일과 사전, 켜 둔 Ehnd 폴더를 바로 다시 불러옴 |
J2K_StopTranslation |
아무것도 하지 않고 1 |
J2K_SetField, J2K_SetHnj2han, J2K_SetDelJPN, J2K_SetJWin, J2K_SetPriorDict, J2K_GetJ2KMainDir |
호환용, 아무것도 하지 않음 |
J2K_GetPriorDict |
null |
J2K_SetProperty, J2K_GetProperty |
0 |
?GetJ2KMainDir@@YA?AVCString@@XZ는 J2K_GetJ2KMainDir의 별칭입니다.
emcmake cmake --preset wasm으로 hdtrans_engine.js(ES6 모듈)와 hdtrans_engine.wasm을 만듭니다.
C++ 엔진은 Embind로 연결하고, TypeScript에서는 HdTrans.init(), translate(), 사용자 사전과
Ehnd 설정 메서드를 씁니다. C API 포인터나 ccall, FreeMem을 직접 다루지 않습니다.
네이티브 C API와 J2K 함수의 사용법은 바뀌지 않습니다.
초기화, 반환 타입, JSON/WHY, 실행 중 필터 교체 예제는 TypeScript API에 있습니다.
웹 데모도 같은 인터페이스를 사용하며, tools/wasm_smoke.mjs가 실제 WASM 엔진으로 검사합니다.
헤더는 include/core/engine.h입니다. Engine이 사전을 들고, Session이 그 사전으로 번역합니다.
hdTrans::Engine engine; // 사전
engine.Open({"dicts"}); // 사용자 사전은 OpenUserDicts로
hdTrans::Session session(engine); // 호출마다 독립인 번역
std::string ko = session.Translate("今日はいい天気ですね。");Engine(bool reference = false, CacheWrite cacheWrite = CacheWrite::Sync, UserReload userReload = UserReload::Off).
여러 세션과 스레드가 함께 씁니다.
| 함수 | 하는 일 |
|---|---|
Open(dirs, verifyDicts = false, userFile = {}) |
사전 폴더(뒤 폴더가 앞을 덮음)와 사용자 사전 파일 하나를 불러옴. 사전을 하나도 못 불러오면 false |
OpenUserDicts(dirs, verifyDicts, userPaths) |
사용자 사전을 파일이나 폴더 목록으로 받음. 폴더는 그 안의 userdict*.txt, userdict*.tsv. 뒤 파일이 우선 |
Reload() |
폴더, 사용자 사전, Ehnd 폴더를 다시 불러와 바꿈. 진행 중인 세션은 하던 사전으로 계속 번역 |
OpenEhnd(dir) |
Ehnd 폴더의 필터와 사용자 사전을 씀. 빈 경로는 뗌. Open 전이면 폴더 이름만 정함 |
loaded() |
사전을 불러왔는지 |
UserFileError() |
사용자 사전을 못 불러온 이유. 못 불러온 파일은 빼고 엶 |
FilterErrors() |
필터 파일과 Ehnd 폴더에서 건너뛴 줄(파일:줄: 이유) |
Dictionaries(), Filters() |
지금 쓰는 사전과 필터 |
DetachReload() |
라이브러리를 내릴 때. 엔진을 없애도 진행 중인 다시 읽기를 기다리지 않음 |
| 옵션 | 값 |
|---|---|
CacheWrite |
Sync: Open이 끝나기 전에 사전 캐시를 저장. Off: 저장하지 않음 |
UserReload |
Auto: 번역을 시작할 때 사용자 사전과 Ehnd 폴더를 1초에 한 번까지 보고, 바뀌면 백그라운드에서 다시 불러옴. Off: 하지 않음 |
엔진을 없애면 진행 중인 다시 읽기가 끝나기를 기다립니다(DetachReload 뒤에는 기다리지 않음).
Session(const Engine&, bool reference = false, bool cg = true, bool misread = false). 한 번에 한 스레드에서 씁니다.
| 함수 | 하는 일 |
|---|---|
Translate(text) |
\n으로 나눈 줄을 한 문서로 번역(\r은 유지). 앞선 호출의 영향을 받지 않음. 64 KiB가 넘는 줄은 16 KiB 이하로 나눠 번역 |
Translate(text, context) |
context(\n으로 나눈 줄)를 text 앞에 오는 같은 문서로 읽고 text의 줄만 돌려줌. 문맥 줄은 단서와, SetWrapped(true)이면 text가 이어 가는 문장의 앞부분으로만 씀. 빈 context는 Translate(text)와 같음 |
Reset() |
엔진의 지금 사전을 가져옴. 번역 결과는 바꾸지 않음 |
SetSpeech(Speech) |
다음 번역부터 대사의 말투(Strict(기본), Soft, --speech와 같음). 기준 모드에서는 효과 없음 |
SetWrapped(bool) |
다음 번역부터: 입력이 문장 중간에서 잘려 있음 (자막, 후킹 텍스트). 줄 수는 유지됨. 기본 false, --wrapped와 같음. 빈 줄은 늘 문장 경계 |
UserReload::Auto 엔진의 세션은 엔진에 새 사전이 생기면 다음 번역에서 그 사전으로 바꿉니다.
필터와 Ehnd 형식은 ehnd-compat.md에 있습니다.