아무래도 전공도 전공이거니와 화면과도 관련이 있어서 맡아서 다국어 번역 및 틀어진 UI 관련으로 처리를 하고 있는데, 주기적으로 한글로 업데이트 되거나 수정된 내역에 대해서 키가 추가되었는데 기록 확인이 어려운 경우가 있어서 일일이 찾다가...이젠 그거 찾는 것도 시간낭비+귀찮아져서 좀 무식하지만 commonJS를 이용해서 ko.ts, en.ts를 key 값을 비교 대조해서 해당 키들은 우선 콘솔로 확인하는 거랑, 기록 남길 겸 json 파일로도 생성하는 걸 만들었다.
compareLang.js 같은 이름이면 괜찮으려나.
const fs = require('fs');
const path = require('path');
const koPath = "ko.ts의 경로";
const enPath = "en.ts의 경로";
const diffListDir = path.join(__dirname, 'diff_list'); // 현재 경로에 diff_list 폴더 안에 몰아넣기
// 오늘 날짜 부분 처리용 toISOString 형식(YYYY-MM-DDTHH:mm:ss.sssZ)으로 함. 어차피 일주일에 한 번씩 업데이트 함..
const getToday = () => {
const today = new Date();
return today.toISOString();
};
// ts 파일이라서 export default 처리 및 const 등으로 선언 되어있으니까 객체 찾는 부분으로..
const extractObjectFromTS = (filePath) => {
const content = fs.readFileSync(filePath, 'utf8');
// 정규식은 chatGPT 활용함.
const match = content.match(/const\s+[a-zA-Z]+\s*=\s*({[\s\S]*?});/);
if (!match || !match[1]) {
throw new Error(`객체를 찾을 수 없습니다: ${filePath}`);
}
try {
return eval(`(${match[1]})`);
} catch (error) {
throw new Error(`객체 변환 실패: ${filePath}\n${error}`);
}
}
// key 대조를 위한 함수
const findDifferentKeys = (obj1, obj2) => {
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
// 중복 제외하고 전체 키 하나로 맞춰서 대조 기준 만들기
const allKeys = new Set([...keys1, ...keys2]);
const differentKeys = Array.from(allKeys).filter(key => {
const inObj1 = key in obj1;
const inObj2 = key in obj2;
return !inObj1 || !inObj2;
});
return differentKeys;
}
try {
const ko = extractObjectFromTS(koPath);
const en = extractObjectFromTS(enPath);
const differences = findDifferentKeys(ko, en);
// json으로 만들려고 우선 해당 기준 만들기는 함.
const result = differences.map(key => ({
key,
existsInKo: key in ko,
existsInEn: key in en
}));
const jsonContent = {
createdAt: new Date().toISOString(),
totalDifferences: differences.length,
details: result
};
// 추후 lang_diff_파일명을 prefix로 시작하게 하면 나중에 정규식으로 파일을 찾고 날짜를 추출하기 쉬워지게..
const jsonFileName = `lang_diff_${getToday()}.json`;
const jsonFilePath = path.join(diffListDir, jsonFileName);
fs.writeFileSync(jsonFilePath, JSON.stringify(jsonContent, null, 2), 'utf8');
console.log('한국어와 영어 파일 간 서로 다른 키들:');
console.log(differences);
console.log(`\n분석이 완료되었습니다.`);
console.log(`JSON 파일 저장 위치: ${jsonFileName}`);
} catch (error) {
console.error('에러 발생:', error.message);
}
우선 좀 더 자동화 하고 싶기는 한데(git을 이용해서 ko 의 수정 기록을 저장한다던지..) 현재로서는 이렇게 하기로.
+ 실행 이후 추가
mac에서는 -> lang_diff_2024-12-04T02/06/10.163Z.json 이런 식으로 자동으로 바뀌네... 신기..
Mac OS에서 :가 /로 변환되는 게 원래 있나봄..
그러면 각 파일명에 따라 정규식 패턴이..
정규식 패턴 대충 Window랑 Mac이랑 둘 다 해서.. 혹시 모르니까 목록 추출해봐야지.. 해서 추가.
const fs = require('fs');
const path = require('path');
// 정규표현식 패턴 정의
const patternWin = /lang_diff_(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)\.json/;
const patternMac = /lang_diff_(\d{4}-\d{2}-\d{2}T\d{2}\/\d{2}\/\d{2}\.\d{3}Z)\.json/;
const extractDateFromFileNames = (directoryPath) => {
try {
// 디렉토리 내의 모든 파일 읽기
const files = fs.readdirSync(directoryPath);
// lang_diff로 시작하고 .json으로 끝나는 파일만 필터링
const diffFiles = files.filter(file =>
file.startsWith('lang_diff_') && file.endsWith('.json')
);
// 각 파일에 대해 날짜 추출 및 형식 판별
diffFiles.forEach(file => {
const matchWin = file.match(patternWin);
const matchMac = file.match(patternMac);
if (matchWin) {
console.log('Windows 형식 날짜:', matchWin[1]);
} else if (matchMac) {
console.log('Mac 형식 날짜:', matchMac[1]);
}
});
return diffFiles;
} catch (error) {
console.error('파일 읽기 오류:', error.message);
return [];
}
};
// diff_list 폴더 경로 설정
const directoryPath = path.join(__dirname, 'diff_list');
// diff_list 폴더가 없는 경우 생성
if (!fs.existsSync(directoryPath)) {
fs.mkdirSync(directoryPath);
console.log('diff_list 폴더가 생성되었습니다.');
}
const fileList = extractDateFromFileNames(directoryPath);
console.log('\n전체 파일 목록:');
fileList.forEach(file => console.log(file));
로 하긴 했는데 찾아보니까 파일 시스템의 정규화(normalization) 때문에 어차피 "macOS의 파일 시스템(HFS+/APFS)은 파일명을 저장할 때 자동으로 정규화를 수행합니다. 특히 특수문자('/', ':' 등)가 포함된 파일명의 경우, 파일 시스템 레벨에서 이를 다르게 표현할 수 있습니다. 이는 macOS의 파일 시스템 특성이며, 실제 파일 내용이나 동작에는 영향을 미치지 않습니다. 파일 시스템 레벨의 정규화는 파일 호환성과 안정성을 위한 macOS의 기본 동작입니다." 라고 함(chatGPT)
그리고,
1. Node.js의 fs.readdirSync()가 파일 시스템으로부터 파일명을 읽을 때
2. macOS의 파일 시스템이 정규화된 형태(콜론 ':' 사용)로 반환하기 때문에
3. 실제 프로그램에서는 Windows 형식처럼 보이는 것인 셈..
또 새롭게 배웠다.
'기술이야기' 카테고리의 다른 글
[다국어 처리]다국어 처리를 위한 루틴화 - 2 (0) | 2024.12.30 |
---|