codeigniter 웹 사이트를 다국어로 만드는 가장 좋은 방법입니다. lang 배열에서 호출은 lang 세션에 달려 있습니까?


81

시간과 시간을 조사하고 있지만 명확하고 효율적인 방법을 찾지 못했습니다.

영어로 된 codeigniter 기반 웹 사이트가 있는데 지금 폴란드어를 추가해야합니다. 방문자 선택에 따라 2 개 언어로 사이트를 만드는 가장 좋은 방법은 무엇입니까?

각 언어에 대한 배열 파일을 만들고 lang 선택에서 세션에 따라 뷰 파일에서 호출하는 방법이 있습니까? 데이터베이스를 사용하고 싶지 않습니다.

도움을 주셔서 감사합니다! 마감일이 다 됐습니다 : / 감사합니다 !!


1
여기에 게시 된 모든 답변은 훌륭하지만이를 사용하면 페이지의 캐싱 옵션을 잃게됩니다. 하나의 컨트롤러가 캐시되고 마지막으로 설정 한 언어로되어 있기 때문입니다. 다른 컨트롤러를 사용하여 다른 솔루션을 사용할 수 있습니까? 모든 언어에 대해.

답변:


93

CodeIgniter의 언어 라이브러리를 보셨습니까 ?

언어 클래스는 국제화를 위해 언어 파일과 텍스트 줄을 검색하는 함수를 제공합니다.

CodeIgniter 시스템 폴더에는 언어 파일 세트가 포함 된 언어라는 폴더가 있습니다. 오류 및 기타 메시지를 다른 언어로 표시하기 위해 필요에 따라 고유 한 언어 파일을 작성할 수 있습니다.

언어 파일은 일반적으로 시스템 / 언어 디렉토리에 저장됩니다. 또는 응용 프로그램 폴더 안에 language라는 폴더를 만들어 저장할 수 있습니다. CodeIgniter는 응용 프로그램 / 언어 디렉토리에서 먼저 찾습니다. 디렉토리가 없거나 지정된 언어가없는 경우 CI는 대신 글로벌 시스템 / 언어 폴더를 찾습니다.

귀하의 경우에는 ...

  • 당신은 polish_lang.phpenglish_lang.php내부 를 만들어야합니다application/language/polish
  • 그런 다음 해당 파일 내에 키를 만듭니다 (예 : $lang['hello'] = "Witaj";
  • 그런 다음 컨트롤러에로드하십시오. $this->lang->load('polish_lang', 'polish');
  • 그런 다음 $this->lang->line('hello');이 함수의 반환 값을 변수에 저장하여 뷰에서 사용할 수 있도록 다음 과 같은 줄을 가져옵니다 .

영어 및 필요한 다른 모든 언어에 대해 단계를 반복하십시오.


빠른 답변에 감사드립니다. 예, 저는 이것을 보았습니다. 그러나 실제로는 명확하지 않습니다. 내 필요를 만드는 방법, lang 파일을 생성 할 위치, 형식, 어떤 종류의 구조, 호출 방법 등에 대해 ... 저는 codeigniter에 익숙하지 않습니다. 그래서 내가 명확한 튜토리얼이나 sth를 찾고 있었다. : /
디자이너 시도 코딩

1
Heyooo 잘 작동합니다 : D 도움을 많이 주셔서 감사합니다! 당신은 생명의 은인입니다! :) 감사합니다
디자이너 시도 코딩

2
이것은 편집 불가능한 텍스트에 대한 솔루션이지만 데이터베이스에서 저장 및 검색된 다국어 콘텐츠는 다루지 않습니다. CI로 만든 맞춤형 콘텐츠 관리 시스템을 갖춘 다국어 사이트에는 이보다 더 많은 것이 필요합니다. URL의 언어 세그먼트 및 / 또는 유일한 언어로 단독 콘텐츠를 식별하는 고유 한 별칭 세그먼트를 사용하여 직접 만들었습니다. 나는 이것을 더 잘 관리하는 방법을 아직 찾지 못했습니다. 그게 제가이 스레드에 부딪힌 이유입니다.
Luis Martin

@Randell은 작동하지만 onclick으로 다른 언어로 번역하는 방법에 대해 자세히 설명해 주시겠습니까? ... 세션에 저장한다는 의미입니까? 방법

@Nadh, 새 스레드에 질문을 게시하여 토론을 간결하게 유지하는 것이 가장 좋습니다.
Randell

22

또한 세션에 언어를 추가하기 위해 각 언어에 대한 몇 가지 상수를 정의한 다음 config / autoload.php에 세션 라이브러리가 자동로드되었는지 확인하거나 필요할 때마다로드합니다. 사용자가 원하는 언어를 세션에 추가합니다.

$this->session->set_userdata('language', ENGLISH);

그런 다음 언제든지 다음과 같이 잡을 수 있습니다.

$language = $this->session->userdata('language');

네 이것은 나의 또 다른 문제였습니다. 당신은 이미 나를 도왔습니다 : D 위대한 thganks! 나는 또한 방문자의 언어 선택을 기억하기 위해 쿠키를 사용할 생각이었습니다.
디자이너 시도 코딩

1
이 세션을 어디에서 정의해야합니까? 각 페이지의 컨트롤러에서 정의하는 것은 좋지 않다고 생각합니다. 글로벌 파일에서 정의하는 방식이어야하며 모든 사이트에 영향을 미칩니다. 감사!!
디자이너 시도 코딩

어쨌든 더 나은 방법이 있습니다. 그러나 그것은 완전히 새로운 질문입니다. 그러나 이것은 시작하기 위해서도 가능합니다.
Randell 2009-08-26

7

컨트롤러에서 cunstructor를 만들 때 다음 줄을 추가하십시오.

즉, 이후

parent :: Controller ();

아래 줄 추가

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

다음 기능으로 도우미 파일 lang_translate_helper.php를 만들고 system \ application \ helpers 디렉토리에 넣으십시오.

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

각 언어에 대해 system \ application \ languages ​​아래에 en, nl, fr 등과 같은 언어 약어로 디렉토리를 만듭니다.

아래에 주어진대로 label => language_value 쌍을 보유하는 $ lang 배열을 포함 할 위 (각각) 디렉토리에 언어 파일을 만듭니다.

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello word'] = 'Hello Word';

예를 들어, 백엔드 (관리자 섹션) 관리를 위해 별도의 언어 파일을 원할 경우 컨트롤러에서 $ this-> lang-> load ( 'nl_admin', '로 사용할 수 있습니다. nl ');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

마지막으로 원하는 언어로 라벨을 인쇄하려면 아래와 같이 라벨에 액세스하십시오.

label ( 'welcome', $ this);

또는

label ( '안녕하세요', $ this);

hello & word의 공백을 참고하십시오.이 방식으로도 사용할 수 있습니다. :)

언어 파일에 정의 된 레이블이 없으면 함수 레이블에 전달한 내용을 간단히 인쇄합니다.


1

나는 Randell의 대답을 두 번째로한다.

그러나 http://www.maxmind.com/app/php 또는 http://www.ipinfodb.com/ 과 같은 GeoIP는 항상 통합 할 수 있습니다. 그런 다음 codeigniter 세션 클래스로 결과를 저장할 수 있습니다.

ipinfodb.com api를 사용하려는 경우 ip2locationlite.class.php 파일을 codeigniter 애플리케이션 라이브러리 폴더에 추가 한 다음 모델 함수를 생성하여 다음과 같이 애플리케이션에 필요한 모든 geoip 로직을 수행 할 수 있습니다.

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}

3
IP 기반 언어 감지는 잘 작동하지 않습니다. VPN, 여행자, 이민자 또는 단순히 캐나다 나 중국과 같은 여러 언어를 사용하는 국가를 생각해보십시오. 브라우저 언어를 사용하는 것이 좋습니다.
PiTheNumber


1

Wiredesignz의 MY_Language 클래스를 성공적으로 사용했습니다.

어디에서도 흔적을 찾을 수 없어서 방금 github에 게시했습니다.

https://github.com/meigwilym/CI_Language

내 유일한 변경 사항은 새로운 v2 변경 사항에 따라 클래스 이름을 CI_Lang으로 변경하는 것입니다.


사람들이 글로벌 사용의 필요성을 느끼는 이유는 무엇입니까? 쉽지만 큰 문제를 일으킬 수 있습니다.
Starlays 2017-04-25

0

실제 파일을 관리 할 때 실제로 경계하지 않는 한 상황이 매우 쉽게 동기화되지 않을 수 있습니다. 따라서 언어 파일을 쉽게 추적하고 번역사와 협업 할 수있는 String 이라는 (베타) 무료 서비스를 출시했습니다 .

기존 언어 파일 (PHP 배열, PHP 정의, ini, po 또는 .strings 형식)을 가져 오거나 처음부터 자신의 섹션을 만들고 시스템을 통해 직접 콘텐츠를 추가 할 수 있습니다.

String은 완전 무료이므로 확인 하시고 의견을 보내주세요.

실제로 Codeigniter에도 구축되었습니다! http://mygengo.com/string 에서 베타를 확인하세요 .


이것은 실제로 좋은 점입니다. CI의 언어 파일은 시간이 지남에 따라 유지하기가 쉽지 않습니다.
sourcejedi


0

config.php에서 이러한 코드를 사용하고 있습니다.

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

.... 그런 다음 CI의 일반적인 내부 메커니즘을 사용하고 있습니다.

오, 거의 잊어 버려! 뷰에서 사용자가 선호하는 언어로 쿠키 '언어'를 설정하는 버튼을 사용합니다.

따라서 먼저이 코드는 사용자의 useragent (브라우저)에 설정된 "선호 언어"를 감지합니다. 그런 다음 코드는 쿠키 '언어'를 읽으십시오. 마지막으로-스위치는 CI 애플리케이션을위한 언어를 설정합니다.


-1

다음과 같은 기능을 만들 수 있습니다.

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}

6
이것은 잘못된 프로그래밍의 예입니다. 함수에서 상수를 정의하지 마십시오. 그래서 상수라고 부르고 값은 변하지 않으므로 한 번만 정의됩니다. 둘째, isset 은 true와 false 만 반환 하기 때문에이 코드 isset($lang[$language][$word]) == FALSE로 충분 합니다. 셋째, 어떤 것이 거짓인지 평가할 때 항상 유형 을 확인하는 데 사용하십시오 . isset($lang[$language][$word])===
machineaddict 2013 년

-1

친구, 걱정하지 마십시오. codeigniter에 내장 된 애플리케이션이 설치되어 있고 일부 언어 팩을 추가하려면 다음 단계를 따르십시오.

1. 응용 프로그램 / 언어 / 아랍어 폴더에 언어 파일을 추가합니다 (ci에 내장 된 sma2에 아랍어 언어 추가).

2. 라는 이름의 파일로 이동 setting.php응용 프로그램 / 모듈 / 설정 /보기 / setting.php . 여기서 배열을 찾습니다.

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

이제 응용 프로그램을 저장하고 실행하십시오. 잘 작동했습니다.


setting.php라이브러리 나 도우미를 사용한 적이 있다면 이름이 지정된 파일이 없습니다 . 먼저 공유하세요.
Ali Qorbani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.