2009-08-25 3 views
73

시간과 시간을 연구하고 있지만 명확하고 효율적인 방법을 찾지 못했습니다./codeigniter 웹 사이트 다중 언어를 만드는 가장 좋은 방법. lang 배열에서 호출하는 것은 lang 세션에 달려 있습니까?

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

각 언어에 대한 배열 파일을 만들고보기 파일에서 호출하는 방법은 랭 선택 항목의 세션에 따라 다릅니 까? 나는 데이터베이스를 사용하고 싶지 않다.

감사합니다. 마감 시간이 다되었습니다 :/감사합니다!

+1

여기에 게시 된 모든 답변은 훌륭하지만 캐시 된 하나의 컨트롤러와 설정 한 마지막 언어로 사용되므로 페이지의 현금 옵션을 잃어 버리게됩니다. 이 언어에 대한 해결책은 모든 언어에 대해 다른 컨트롤러를 사용하는 것입니다. –

답변

85

CodeIgniter's Language library을 보았습니까?

는 언어 클래스 기능 국제화의 목적을 위해 텍스트의 언어 파일과 라인 를 검색 할 수 있습니다.

CodeIgniter 시스템 폴더에서 은 언어 파일 집합 을 포함하는 하나의 언어를 찾습니다. 필요에 따라 순서로 자신의 언어 파일을 만들어 다른 언어로 오류 및 기타 메시지를 표시 할 수 있습니다.

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

...

  • 당신은 (예를 들어 $lang['hello'] = "Witaj";
  • 다음 컨트롤러에로드 한 후 해당 파일 내부에 키를 만들 application/language/polish
  • 내부 polish_lang.phpenglish_lang.php을 작성해야 like $this->lang->load('polish_lang', 'polish');
  • 그런 다음 $this->lang->line('hello');과 같은 행을 가져 오십시오.이 func의 반환 값을 저장하십시오. 변수에 변수를 넣으면 뷰에서 사용할 수 있습니다.

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

+0

고맙습니다. 예, 확인했습니다. 하지만 실제로는 명확하지 않습니다 :/내 필요성을 만드는 방법, 랭 파일을 생성하는 위치, 형식, 구조의 종류, 호출 방법 등에 대해 ... 저는 codeigniter에서 꽤 새로 왔습니다. 저것은 나가 명확한 지침서 또는 sth를 찾고 있던지 왜 thats. :/ –

+0

철저하게 읽으셨습니까? 그것은 정말로 당신이 필요로하는 것을합니다. – Randell

+0

의사 코드를 추가했습니다. 나는 그것이 도움이되기를 바랍니다. – Randell

21

또한 세션에 언어를 추가하려면 각 언어에 대한 몇 가지 상수를 정의한 다음 config/autoload.php에 세션 라이브러리가 자동로드되도록하거나 필요할 때마다로드하십시오.세션에 사용자가 원하는 언어를 추가

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

그런 다음 당신은 다음과 같이 언제든지 그것을 잡아 수 있습니다

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

네, 이것이 제 다른 문제였습니다. 너는 이미 나를 도와 줬어 : 위대한 thganks! 나는 또한 방문자의 언어 선택을 기억하기 위해 쿠키를 사용하려고 생각하고있었습니다. –

+1

어디에서이 세션을 정의해야합니까? 각 페이지의 컨트롤러에서 이들을 정의하는 것은 좋지 않다고 생각합니다. 전역 파일에서 정의한 방식이어야하며 모든 사이트에 영향을 미칩니다. 감사!! –

+0

여하튼, 이것을하는 더 나은 방법이 있습니다. 그러나 그것은 완전히 새로운 질문입니다. 그러나 이것은 단지 당신을 시작하게 할 수 있습니다. – Randell

0

실제 파일을 관리 할 때, 일이 아주 쉽게 당신이 아니라면 동기화 얻을 수 있습니다 정말 경계. 그래서 문자열 (베타) 무료 서비스를 시작했습니다.이 서비스를 통해 언어 파일을 쉽게 추적하고 번역사와 공동 작업 할 수 있습니다.

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

문자열은 완전히 무료입니다. 따라서 문자열을 확인하고 생각해 보시기 바랍니다.

실제로 Codeigniter를 기반으로 제작되었습니다. 당신이 즉

,

부모 :: 컨트롤러 후 cunstructor을 할 때 라인을 다음 컨트롤러 추가에서이

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

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

-1

의 베타 버전을 확인();

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

는 다음과 같은 기능을 도우미 파일 lang_translate_helper.php을 만들고 디렉토리 시스템 \ 응용 프로그램에 넣어 \ 헬퍼 언어의 각

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

을 가진 디렉토리를 만들 줄 아래에 추가 언어 축약은 en, nl, fr 등 시스템 \ 응용 프로그램 \ 언어 아래

위의 언어 파일 생성 (r espective)는 같은 언어에 대해 여러 파일을 저장할 수 있습니다

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

nl_site_lang.php

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

en_site_lang.php 아래에 주어진 $ LANG 배열 잡고 쌍 라벨 => language_value를 포함 할 디렉토리 예를 들어, 과 다르게 백엔드 (관리자 섹션)를 관리하기 위해 별도의 언어 파일을 원할 경우 $ this-> lang-> load ('nl_admin', 'nl')와 같이 컨트롤러에서 사용할 수 있습니다.

nl_admin_lang.PHP

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

마지막 는보기에서 다음과 같이 원하는 언어로

라벨 ('환영', $이) 액세스 라벨을 라벨을 인쇄;

또는

label ('hello word', $ this);

노트 안녕하세요 & 단어의 공간이 당신은뿐만 아니라이 방법 :) 언어 파일에 정의 된 lable가이없는 whene

, 그것은 단순히 기능 라벨에 전달 무엇을 인쇄 할 수처럼 사용할 수 있습니다.

+5

이것은 나쁜 프로그래밍의 예입니다. 함수에 상수를 정의하지 마십시오. 그것이 상수 라 불리는 이유입니다. 값은 변하지 않으므로 한 번만 정의됩니다. 둘째, [isset] (http ($ lang [$ language] [$ word]) == FALSE는'isset ($ lang [$ language] [$ word])' : //php.net/manual/en/function.isset.php)는 true 및 false 만 반환합니다. 셋째, 어떤 것이 거짓인지 평가할 때 항상 [type] (http://www.php.net/manual/en/types.comparisons.php)을 확인하기 위해'==='를 사용하십시오. – machineaddict

1

두 번째 랜델의 대답.

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

ipinfodb.com api를 사용하려는 경우 ip2locationlite.class.php 파일을 codeigniter 응용 프로그램 라이브러리 폴더에 추가 한 다음 모델 함수를 만들어 응용 프로그램에 필요한 지오픽 논리를 수행 할 수 있습니다. 그냥

$this->load->helper('language'); 

을 사용할 수 있으며 텍스트를

lang('language line'); 
를 번역 할 수 있도록 쉽게 사용 CI를 들어
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를 기반으로 언어를 탐지하는 것이 잘 작동하지 않습니다. VPNs, 여행자, 이민자 또는 캐나다 나 중국과 같은 여러 언어를 사용하는 단순한 국가를 생각해보십시오. 브라우저 언어를 사용하는 것이 좋습니다. – PiTheNumber

0

을 위해 선택적 매개 변수

lang('language line', 'element id'); 

이 출력됩니다

// becomes <label for="form_item_id">language_key</label> 

를 사용 훌륭한 성공.

어디서나 그 흔적을 찾을 수 없어서 github에 게시했습니다.

https://github.com/meigwilym/CI_Language

내 유일한 변화는 새로운 v2의 변화에 ​​따라, CI_Lang에 클래스 이름을 바꿀 수 있습니다.

+0

사람들은 왜 글로벌 사용의 필요성을 느낍니까? 그것은 쉽지만 큰 문제를 만들 수 있습니다. – Starlays

-1

친구, 걱정하지 마세요 당신은 내장 설치된 모든 응용 프로그램이있는 경우 codeigniter 그리고 언어 팩을 추가하려면 다음 단계를 따르십시오 :

1. 폴더에 언어 파일 추가/language/ara BIC는 응용 프로그램/모듈/설정 /보기/setting.phpsetting.php라는 이름의 파일에

2 이동 (내가 CI 내장 sma2에서 아랍어 LANG 추가). 여기에 배열이 있습니다.

<?php /* 

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

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

    'spanish' => 'Español' 

이제 응용 프로그램을 저장하고 실행하십시오. 괜찮 았어.

+0

라이브러리 나 도우미를 사용했다면'setting.php'라는 파일이 없습니다. 먼저 공유하십시오. –

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

O를하는 데는 보통 내부 mechanizm를 사용하고 있습니다! 내가보기에 버튼을 사용하면 사용자가 선호하는 언어로 쿠키 '언어'를 설정합니다.

그래서이 코드는 먼저 사용자의 사용자 에이전트 (브라우저)에 설정된 "preffered language"를 탐지하려고 시도합니다. 그런 다음 'language'쿠키를 읽으려고 시도하십시오. 마지막으로 - 스위치가 CI 애플리케이션 용 언어를 설정합니다.

관련 문제