CI 묻고 답하기

제목 다국어 처리관련
글쓴이 치아키 작성시각 2015/02/25 15:21:23
댓글 : 6 추천 : 0 스크랩 : 1 조회수 : 31170   RSS
http://codeigniter-kr.org/user_guide_2.1.0/libraries/language.html
http://codeigniter-kr.org/user_guide_2.1.0/libraries/user_agent.html
http://www.sitepoint.com/multi-language-support-in-codeigniter/

위 3개의 링크를 참고하고 다국어사이트를 개발하고있는데요.
포럼에 검색하던중에 $lang값을 전역변수로 넘기는 방법도 있다고 들었는데..
위 링크들은 봐도 잘 모르겠고ㅠㅠ..접속된 위치에따라 kr뷰가 나오고 en뷰가 나오도록 능동적으로 처리하는것과
다국어 사이트개발을 어떤방법으로 하는게 좋을까요?? 참고할만한 예제소스나 방법을 좀 알수있을까요??
 다음글 $CI = new $class(); 부분부터 아무것도 ... (5)
 이전글 controller에서 post data 처리 (2)

댓글

변종원(웅파) / 2015/02/25 17:48:26 / 추천 0
http://cikorea.net/qna/view/15971/page/1/ 

세번째 문서 아주 잘 설명해놨네요.
치아키 / 2015/02/25 17:58:44 / 추천 0
웅파 // language 파일을 불러오는것과 위 링크처럼 hooks를 사용하는것은 어떤 차이점 인가요??
그리고 '최초 접속시 언어파일을 해당 나라의 것으로 로딩을 해주고 언어파일 내용을 불러오면 됩니다.' 이부분은 if문으로 하나의 view로 다국어 사이트를 만들때 분기하는 부분인가요?ㅠㅠ
ci세상 / 2015/02/25 18:29:04 / 추천 0
Lang.php파일 코어 확장하면 좀더 쉽게 될것도 같네요
아래부분에 deifne처리해서 사용하는 방식입니다.
스트링은 가급적이면 대문자로 정의하면 좋겠네요

국가별분기방법
1. autoload에서 분기
2. 컨트롤러에서 분기
$this->lang->load("battle","korean");
3. Lang.php 확장코어에서 코드분기

Lang (스트링)
 
$lang["TITLE_NAME"] = "사이트명";


application/core/Lang.php

 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package  CodeIgniter
 * @author  EllisLab Dev Team
 * @copyright  Copyright (c) 2008 - 2014, EllisLab, Inc.
 * @copyright  Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
 * @license  http://codeigniter.com/user_guide/license.html
 * @link  http://codeigniter.com
 * @since  Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Language Class
 *
 * @package  CodeIgniter
 * @subpackage Libraries
 * @category Language
 * @author  EllisLab Dev Team
 * @link  http://codeigniter.com/user_guide/libraries/language.html
 */
class CI_Lang {

 /**
  * List of translations
  *
  * @var array
  */
 var $language = array();
 /**
  * List of loaded language files
  *
  * @var array
  */
 var $is_loaded = array();

 /**
  * Constructor
  *
  * @access public
  */
 function __construct()
 {
  log_message('debug', "Language Class Initialized");
 }

 // --------------------------------------------------------------------

 /**
  * Load a language file
  *
  * @access public
  * @param mixed the name of the language file to be loaded. Can be an array
  * @param string the language (english, etc.)
  * @param bool return loaded array of translations
  * @param  bool add suffix to $langfile
  * @param  string alternative path to look for language file
  * @return mixed
  */
 function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')
 {
  $langfile = str_replace('.php', '', $langfile);

  if ($add_suffix == TRUE)
  {
   $langfile = str_replace('_lang.', '', $langfile).'_lang';
  }

  $langfile .= '.php';

  if (in_array($langfile, $this->is_loaded, TRUE))
  {
   return;
  }

  $config =& get_config();

  if ($idiom == '')
  {
   $deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
   $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
  }

  // Determine where the language file is and load it
  if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile))
  {
   include($alt_path.'language/'.$idiom.'/'.$langfile);
  }
  else
  {
   $found = FALSE;

   foreach (get_instance()->load->get_package_paths(TRUE) as $package_path)
   {
    if (file_exists($package_path.'language/'.$idiom.'/'.$langfile))
    {
     include($package_path.'language/'.$idiom.'/'.$langfile);
     $found = TRUE;
     break;
    }
   }

   if ($found !== TRUE)
   {
    show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
   }
  }

  // CI세상 추가
  foreach($lang as $key=>$value){ 
   define($key,$value);
  } 

  if ( ! isset($lang))
  {
   log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
   return;
  }

  if ($return == TRUE)
  {
   return $lang;
  }

  $this->is_loaded[] = $langfile;
  $this->language = array_merge($this->language, $lang);
  unset($lang);

  log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
  return TRUE;
 }

 // --------------------------------------------------------------------

 /**
  * Fetch a single line of text from the language array
  *
  * @access public
  * @param string $line the language line
  * @return string
  */
 function line($line = '')
 {
  $value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];

  // Because killer robots like unicorns!
  if ($value === FALSE)
  {
   log_message('error', 'Could not find the language line "'.$line.'"');
  }

  return $value;
 }

}
// END Language Class

/* End of file Lang.php */
/* Location: ./system/core/Lang.php */

C/V에서

echo TITLE_NAME;
 
변종원(웅파) / 2015/02/25 18:29:17 / 추천 0
치아키/ 세번째 문서 따라서 구현하세요.
제가 설명한 부분도 결국은 hook으로 한국인지 미국인지를 체크해서 언어를 로딩해야 합니다.
치아키 / 2015/02/26 11:10:43 / 추천 0
웅파 // 그럼결과적으로 hook에서

hooks/LanguageLoader.php

class LanguageLoader
{
  function initialize()
  {
    $ci =& get_instance();
    $ci->load->helper('language');

    $site_lang = $ci->session->userdata('site_lang');
    if ($site_lang)
    {
      $ci->lang->load('content',$ci->session->userdata('site_lang'));
    }
    else 
    {
      $ci->lang->load('content','english');
    }
  }
}

이렇게 체크하고 컨트롤러에서 

controllers/main.php

if ($site_lang)
    {
      $this->load->view('korea/content_view');
    }
    else 
    {
      $this->load->view('english/content_view');
    }
이렇게 하는게 맞나요??
아플바 / 2015/06/23 16:57:14 / 추천 0
저도 세번째 문서 따라서 해보고 있는데요 .
ci 2 버전
여러 메뉴(링크)가 있을때 각 메뉴  클릭시 화면 언어가 변경되지 않고 . 해당페이지에서  f5 키를 눌러야 하면 언어변경이 되는데 .
혹시 이런 상황 겪어본 분이 있어요?