2017-12-20 30 views
0

여가/학습을 위해 여러 언어로 웹 애플리케이션을 작성하려고합니다. 이보다 더 좋은 방법이 있는지 궁금합니다.PHP의 다국어 웹 애플리케이션 용 메소드

환경

  • PHP 만. 지금까지 프레임 워크 나 라이브러리가 없습니다.

상황

영어와 일본어 문장은 단어의 다른 순서를 가지고, 그래서 나는 $user_name . 'decapitated' . $enemy. 같은 간단한 연결이 작동합니다 생각하지 않습니다.

그래서 나는 모든 문장을 데이터베이스에 저장하려고 생각하고 있습니다.

+----+------------------------------------+-----------------------------------+ | id | en | ja | +----+------------------------------------+-----------------------------------+ | 1 | $username has decapitated $enemy. | $username は $enemy の首をはねた! | +----+------------------------------------+-----------------------------------+

텍스트는 내부 $username 같은 일부 변수 나중에 str_replace()로 대체되어야한다.

$result = str_replace('$username', $username, $db->select('SELECT ja FROM `tb_language` WHERE id = 1;'))

질문

나는 데이터베이스 텍스트 변수를 확장하는 스마트 한 방법을 찾기 위해 노력하지만 난 할 수 없습니다. 어떠한 제안?
  • 위의 절차는 변수 수만큼 str_replace()을 필연적으로 반복하므로 효율적이지 않습니다. 어떠한 제안?
  • 모든 제안은 환영하며 미리 감사드립니다.

    +0

    하는 경우 당신은 자신의 템플릿 시스템을 굴리기를 원한다. . 'str_replace()'호출 이상으로, 나는 상수 데이터베이스 조회에 대해 걱정할 것이다. 실제로 관계형 데이터가 아닙니다. 적어도 캐시는 잘됩니다. 로드가 허용되면 데이터베이스 쿼리가 완벽하게 정상적으로 수행됩니다. –

    +0

    댄, 그래, 상수 데이터베이스 조회 내 관심사도 있습니다. 나는 그것이 얼마나 귀찮은 지 판단 할 수 없을 정도로 경험이 많지 않다. language.txt 파일이 더 나은 해결책이라고 생각합니다. – mogami74

    +0

    language.txt는 훌륭한 솔루션이라고 생각합니다. 아래의 제안 된 솔루션 ('printf()')과 잘 작동합니다; 템플릿을 언어 파일에 넣을 수 있습니다. –

    답변

    1

    printf()/sprintf() family of functions을 사용하십시오.

    printf

    , sprintf, vsprintf, (등등 ...) 함수는 포맷 문자열을 사용하고 같은 그들은 자리 로직의 꽤 표준화 된 세트를 이용 할 수 있습니다. 당신이 당신의 데이터베이스에 저장 한 싶은


    이 같은 것입니다 :

    %s has decapitated %s.

    PHP에서 서식을 수있는이 사용하는, 예를 들어, 직접을 출력 printf() 기능 (결과) 또는 sprintf() 기능 (은 결과로을 반환 함).

    $translated = sprintf("%s has decapitated %s.", "red", blue"); 
    echo $translated; 
    
    red has decapitated blue. 
    

    당신이 전달 된 인수의 순서를 지정 해야하는 경우 위치를 지정하여 그것을 할 수 있습니다. 예. 영어로 $format = "%1$s has decapitated %2$s." 그리고 다른 언어로는 $format = "%2$s has been decapitated by %1$s."과 비슷합니다.

    삽입 된 단어의 순서가 다르지만 소스 코드에서과 같은 순서로 유지하려는 경우 을 사용할 수 있습니다.

    이들 $format 문자열 모두

    올바르게 같은 sprintf($format, "red", blue") 호출을 통해 포맷됩니다 :

    • red has decapitated blue.
    • blue has been decapitated by red.

    가능한 서식 옵션 멋지게 여기에 제시되어 있습니다 http://php.net/manual/en/function.sprintf.php

    +0

    Smuuf, 선생님이 printf()에 관해 나에게 뭔가를 말해 주셔서 감사합니다.하지만 심각하게 생각하지 않았습니다. 이것은 확실하게 작동합니다. – mogami74