다국어 번역 함수 구현 방법

다국어 웹사이트를 구축할 때, 언어에 따라 텍스트를 자동으로 변환하는 기능은 필수적이다.
이 글에서는 PHP로 간결하고 확장 가능한 다국어 번역 함수를 구현하는 방법을 소개한다.


기본 구조

아래는 예시로 작성된 번역 함수이다.

function __($str)
{
    global $meta;

    $translations = [
        '전체 카테고리' => [
            'en' => 'All Categories',
            'ja' => '全体カテゴリー',
            'zh' => '所有类别',
        ],
        '홈' => [
            'en' => 'Home',
            'ja' => 'ホーム',
            'zh' => '首页',
        ],
    ];

    $lang = $meta['lang'] ?? 'ko';

    if ($lang === 'ko') return $str;

    return $translations[$str][$lang] ?? $str;
}

이 함수는 $meta['lang'] 값에 따라 주어진 문자열 $str을 해당 언어로 변환한다.
기본 언어는 한글이며, 다른 언어로 변환이 지정되어 있지 않은 경우에는 원문을 그대로 반환한다.


$translations 배열

이 배열은 한글을 기준으로 한 번역 테이블이다.
각 한글 키에 대해 'en', 'ja', 'zh' 등 언어 코드를 지정하고 해당 번역 문자열을 매핑한다.

예를 들어 '전체 카테고리'라는 한글 문구가 있을 때, 영어에서는 "All Categories",
일본어에서는 "全体カテゴリー", 중국어에서는 "所有类别"로 변환된다.

언어를 추가할 때는 이 배열에 새로운 언어 코드와 번역을 추가하기만 하면 된다.


$meta['lang'] 설정

글로벌 변수 $meta에서 현재 페이지의 언어 설정을 가져온다.
만약 설정이 존재하지 않는다면 'ko'를 기본값으로 사용한다.

이 값은 보통 페이지 상단의 설정 파일에서 지정되며,
사용자의 선택 언어나 사이트 환경설정에 따라 동적으로 변경된다.


한국어 처리 분기

if ($lang === 'ko') return $str;

현재 언어가 한국어일 경우, 별도의 번역이 필요하지 않으므로 원문을 그대로 반환한다.
이 조건문은 빠른 종료(early return) 구조로 작성되어 불필요한 연산을 줄인다.


번역 반환 로직

return $translations[$str][$lang] ?? $str;

?? 연산자는 PHP의 null 병합 연산자이다.
해당 번역이 존재하면 그 값을 반환하고, 존재하지 않으면 $str을 그대로 반환한다.

이 구조는 키가 존재하지 않을 때 발생할 수 있는 오류를 예방하며,
불필요한 조건문을 줄여 코드 가독성을 높인다.


언어 확장 방법

언어를 추가하려면 $translations 배열에 새로운 언어 코드를 추가한다.
예를 들어 프랑스어를 지원하려면 다음과 같이 작성한다.

'홈' => [
    'en' => 'Home',
    'ja' => 'ホーム',
    'zh' => '首页',
    'fr' => 'Accueil',
],

이 방식은 다국어 확장이 용이하며, 유지보수 시에도 구조를 한눈에 파악할 수 있다.


마무리

이 함수는 구조가 단순하고 동작이 명확하다.
한글을 기준으로 각 언어의 번역을 관리하기 때문에 별도의 데이터베이스나 파일 구조가 필요하지 않다.

사이트 내에서 반복적으로 사용되는 단어를 일관된 형태로 처리하기에 적합하며,
규모가 커질 경우 $translations를 별도의 파일로 분리하거나 캐시 시스템과 연동하여 효율적으로 관리할 수 있다.

댓글

알짜게시판

리눅스 Apache에서 GPTBot·Amazonbot·AhrefsBot의 게시판 이미…
기타 Midjourney, DALL·E, ChatGPT에서 Y2K 파스텔 UI 프롬프…
리눅스 Cloudflare R2 자동 업로드 구성하기. 특정 폴더에 파일…
워드프레스 워드프레스 7.0 관리자 링크 색상 변경 후 이전 색상으…
워드프레스 캐시 환경에서 AJAX 댓글(코멘트) 분리로 서버 응답시간…
리눅스 아파치 일반 계정 파일 접근 권한 설정과 mod-ruid2 적…
델파이 Delphi IDE 메인 폼 안열림 dproj 설정으로 해결
개발팁 VSCode 한국어 설정법, Configure Display Language로 U…
기타 RustDesk 자체 서버 구축으로 공용 서버 로그인 문제 해…
리눅스 Dante SOCKS5 프록시 서버 구축 및 설정
윈도우 윈도우 실행파일(exe) 서비스 등록 자동화 쉽게 하는 방…
기타 CLIProxyAPI Windows 설치 가이드
워드프레스 그누보드7 데이터를 WordPress WXR로 변환하기
기타 Ollama 설치 경로 C드라이브 고정 문제 해결 및 드라이…
개발팁 Apache Access Log 기반 도메인별 방문자 카운터 구현
윈도우 ZImage AI 이미지 생성 환경 구축 방법
윈도우 파일 복사 후 실행 배치파일 - 에러 감지 포함
개발팁 네이버 검색 Open API
개발팁 네이버 검색광고 키워드 도구 API 검색
개발팁 MariaDB column_stats 테이블 오류 해결 방법
개발팁 PHP-FPM 에러 로그 실시간 모니터링
윈도우 윈도우11 업데이트 후 네트워크 드라이브 접근 불가 문…
열람 개발팁 다국어 번역 함수 구현 방법
워드프레스 "치명적인 오류가 발생했습니다" 디버깅 가이드
리눅스 Apache 웹 로그 분석하기 – awk와 GoAccess 활용
윈도우 윈도11 강제업데이트 피하고 윈도10 계속 쓰기
리눅스 PHP 파일 업로드 용량 늘리기
개발팁 애드센스 충돌 문제 해결하기
파이썬 Python Playwright로 Edge 브라우저 제어하기
델파이 TDirectory.Delete 대신 CMD 으로 폴더 삭제