PHP 에서 국제화(i18n) 라이브러리로 문장을 음차(Transliteration)하기 - slug 생성시 유용
개요
laravel framework 에서는 문장을 slug 형식으로 만들어 주는 slug helper 를 제공합니다.
use Illuminate\Support\Str; $slug = Str::slug('Laravel Framework is cool', '-'); // "laravel-framework-is-cool"
하지만 저 함수는 한글등 아시아권 문자에 대한 고려가 되어 있지 않으므로 입력이 한글일 경우 모두 날려 버립니다.
use Illuminate\Support\Str; $slug = Str::slug('한글 漢子 test', '-'); // "test"
만약 영어가 없는(한글, 한자, 일어만 있는) 입력이라면 slug 가 null 이 되는 문제가 있습니다.
이를 해결하기 위해서는 한글로 유지하는 별도의 slug 함수를 만드는 방법이 있지만 PHP 에서 제공하는 국제화 함수인 Intl extension 을 이용해서 한글 발음을 영어 단어로 음차(음역;transliteration)하는 방법도 있습니다.
$slug = transliterate_slug('한글 漢子 test', '-'); // "hangeul han zi test"
음차하기
음차 기능을 사용하려면 먼저 ext-intl 이 설치되어 있어야 합니다.
sudo apt install php8.0-intl
다음과 같이 Transliterator 클래스의 transliterate 기능을 사용해서 입력을 음차한 후에 slug 헬퍼에 전달해 주면 한글/한자 유실없이 slug 로 만들수 있습니다.
function transliterate_slug(string $value) : string { $tr = \Transliterator::create('Any-Latin; Latin-ASCII'); $tr_value = $tr->transliterate($value); return Str::slug($tr_value); }
$v = 'test 한글 漢子 똠방'; $s = transliterate_slug($v); // $s = "test-hangeul-han-zi-ttombang"