다국어 기능 php 설정

Extra Form
PHP PHP 7.4
CMS Rhymix 2.x

 

지난 번 다국어 기능 js 설정하는 법은 기진곰님의 조언대로 수정하니 한방에 해결되었습니다. 

 

오늘은 php에서는 어떻게 해야할지 질문입니다.

 

1.html과 1.php 화일이 있습니다. 

 

php 화일 내에

print(json_encode([
'error' => $member_srl ? -1 : 0,
'message' => '이미 사용중인 이메일입니다.'
]));

 

이 부분을 

 

print(json_encode(['error' => $member_srl ? -1 : 0,'message' => '{$lang->register_13}']));

 

이렇게 수정해보았지만 작동하지 않습니다. 혹시나 해서 중괄호도 빼보았는데 역시 되지 않습니다.

 

js에서 했던 방식으로 

1.html 에서 

<script> var register_13 = {$lang->register_13|json}; </script>

이렇게 넣고 

php 에서 register_13을 넣어봤지만 되지 않았습니다. 

 

어떻게 해야할까요?

 

 

 

 

  • profile

    php 변수를 js 에서 사용하기 위해 php 변수값을 스크립트의 변수로 선언하는 것입니다.

    php 파일에서 $lang->register_13 는 그대로 사용하시면 됩니다. 라이믹스의 템플릿 html 에서도 물론 그대로 사용하면 됩니다. 출력을 위해서는 {$lang->register_13}

    물론 해당 php 파일에서 $lang->register_13를 제대로 불러오고 있다는 가정이 있어야 겠죠.

    질문이 구체적이지 못해서 어떤 질문인지 내용파악이 어려운 듯 합니다.

  • profile profile
    ko.php 화일에
    $lang->register_13 = '이미 사용중인 이메일입니다.';
    이렇게 되어있습니다.

    php 화일에
    'message' => '이미 사용중인 이메일입니다.'
    이부분을
    'message' => '$lang->register_13'
    이렇게 수정하면 된다는 말씀이시죠?

    만약 안된다면 $lang->register_13 를 제대로 못불러오고 있는 것으로 봐야하는 군요.
  • profile profile
    'message' => '$lang->register_13'

    이부분이 다국어로 필요해서 바꾸시는 거라면
    변수에는 따옴표를 빼셔야 할 것 같습니다.

    'message' => $lang->register_13

    '문자열' 문자에 따옴표를 씁니다.
  • profile profile

    답변감사합니다.

     

    https://scorefactory.io/index.php?act=dispRegister&mid=factory2ielts&step=1

     

    여기서 이메일을 입력했을때 이미 입력했던 이메일이면 '이미 사용중인 이메일입니다.' 문구가 나오는데 다국어 대응으로 변환하고자 합니다. ([email protected]  을 입력해보세요. -> 현재 말씀하신 대로 따옴표 제거했더니 출력되지 않고 있습니다^^;;

     

    말씀하신대로 따옴표를 제거했더니 아무내용이 나오지 않는 것으로 봐선 $lang->register_13 를 불러오지 못하는 것 같습니다.

    위 링크는 1.html 이고 첫 줄에서 <load target="./lang" /> 이렇게 언어 화일을 불러옵니다. html 내의 다국어 요소는 잘 반응하는데 같은 페이지 내에서 불러오는 1.php 내용에는 적용이 안되는 듯합니다.

     

    php화일에서 이 다국어 화일들을 불러오도록 선언? 같은걸 해줘야하는 걸까요?

     

     

  • profile profile

    php 파일에서 ko.php 의 내용을 자동으로 적용할 수 는 없습니다. 필요하다면 ko.php 불러와야 합니다.

    require_once 와 같은 함수를 이용해 보세요.

  • profile profile
    네.. 1.php 화일내에 직접
    $lang->register_13 = '이미 사용중인 이메일입니다.';
    내용을 입력하니 잘 작동하는 것으로 봐서
    말씀하신 대로 ko.php을 불러오지 못하고 있는게 확실한 것 같습니다.
    문제는 1. ko.php을 불러오는 법을 모름 2. ko.php만 불러오면 되는게 아니라 언어 설정에 맞는 화일을 불러와야함.

    제가 해결할 수 있는 영역이 아닐 수도 있겠다 라는 생각이 살살 듭니다..
  • profile profile

    해당 php에서 현재 언어를 어떻게 체크하는지 여부를 알 수 없고

    지금 다국어를 어떻게 구성했는지 알수 없고 구체적이지 않고 개인적으로만 알고 계신 내용이 대부분이라 답변이 어려울 것 같습니다.

    php 에서 지금 사용 언어를 감지해야 하나요?
    감지해야 한다면 감지 할 수 있는 방법은 뭔가요?

    감지 한다면 감지한 결과를 가지고 언어파일을 불러와야 하나요?
    - 하나의 다국어 파일에 모든 언어의 메시지를 다 작성하고 하나의 파일만 불러오는 경우도 있습니다.

    이전 질문에 답변의 내용도 보고 추측을 해본다면

    Context::getLangType() 으로 감지가 되는건가요??

    php 파일에서 echo Context::getLangType(); 라고 작성한 후 실행했을때 화면에 출력이 뭐가 되는지 확인해보시구요.

  • profile profile
    어떤 내용을 알려드려야 도움을 얻을 수 있을지 모를 정도라.. 답답함을 드리는 것같아 송구합니다.

    다국어 구성이라는게
    - 관리자 설정에서 메뉴 등에서 다국어 설정
    - 레이아웃/애드온/모듈 등에서 /lang 폴더에 ko.php, en.php 등 언어별 화일에 작업
    라이믹스 기본? 기능이라 따로 뭘 작업한 것은 없습니다.

    다국어 버튼은 아직 구현을 안해서 작업 내용은 https://scorefactory.io/?l=en 이렇게 해서 확인하고 있습니다.

    php 화일에 echo Context::getLangType(); 넣어봤는데 아무것도 나오질 않습니다 -_-;;;;
  • profile profile

    제가 잠시 해당 페이지를 리프레시 했을때 상단에 KO 라고 잠시 출력되었습니다.
    아마 echo Context::getLangType(); 구문에 의해 출력된 것인데 잠깐 출력되고 사라지는거라 못보신 듯 합니다.

    Context::getLangType(); 사용이 가능한 것으로 보이니 이 함수를 조건문으로 사용해서 분기를 하여 언어파일을 불러오도록 하면 될 것 같습니다.

    라이믹스에서 언어파일을 어떻게 처리하는지 제가 잘 몰라서 그냥 php 문법만 가지고 구현을 해보는 방법을 알려드려야 할 것 같습니다.

    ko.php , en.php 파일은 직접 만들고 안에 내용을 적으신게 아닌가요?

  • profile profile
    ko.php , en.php 파일은 직접 만들고 안에 내용을 적으신게 아닌가요? -> 네 맞습니다.

    ko.php 내용입니다. en.php는 같은 변수 이름에 영문 내용이 들어가 있습니다.

    <?php

    $lang->register_1 ='스코어팩토리에 오신 것을 환영합니다.';
    $lang->register_2 ='계속 진행함으로서';
    $lang->register_3 ='이용약관';
    $lang->register_4 ='과';
    $lang->register_5 ='개인정보 처리 방침';
    $lang->register_6 ='에 동의합니다.';
    $lang->register_7 ='올바른 이메일 형식이 아닙니다';
    $lang->register_8 = '이미 가입하셨나요? ';
    $lang->register_9 = ' 로그인하기';
    $lang->register_10 = '회원가입하기';
    $lang->register_11 = '계속하기';
    $lang->register_12 = '완료';
    $lang->register_13 = '이미 사용중인 이메일입니다.';
  • profile profile

    if(Context::getLangType() === 'en') {
    require_once('경로/en.php');
    } else if(Context::getLangType() === 'ko') {
    require_once('경로/ko.php');
    } else {
    require_once('경로/ko.php');
    }

    이런식으로 처리해보세요.
    아마 라이믹스에서 처리할때 이런식이 필요없을 수 있는데 ko.php 파일을 ko 언어일때 불러오도록 하면 될것 같아 이렇게 해봤습니다.

    라이믹스에 처리방법을 다시 알려주시면 그때 고쳐보시구요.

  • profile profile
    if(Context::getLangType() === 'en') {
    require_once('./lang/en.php');
    } else if(Context::getLangType() === 'ko') {
    require_once('./lang/ko.php');
    } else {
    require_once('./lang/ko.php');
    }

    이렇게 입력해서 넣어봤는데 뻗습니다.
    설정이 다 되고 나면 관리자 메뉴의 브라우저 언어 감지해서 언어 설정해주는 기능을 사용할 거라 그 부분도 작업을 해줘야 되겠군요.. 지난번 js 때처럼 쉽게 되는 것은 아닌가 봅니다.
  • profile profile
    어... 왜 에러가 날까요...
    elseif 띄어쓰기가 허용이 안되는건가요??
  • profile profile
    출력해주는것이 스킨인가요?
  • profile profile
    if(Context::getLangType() === 'en') {
    require_once('./tpl/lang/en.php');
    } elseif(Context::getLangType() === 'ko') {
    require_once('./tpl/lang/ko.php');
    } else {
    require_once('./tpl/lang/ko.php');
    }

    경로 설정이 틀려서 위와 같이 다시 해보고 else if 붙여서도 해보고 띄어도 봤는데 HTTP ERROR 500 뜹니다.
  • profile profile

    /modules/register
    - conf
    - steps
    -- tpl
    --- components
    --- css
    --- images
    --- js
    --- lang
    --- terms

    이런 구조로 되어있고,
    steps 폴더에 php 들이, tpl 폴더에 html 들이, lang 폴더에 ko.php, en.php 가 있습니다.

  • profile profile
    레이아웃 스킨에서는 php파일 인클루드 하지말고 html 을 로딩하세요.

    php파일을 인클로드 하지말고 html 을 인클루드 하세요.

    인클루드 해도 아무런 상관없으니

    <!--@if(Context::getLangType() === 'en')-->
    <incloud target="~~~~" />
    <!--@else-->
    <incloud target="~~~~" />
    <!--@end-->

    뭐 이런식으로 한다음
    저기에 인클루드 하는것에

    {@
    $layout_lang = new stdClass();
    }

    뭐 이런식으로 추가 하세요.

    $lang으로 하시면 좀 문제가 생길 수 있으니 최우선으로 먼저 로딩된 파일을 기준으로 저렇게 선언해서 서로 다른 언어를 출력하도록 하세요.
  • profile

    500번 에러는 에러 로그를 확인하세요.

     

    언어 파일 로딩은 require_once를 사용하는 것 아닙니다.

    수동으로 파일을 선택해야 한다면 언어 파일을 별도로 구분해 놓는 의미가 없겠지요.

  • profile profile
    네.
    저도 질문하면서 난감한 것이 모든 화일을 다 올려놓고 질문을 하면 좋겠는데.. 그게 안되다 보니 나름대로 문제가 되는 분이라고 생각되는 부분만 적어서 올릴 수 밖에 없으니 쉽게 도와주실만한 부분도 어렵게 만드는 것같습니다..
  • profile profile
    혹시 라이믹스에서 php 화일은 다국어 설정을 어떻게 해야하는지 정석적인 방법이 있을까요?
  • profile profile

    500에러는 왜나는지 저도 못찾겠네요.
    위 기진곰님 댓글에 힌트가 있어 보입니다.

    라이믹스 모듈이라면 자동으로 처리해 주는 듯 하니

    /tpl/lang/ko.php

    위 경로의 파일을 복사에서 추가해 보세요.

    제가 알려드린 코드 자체가 필요 없을 것 같습니다.

    지금 뭔가 시도하시는 php 가 모듈의 php 라 가정하면 말이죠.

    /모듈/lang/ko.php
    이렇게요.

     

    제가 알려드린 수동으로 하는 코드는 다 지우시구요.

  • profile profile

    위에 경로를 ./tpl/lang이라고 쓰셨던 부분이 좀 의심스러운데요.
    라이믹스설치경로/modules/모듈명/lang/ko.php 이런 식으로 경로가 되어 있다면
    해당 모듈 로딩시 자동으로 불러옵니다.

    모듈 폴더 아래에 곧바로 lang이 있어야 합니다. tpl 밑에 lang은 인식하지 않습니다.

    tpl이라는 것은 누군가가 만든 관습일 뿐, 코어 입장에서는 아무 의미도 없는 서브폴더일 뿐이므로...

  • profile profile
    네. 제가 그점 발견하고 위에 댓글로 알려드렸네요.
  • profile profile
    도와주셔서 감사합니다!
  • profile profile
    라이믹스설치경로/modules/모듈명/lang/ko.php 으로 되어있으면
    html에서도 <load target="./lang" /> 내용 없어도 모듈 로딩하면서 자동으로 불러오는 것인가요?
    그리고 정상적이라면 php에서도 잘불러와져야하는 것인가요?

    웹지기 님이 조언해주셔서 그렇게 넣어보았는데 마찬가지 입니다.
    modules/register/lang 을 만들어서 언어 화일들을 넣었습니다.
  • profile profile
    그럼 파일이 제대로 라이믹스에서 처리해 주고 있는지 확인이 필요하겠습니다.

    지금 테스트하는 php 파일에
    var_dump($lang->register_13);

    라고 적어서 실제 어떤 값이 출력되는지 빈값인지 확인이 필요하니다.
  • profile profile
    네, 실제로 해당 모듈의 act나 트리거를 통해서 출력되는 화면이라면 자동으로 불러오는 것이 맞습니다.
    다른 곳에서 php 파일 하나만 달랑 인클루드해서 쓴다면 그런 건 없겠지요.
  • profile profile
    제대로 처리가 되고 있습니다.
    말씀하신대로 폴더에 다 넣었더니
    <load target="./lang" /> 이 내용을 다 지웠는데도 언어 설정이 적용되고 있습니다.
    html에서는요. php에서는 적용이 안되고 있어요..

    'message' => $lang->register_1

    이렇게 입력하는 것이 맞지요?
  • profile profile
    모듈에서 처리 하셧으면 모듈이 로딩되는 상황에서는 해당 모듈의 언어를 이용한 것을 스킨에서는 따로 인클루드 할 필요 없이 자동으로 가져올 수 있습니다.

    다만, 해당 모듈이 사용되지 않는 경우라면 로딩이 되지 않을 수 있습니다. 그 경우는 따로 언어를 가져올 수 있도록 해야겠지요..
  • profile profile
    JS파일내에서는 언어 템플릿을 사용할 수없고 html템플릿에서 쓸수 있습니다.

    'message' => {$lang->register_1}
  • profile profile
    var_dump($lang->register_13);

    넣었더니
    null 이라고 뜨는것 같습니다. 개발자 도구 상단에서요.
  • profile profile
    앗 js 화일이 아니라 php 화일입니다!
  • profile profile
    제가 이해가 잘 안가서 PHP파일이 어떤 PHP파일속에 넣는다는건가요?

    외부파일? 아니면 라이믹스 모듈헨들러, 오브젝트를 extend시킨 모듈자체파일?
  • profile profile
    그럼 var_dump(lang('register.register_13') );로 찍어보시겠어요?

    다른 모듈 보니 lang('register.register_13') 형식으로 쓰네요.
  • profile profile
    /modules/register/steps/1.php 화일에

    print(json_encode([
    'error' => $member_srl ? -1 : 0,
    'message' => '이미 사용중인 이메일입니다.'
    ]));

    이런 내용이 있고, '이미 사용중인 이메일입니다.' 부분을 다국어 적용하고 싶어서 'message' => $lang->register_13

    이렇게 수정했지만 적용되지 않고 있습니다.
    제가 오해한 것인 php에 다국어 적용을 해주려면 php 에서 언어 화일을 별도로 불러오는 과정이 있어야 되는 것인 줄 알았는데 기진곰님께서 정상적으로 모듈에서 /lang 을 로드해서 php 화일에서도 적용된다고 합니다.
    그러므로 php화일 속에 php화일을 넣거나 해야하는 상황은 아닙니다.
  • profile profile

    정식 모듈 구조와 무관하게 임의로 추가하신 파일이라면 자동으로 불러와지지 않는 것이 당연합니다.

    템플릿 문법도 못 쓰고, 라이믹스의 틀 안에서 제공되는 대부분의 편의기능도 못 쓰고

    대부분의 팁과 답변이 무의미해져 버립니다.

    그래서 앞서 여러번 여쭤보았듯이 어디에 있는 php 파일인지가 중요한 것입니다.


    위에 웹지기님이 알려주신 lang( ... ) 코드를 사용해 보세요.

    특정 모듈의 언어파일을 강제로 로딩할 수 있습니다.

  • profile profile
    와.. 이건가봐요. 뜹니다! 적용해볼게요 ㅠ.ㅠ
  • profile profile
    네. 라이믹스에서 규칙이 다른건지 아니면 언어파일에서 작성한 $lang->register_1 을 php에서 그대로 가져가지 못하나 봅니다. 얼핏 봐서는 되어야 할 것 같은데요. 저도 이번에 배우고 가네요.
  • profile profile
    적용완료되었습니다! 정말 감사합니다. 라이믹스 언어 설정 관련해서 많이 배웠습니다!
  • profile profile

    경로가 해답입니다. /modules/register/steps/1.php

    아까 나왔던 tpl/lang과 마찬가지로, steps라는 경로는 코어 입장에서는 아무 의미가 없습니다.
    register 모듈 폴더 내에 있을 뿐, 경로만 봐서는 register 모듈과 전혀 무관한 파일이니
    언어파일을 자동으로 불러와줄 리가...

  • profile profile

    라이믹스의 resiter 모듈의 어떤 파일인지 모두 궁금해 하는데 알려주시죠.

     

    어.. 위 댓글에 적어주셨네요. steps ????????????   이런 경로에 php 파일을 별도로 만들어서 사용하면 이건 그냥 라이믹스와 관련 없는 파일이잖아요.....

     

    결론은 정상적인 모듈의 파일에서는 처음에 알려드린 변수 바로 사용해도 되는거군요. 

  • profile profile
    정리하자면 정상적인 모듈 구조를 가졌다면 php에도 자동으로 /lang 언어 설정들이 적용되지만,
    그렇지 않은 경우에 lang(...)코드를 사용하면 강제 로딩할 수 있다는 말씀이시군요.

    의뢰해서 만든 것이라..정식 모듈 구조를 따르지 않은 것을 몰랐습니다. 아마 만드실 당시에 다국어 기능을 염두에 두지 않았을 거라 생각합니다. 감사합니다!
  • profile profile
    네, 코어에서 알아듣는 controller, model, view 등의 구조로 만들고 그 안에 php 코드를 넣어야 코어에서 제공하는 편의기능이나 보안기능의 혜택을 볼 수 있지요. 귀찮다고 별도의 파일을 만들어서 날코딩하는 분들이 많은데, 당장은 돌아가겠지만 계속 유지보수하다 보면 결국 손해입니다...
  • profile profile
    제가 더 궁금한게.. 화일을 알려달라고 하시는게 어떤 의미인지.. 경로 말씀이신가요?

    /modules/register/steps/1.php 요 화일에요.
    같은 폴더에 2.php 3.php 4.php 5.php 까지 있습니다!

    이 화일들이 register 폴더에 있으면 자동 적용되는 거였는데
    /steps/ 폴더에 있어서 강제 로딩을 했어야 된다는 것이었나봐요. 제가 그걸 몰랐네요. 알았어도 고칠 방법도 모르지만..
    register 폴더에도 php 화일들이 있긴 있어요..;
  • profile profile
    /register 폴더에
    register.view.php
    register.model.php
    register.controller.php
    register.class.php
    가 있긴 합니다!
  • profile profile
    네. 위에 달아주신 댓글을 늦게 보고 확인했습니다.
    /steps/ 폴더를 추가로 만들어서 거기에 php 파일을 작성한게 정상적인 작동을 하지 않은게 원인이 된게 맞네요.
  • profile profile
    네! 이제서야 register.view.php 열어보니 여기서 steps 폴더의 1.php 2.php 3.php 4.php 5.php 를 불러오네요.
  • profile profile
    말씀하신 파일들은 위의 기진님의 댓글과 동일하게 외부파일로 분류하시면 됩니다.

    controller.php
    view.php
    등과 같이 모듈핸들러를 extend 해주는 모듈 파일들이 아닌 이상 모든 외부 파일들에서는 언어가 불러들여지지 않으니 기진님이 말씀하신대로 하셔야합니다.

    이렇게 질답게시글에서 이정도까지 댓글을 이어달으면서 헤멜이유가 전혀 없는데 재대로 집히지 않아서 제가 질문드렸던 것입니다.

    파일의 위치가 정상적으로 로딩되었다면 전혀 문제가 없었을거거든요.

    해결 되셨다니 다행입니다.

    좋은 밤 보내세요
  • profile
    늦은 시간까지 정성을 다해 도와주신 @웹지기님, @람보님, @기진곰님 감사드립니다!
    제가 정상적인 모듈 구조와 라이믹스 코어의 관계가 무엇인지 알았다면 문제점 파악이 빨랐을텐데..
    그래도 굉장히 많이 배웠습니다!