티스토리 뷰



다국어 기반으로 응용 프로그램을 작성하는 경우 아래의 그림과 같이 "키=내용"으로 단순 구성된 각 언어별 파일을 만드는 방식을 많이 사용하게 됩니다.


이런 다국어 기반의 응용을 지속적으로 버전업 하다 보면 대부분 영어 번역이나 한글 번역등 중심이 되는 기본 언어 파일에는 내용을 추가하거나 변경하지만 다른 언어에 대해서는 추가 및 업데이트를 소홀하게 되는 경우가 많습니다. 특히 커뮤니티의 기여를 통해서 번역을 확장해 가는 오픈 소스 프로젝트의 경우에는 더더욱 이런 현상이 비일비재한 것이 사실입니다.

프로그램은 새로운 버전이 릴리즈 되었는데 정작 번역 파일은 따라가지 못하다보니 듬성 듬성 번역되지 않은 것 때문에 프로그램이 불완전하게 보이기도 합니다.


이런 상황을 보완하기 위해서 기본 언어와 번역 대상을 하나씩 눈으로 비교 한다는 것은 시작하기도 전에 지치는 일이고 도구를 사용하려고 생각해 보니 그 또한 마땅한 도구를 찾을 수 없네요. 비슷한 상황에서 윈머지를 사용하면 좋겠지만 번역 파일이기 때문에 추가된 항목 뿐만아니라 이미 정상 번역된 것 까지 변경되었다고 나오니 윈머지 또한 적당하지 않아서 PHP로 간단하게 프로그램을 만들어서 사용하기로 했습니다.


프로그램의 구조는 간단합니다.

  • 영어 언어 파일을 읽어서 키를 추출하면서 키 중복 여부를 검사합니다. 이때 빈라인, 주석 라인은 제외시킵니다.

  • 한글 번역 파일을 읽어서 키를 추출하면서 키 중복 여부를 검사합니다. 이때 빈라인, 주석 라인은 제외시킵니다.

  • 추출한 영어 키를 중심으로 해당하는 한글 키가 없으면 한글 번역 파일에 해당 항목을 추가합니다.

  • 영어 키에 해당하는 한글 키가 존재하지만 내용이 동일하면 번역이 필요하다는 검사 결과를 출력합니다.


가끔 번역 파일을 다룰때 간단하지만 유용하게 사용할 수 있겠습니다. 코드는 아래와 같습니다.
$line) {
        $pos = strpos($line, "=");
        if ($pos === null) continue; //empty line
        if (substr($line, 0, 1) == '#') continue; //comment line
        $key = trim(substr($line, 0, $pos));
        if (!empty($enary[$key])) {
            echo "EN: Duplicated!($i, $key)\n";
            continue;
        }
        $enary[$key] = trim(substr($line, $pos + 1));
    }
    
    //get keys of ko
    foreach ($ko_lines as $i=>$line) {
        $pos = strpos($line, "=");
        if ($pos === null) continue;    //empty line
        if (substr($line, 0, 1) == '#') continue; //comment line
        $key = trim(substr($line, 0, $pos));
        if (!empty($koary[$key])) {
            echo "KO: Duplicated!($i, $key)\n";
            continue;
        }
        $koary[$key] = trim(substr($line, $pos + 1));
    }

    //compare en-ko
    $addlines="#Added lines";
    foreach ($enary as $key=>$str) {
        if (empty($koary[$key])) {
            $addlines .= "\n$key = $str";
        } else {
            if ($str == $koary[$key]) {
                echo "KO: Need translation!($key:$str)\n";
            }
        }
    }
    
    $fp = fopen('Resources_ko.properties', 'a');
    if ($fp != null) {
        fwrite($fp, $addlines);
    }
    fclose($fp);
?>    



댓글
댓글쓰기 폼