2012-02-03 4 views
2

다른 고객을 위해 사용자 정의 할 수있는 코드 기반이 있습니다. 이것은 대부분의 경우 클래스 이름을 사용하여 각 고객 별 상수가있는 클래스를로드하여 처리됩니다. 클래스 이름 충돌이 관리되며, 한 번에 하나만로드됩니다.화이트 라벨을 붙인 PHP 코드 모범 사례

class Customer() { 
    const CUST_NAME = 'Alpha Corp.'; 
} 

class Customer() { 
    const CUST_NAME = 'Beta, Inc.'; 
} 

각 고객에게 해당 코드가 국제화되기를 바랍니다. 따라서 프로그램은 언어 별 소스에서 표시된 텍스트를 그릴 수 있지만 고객 별 정보와 관련하여 여전히 동적입니다. i18n에 대해 고객 별 정보가 무관하다고 가정합니다. 이렇게하면 언어 당 고객 당 하나의 파일에서 언어 당 하나의 파일로 파일 수가 줄어 듭니다. 원하는 결과는

// in separate language files: 
$greeting = 'Hello. Welcome to '; 
$greeting = 'Hola. Bienvenido a '; 

// in front-end 
$greeting = get $greeting in desired language; 
echo $greeting, Customer::CUST_NAME, "\n"; 

나는 이러한 요구 사항을 충족하기 위해 고안 할 수있는 가장 좋은 솔루션은 여러 고객 및/또는 여러 언어를 처리 할 것 인 국제화 클래스 (또는 클래스의 가족)과 유사한 무언가를 구현하는 것입니다. 그러나 문자열 리터럴 또는 상수와 달리 메서드를 호출하는 것은 실행 비용이 많이 듭니다. 이 메서드는 상수 또는 외부 소스의 번역을 결합하여 Customer 클래스의 값과 결합합니다. (I 지금은 PHP 5.2와 함께 붙어 있어요, 그래서 클래스 속성에 대한 히어 닥의 미묘한가/상수를 사용할 수 없습니다.)

class i18n_en() { 
    const GREETING = 'Hello. Welcome to '; 

    static public function getGreeting() { 
     return self::GREETING . Customer::CUST_NAME; 
    } 
} 

또한, 나는 "템플릿 접근 방식"에 대한 스크립트를 쓸 수있는 I 유지 텍스트 플레이스 홀더가있는 클래스의 템플릿 파일. 고객 별 파일은 고객이 생성 할 때이 템플리트에서 생성됩니다. 필요에 따라 파일을 생성하거나 다시 생성하는 것이 쉬울 지 모르지만 각 언어에 대해 고객별로 별도의 파일이 필요합니다. 따라서, 그것은 내 욕구를 훌륭하게 충족시키지 못합니다.

확실히이 문제에 직면 한 것은 아닙니다. 누구든지 대안이나 모범 사례를 제공 할 수 있습니까? 코드가 새로운 고객을 만드는 것보다 여러 번 실행되기 때문에 유지 관리를 쉽게하기 위해 런타임 효율성을 선호합니다. 물론 훌륭한 솔루션이 두 가지를 제공 할 것입니다.

+0

당신에게 메서드 호출이 그'getGreeting()'방식의 천 호출을 통해 어떤 프로파일 링 가능한 오버 헤드가 발생합니다 특정 있습니까? 정적 문자열 연결의 번거 로움에 가치가 있습니까? – mario

답변

5

PHP 국제화에는 두 가지 방법이 있습니다.

가장 널리 퍼진과 같이 거대한 언어의 배열을 만드는 것입니다 :

define('MSG__GREETING', 1); 

$lang['en_US'] = array(MSG__GREETING => 'Hello, and welcome to '); 
$lang['fr_FR'] = array(MSG__GREETING => 'Bonjour, et bienvenue à '); 

$selectedLang = 'fr_FR'; 
echo $lang[$selectedLang][MSG__GREETING] . 'Fhloston Paradise'; 

불행하게도,이 매우 빠르게 아주 지루한 가져옵니다.

내가 여러 번 사용해 본 이상적인 방법은 리눅스 응용 프로그램의 국제화 방법 인 il8n (PHP's gettext extension을 통해)입니다. 이 방법

, 당신은 기본적으로 같은 물건을 끝낼 : il8n 파일에서 다음

setenv('LANG=fr_FR'); 
echo _('Hello, and welcome to ') . 'Fhloston Paradise'; 

과 (전화와 .po) 각 번역을합니다. 실제로는 .po 파일을 여러 번역자에게 전자 메일로 보낼 수 있고 코딩 기술을 필요로하지 않으므로 공란을 채울 수 있기 때문에 장기적으로 유지 관리하고 확장하는 것이 훨씬 쉽습니다.

여기에 튜토리얼이 시작 얻을 수있다 : http://kunststube.net/frontback/

+1

감사합니다. 확실히'gettext'를 살펴볼 것입니다. 나는 이것이 [[CUST_NAME]]과 같이 자리 표시자를 찾고 대체 할 수있는 텍스트 파일이라고 가정합니다. 또한 다섯 번째 요소 ref에 대한 추가 점수를 얻습니다. :) – N13

+0

방금 ​​확인해 보니 ... 화일과 화일 파일을 만드는 방법을 알아 냈습니까? –

+0

나는 그것에 대해 연구 할 시간이 없었다. 그래도 관심을 가져 주셔서 감사합니다. 나는 언제든지 게시 할 것이다. – N13

1

저는 개인적으로 국제화를 다룰 때 항상 템플릿을 사용했으며, 특히 Smarty - http://www.smarty.net/을 사용하고 언어 기반 템플릿을 만들었습니다. 또한 키, 언어 및 변환 열이있는 ex 테이블의 데이터베이스에서 번역 키를 사용할 수 있습니다.이 열은 방법의 수가 많지 않으므로 캐시 할 수 있습니다. 또한 memcached를 사용하여 메모리에있는 모든 번역 메서드의 출력을 캐시 할 수 있습니다. 수많은 방법. 조금이라도 도움이되기를 바랍니다.