TIP게시판

제목 다국어를 디비와 파일 혼용으로 쓰기.
글쓴이 방문넷 작성시각 2014/08/26 05:28:33
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 13450   RSS
원문 : https://github.com/EllisLab/CodeIgniter/wiki/Language-Class-Extended-DB

원문을 보면 Lang파일을 검색하여 파일이 없을경우 디비에 있는걸 가져다 쓰는 구조로 되어있습니다.

그러나 저는 HMVC를 사용하기에 이 파일을 고대로 적용하니 모듈폴더에있는 랭귀지 파일을 못불러오는 사태가

발생하였습니다 그래서 따로 수정을 하여 지금은 잘쓰고있습니다!

필독! 이팁은 HMVC사용자에게만 해당되는 내용입니다. HMVC사용안하시는분은 원문대로 진행해주세요!
 
--
-- 테이블 구조 `language`
--

CREATE TABLE `language` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) NOT NULL,
  `nation` varchar(255) NOT NULL,
  `filename` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


PHP 코드는 Core 확장해서 써주세용~~ 상속하실때 CI_Lang이 아닌 MX_Lang 으로 하셔야합니당.
 
class MY_Lang extends MX_Lang {

	var $language    = array();
	var $is_loaded    = array();
	var $idiom;
	var $set;

	var $line;
	var $CI;

	function __construct() {
		parent::__construct();
		log_message('debug', "HMVC Language");
	}
	
	public function load($langfile = array(), $lang = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '', $_module = '')   {
		
		if (is_array($langfile)) {
			foreach($langfile as $_lang) $this->load($_lang);
			return $this->language;
		}
			
		$deft_lang = CI::$APP->config->item('language');
		$idiom = ($lang == '') ? $deft_lang : $lang;

		//앱폴더 검색.
		if (in_array($langfile.'_lang'.EXT, $this->is_loaded, TRUE)) {
			return $this->language;
		}
		
		//시스템폴더 검색.
		if (file_exists(BASEPATH."language/".$idiom.'/'.$langfile.'_lang'.EXT)) {
			
			include(BASEPATH."language/".$idiom.'/'.$langfile.'_lang'.EXT);
			$this->is_loaded[] = BASEPATH."language/".$idiom.'/'.$langfile.'_lang'.EXT;
			$this->language = array_merge($this->language, $lang);
			unset($lang);

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

		//모듈폴더 검색.
		$_module OR $_module = CI::$APP->router->fetch_module();
		list($path, $_langfile) = Modules::find($langfile.'_lang', $_module, 'language/'.$idiom.'/');

		if ($path === FALSE) {
			
			//모듈 폴더까지 파일이 없고 디비까지 체크해주자.
			$database_lang =  $this->_get_from_db($langfile, $idiom);
			if (!empty($database_lang)) {
				$lang = $database_lang;
				$this->language = array_merge($this->language, $lang);
				$this->is_loaded[] = $langfile.'_lang'.EXT;
				return $lang;
			}

			//재귀 호출.
			if ($lang = parent::load($langfile, $lang, $return, $add_suffix, $alt_path)) return $lang;
		
		} else {

			if($lang = Modules::load_file($_langfile, $path, 'lang')) {
				if ($return) return $lang;
				$this->language = array_merge($this->language, $lang);
				$this->is_loaded[] = $langfile.'_lang'.EXT;
				unset($lang);
			}
		}
		
		return $this->language;
	}

	/**
	 * Load a language from database
	 *
	 * @access    private
	 * @return    array
	 */
	private function _get_from_db($langfile, $idiom)
	{
		$return = array();
		$CI =& get_instance();
		log_message('debug', "이거슨 디비에...".$langfile.'/'.$idiom);
		$CI->db->select   ('*');
		$CI->db->from     ('language');
		$CI->db->where    ('nation', $idiom);
		$CI->db->where    ('filename', $langfile);

		$query = $CI->db->get()->result();

		foreach ( $query as $row )
		{
			$return[$row->code] = $row->value;
			log_message('debug', "주입중...");
		}

		unset($CI, $query);
		return $return;
	}
}


이렇게 해서 쓰시면 디비랑 파일 혼용해서 다국어 관리를 할수있습니다!!!!!!!!!!!!!!!!!!!!!!!!!

 
 다음글 config.php 를 확장해봅시다! (11)
 이전글 디비로 동적 라우팅 구성하기. (5)

댓글

한대승(불의회상) / 2014/08/26 09:14:04 / 추천 0
언어팩 수정시 에디터만 사용해야만 해서 불편 할 때가 있었는데 DB를 연동하는 방법도 있었네요.
검토를 해 봐야겠습니다. ^^
좋은 정보 감사 합니다.
letsgolee / 2014/08/26 11:58:26 / 추천 0
좋은 정보 감사합니다.