ShalvaSoft
php developer

    
ჯგუფი: Registered
წერილები: 1951
წევრი No.: 181428
რეგისტრ.: 9-February 14
|
#47410643 · 29 Mar 2016, 17:03 · · პროფილი · პირადი მიმოწერა · ჩატი
მოკლედ ვიპოვე ასეთი კლასი
CODE | <?php defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Lang extends CI_Lang{ private $languages = [];
// special URIs (not localized) private $special = array ( "admincp" );
// where to redirect if no language in URI private $uri; private $default_uri; private $lang_code;
function MY_Lang() {
parent::__construct();
global $CFG; global $URI; global $RTR;
$this->uri = $URI->uri_string(); $this->default_uri = $RTR->default_controller;
$uri_segment = $this->get_uri_lang($this->uri); $this->lang_code = $uri_segment['lang'];
$url_ok = false; if ((!empty($this->lang_code)) && (array_key_exists($this->lang_code, $this->languages))) { $language = $this->languages[$this->lang_code]; $CFG->set_item('language', $language); $url_ok = true; }
if ((!$url_ok) && (!$this->is_special($uri_segment['parts'][0]))) { // set default language $CFG->set_item('language', $this->languages[$this->default_lang()]);
$uri = (!empty($this->uri)) ? $this->uri: $this->default_uri; $uri = ($uri[0] != '/') ? '/'.$uri : $uri; $new_url = $CFG->config['base_url'].$this->default_lang().$uri;
header("Location: " . $new_url, TRUE, 302); exit; } }
// get current language // ex: return 'en' if language in CI config is 'english' function lang() { global $CFG; $language = $CFG->item('language');
$lang = array_search($language, $this->languages); if ($lang) { return $lang; } return NULL; // this should not happen }
function is_special($lang_code) { if ((!empty($lang_code)) && (in_array($lang_code, $this->special))) return TRUE; else return FALSE; }
function switch_uri($lang) { if ((!empty($this->uri)) && (array_key_exists($lang, $this->languages))) { if ($uri_segment = $this->get_uri_lang($this->uri)) { $uri_segment['parts'][0] = $lang; $uri = implode('/',$uri_segment['parts']); } else { $uri = $lang.'/'.$this->uri; } } return $uri; }
//check if the language exists //when true returns an array with lang abbreviation + rest function get_uri_lang($uri = '') { if (!empty($uri)) { $uri = ($uri[0] == '/') ? substr($uri, 1): $uri;
$uri_expl = explode('/', $uri, 2); $uri_segment['lang'] = NULL; $uri_segment['parts'] = $uri_expl;
if (array_key_exists($uri_expl[0], $this->languages)) { $uri_segment['lang'] = $uri_expl[0]; } return $uri_segment; } else return FALSE; }
// default language: first element of $this->languages function default_lang() { // $browser_lang = !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : ''; // $browser_lang = substr($browser_lang, 0,2); // return (array_key_exists($browser_lang, $this->languages)) ? $browser_lang: 'en';
$lang = array_search(config_item('language'), $this->languages); if ($lang) { return $lang; } return 'en'; // return en if undefined languae
}
// add language segment to $uri (if appropriate) function localized($uri) { if (!empty($uri)) { $uri_segment = $this->get_uri_lang($uri); if (!$uri_segment['lang']) { if ((!$this->is_special($uri_segment['parts'][0])) && (!preg_match('/(.+)\.[a-zA-Z0-9]{2,4}$/', $uri))) { $uri = $this->lang() . '/' . $uri; } } } return $uri; } }
|
თითქოს მუშაობს მაგრამ მე მინდა რომ ეგ lang-ები წამოიღოს არა ფაილებიდან არამედ ბაზიდან და CI ვერაფრით შევიტანე
ბაზის სტრუქტურა არის ასეთი
SQL | DROP TABLE IF EXISTS `translate`; DROP TABLE IF EXISTS `trans_data`; DROP TABLE IF EXISTS `languages`; /*Table structure for table `languages` */
CREATE TABLE `languages` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `key` varchar(5) NOT NULL, `default` tinyint(1) NOT NULL DEFAULT '0', `display` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/*Data for the table `languages` */
insert into `languages`(`name`,`key`,`default`,`display`) values ('GEO','ka',1,1), ('ENG','en',0,1), ('RUS','ru',0,1);
/*Table structure for table `trans_data` */
CREATE TABLE `trans_data` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/*Table structure for table `translate` */
CREATE TABLE `translate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `lang` int(11) NOT NULL, `data` int(11) NOT NULL, `trans` text NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `lang_2` (`lang`,`data`), KEY `lang` (`lang`), KEY `data` (`data`), CONSTRAINT `translate_ibfk_1` FOREIGN KEY (`lang`) REFERENCES `languages` (`id`), CONSTRAINT `translate_ibfk_2` FOREIGN KEY (`data`) REFERENCES `trans_data` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=340 DEFAULT CHARSET=utf8;
|
ანუ უნდა გააკეთოს რაღაც ასეთი რამ
CODE | $this->db->where('key', end($this->segments)); $query = $this->db->get('languages'); $lang = $query->row(); if(empty($lang)){ $this->db->where('default', 1); $query2 = $this->db->get('languages'); $lang = $query2->row(); } $lang_key = $lang->key; $lang_id = $lang->id;
|
და მერე ამ id-ის მიხედვით უნდა გაუშვას ეს ქუერი
SQL | SELECT TD.`name` , T.`trans` FROM `translate` AS T INNER JOIN `languages` AS L ON (T.`lang` = L.`id`) INNER JOIN `trans_data` AS TD ON (T.`data` = TD.`id`) WHERE (L.`key` = :lang_key);
|
მარა თავი ვერ დავადგი როგორ ვქნა ვინც გაწვრთნილია მაგ ფრეიმვორკზე იქნებ მომეშველოთ და გადამიკეთოთ ეგ კლასი რა...
პირველი და აუცილებელი პირობაა რომ ეს კლასი ინიციალიზაციისას გაეშვას და მეორე აუცილებელი პირობაა
CODE | echo $this->lang->line('trans_key');
|
ამას რომ გავწერ მიღებული translates ობიექტიდან გამოიტანოს კონკრეტული value
ანუ ჩემი აზრით line ფუნქციაც გადასაწერია ნუ არ ვიცი ვერ ვერკვევი ეგრე მაგრად მაგ ფრეიმვორკში და შემომეშველეთ რა...
ესაა ერთადერთი პრობლემა რომელსაც ვერაფერი მოვუხერხე დანარჩენს ვაკეთებ ყვეაფერს ჩერეზ დოკუმენტაციით...
This post has been edited by ShalvaSoft on 29 Mar 2016, 17:17
--------------------
ვებ პროგრამისტების საყურადღებოდ http://jobs.ge/119262/
|