Changeset 406


Ignore:
Timestamp:
05/23/2010 03:01:41 PM (2 years ago)
Author:
ofer
Message:

Enable translation of URLs to a given target language

Location:
trunk/WordPress/plugin/transposh
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/WordPress/plugin/transposh/core/utils.php

    r346 r406  
    238238function base64_url_decode($input) { 
    239239    return base64_decode(strtr($input, '-_,', '+/=')); 
     240} 
     241 
     242/** 
     243 * Function to translate a given url permalink to a target language 
     244 * TODO - check params 
     245 * @param string $href 
     246 * @param string $home_url 
     247 * @param string $target_language 
     248 * @param function $fetch_translation_func 
     249 * @return string translated url permalink 
     250 */ 
     251function translate_url($href, $home_url, $target_language,$fetch_translation_func) { 
     252    // todo - check query part... sanitize 
     253    $href = substr($href,strlen($home_url)+1); 
     254    $parts = explode('/', $href); 
     255    foreach ($parts as $part) { 
     256        if (!$part) continue; 
     257        list($translated_text, $old_source) = call_user_func_array($fetch_translation_func, array($part, $target_language)); 
     258        if ($translated_text) 
     259            $url .= '/'.str_replace(' ', '-',$translated_text); 
     260        else { 
     261            // now the same attempt with '-' replaced to ' ' 
     262            list($translated_text, $old_source) = call_user_func_array($fetch_translation_func, array(str_replace('-', ' ', $part), $target_language)); 
     263            logger ($part. ' '.str_replace('-', ' ', $part).' '.$translated_text); 
     264            if ($translated_text) 
     265                $url .= '/'.str_replace(' ', '-',$translated_text); 
     266            else 
     267                $url .= '/'.$part; 
     268        } 
     269    } 
     270    $href = $home_url.$url.'/'; 
     271    return $href; 
     272} 
     273 
     274/** 
     275 * From a given translated url, tries to get the original URL 
     276 * @param  string $href 
     277 * @param string $target_language 
     278 * @param function $fetch_translation_func 
     279 * @return string 
     280 */ 
     281function get_original_url($href, $target_language,$fetch_translation_func) { 
     282    $url = urldecode($href); 
     283    $url = (($pos=strpos($url, '?')) ? substr($url, 0, $pos) : $url); 
     284    $parts = explode('/', $url); 
     285    foreach ($parts as $part) { 
     286        if (!$part) continue; 
     287        // don't attempt for lang or numbers 
     288        if ($part == $target_language || is_numeric($part)) { 
     289            $url2 .= '/'.$part; 
     290            continue; 
     291        } 
     292 
     293        $original_text = call_user_func_array($fetch_translation_func, array($part, $target_language)); 
     294        if ($original_text) 
     295            $url2 .= '/'.strtolower(str_replace(' ', '-',$original_text)); //? CHECK 
     296        else { 
     297            $original_text = call_user_func_array($fetch_translation_func, array(str_replace('-', ' ', $part), $target_language)); 
     298            if ($original_text) 
     299                $url2 .= '/'.strtolower(str_replace(' ', '-',$original_text)); //? CHECK 
     300            else 
     301                $url2 .= '/'.$part; 
     302        } 
     303    } 
     304    // TODO: Consider sanitize_title_with_dashes 
     305    // TODO : need to handle params.... 
     306    //logger(substr($url,strlen($url)-1)); 
     307    //if (substr($url,strlen($url)-1) == '/') $url2 .= '/'; 
     308    //$url2 = rtrim($url2,'/'); 
     309    logger ("$href $url $url2"); 
     310    //$href = $this->home_url.$url2; 
     311 
     312    return $url2.'/'; 
    240313} 
    241314 
  • trunk/WordPress/plugin/transposh/test/core/utilsTest.php

    r305 r406  
    225225    } 
    226226 
     227    public function testCleanupURL3() 
     228    { 
     229        $homeurl = ""; 
     230        //$params_only = true; 
     231        $this->assertEquals("/test",cleanup_url("/he/test",$homeurl)); 
     232        $this->assertEquals("/test",cleanup_url("he/test",$homeurl)); 
     233    } 
     234 
    227235    public function testGrabLanguage() 
    228236    { 
  • trunk/WordPress/plugin/transposh/transposh.php

    r405 r406  
    111111        add_filter('query_vars', array(&$this,'parameter_queryvars' )); 
    112112        add_filter('rewrite_rules_array', array(&$this,'update_rewrite_rules')); 
     113        if ($this->options->get_enable_url_translate()) { 
     114            add_filter('request', array(&$this,'request_filter')); 
     115        } 
    113116        add_action('init', array(&$this,'on_init'),0); // really high priority 
    114117        add_action('parse_request', array(&$this,'on_parse_request')); 
     
    524527     */ 
    525528    // lost in compatability 
    526 /*    function add_transposh_async() { 
     529    /*    function add_transposh_async() { 
    527530        if (!$this->edit_mode && !$this->is_auto_translate_permitted()) { 
    528531            return; 
     
    607610        $use_params = !$this->enable_permalinks_rewrite; 
    608611 
     612        // some hackery needed for url translations 
     613        // first cut home 
     614        if ($this->options->get_enable_url_translate()) { 
     615            $href = translate_url($href, $this->home_url,$this->target_language,array(&$this->database,'fetch_translation')); 
     616        } 
    609617        $href = rewrite_url_lang_param($href,$this->home_url,$this->enable_permalinks_rewrite, $this->target_language, $this->edit_mode, $use_params); 
    610618        logger ("rewritten: $href",4); 
     
    730738    } 
    731739 
     740    /** 
     741     * This function enables the correct parsing of translated URLs 
     742     * @global <type> $wp 
     743     * @param <type> $query 
     744     * @return <type> 
     745     */ 
     746    function request_filter($query) { 
     747        //no need to handle non-lang 
     748        if (!$query['lang']) return $query; 
     749 
     750        // the trick is to replace the URI and put it back afterwards 
     751        $oldRequestUri = $_SERVER['REQUEST_URI']; 
     752        $_SERVER['REQUEST_URI'] = get_original_url($_SERVER['REQUEST_URI'], $query['lang'], array($this->database,'fetch_original')); 
     753        remove_filter('request', array(&$this,'request_filter')); 
     754        global $wp; 
     755        $wp->parse_request(); 
     756        $query = $wp->query_vars; 
     757        logger($query,4); 
     758        $_SERVER['REQUEST_URI'] = $oldRequestUri; 
     759 
     760        return $query; 
     761    } 
     762     
    732763} 
    733764 
  • trunk/WordPress/plugin/transposh/wp/transposh_admin.php

    r387 r406  
    116116        $this->transposh->options->set_enable_default_translate($_POST[ENABLE_DEFAULT_TRANSLATE]); 
    117117        $this->transposh->options->set_enable_search_translate($_POST[ENABLE_SEARCH_TRANSLATE]); 
     118        $this->transposh->options->set_enable_url_translate($_POST[ENABLE_URL_TRANSLATE]); 
    118119        $this->transposh->options->set_enable_msn_translate($_POST[ENABLE_MSN_TRANSLATE]); 
    119120        $this->transposh->options->set_preferred_translator($_POST[PREFERRED_TRANSLATOR]); 
     
    464465                'Allow search of translated languages, in those languages (and the original language)'; 
    465466 
     467        /** 
     468         * Insert the option to enable translation of urls 
     469         * Disbaled by default. 
     470         * @since 0.5.3 
     471         */ 
     472        echo '<h4>Enable url translation (expirimental)</h4>'; 
     473        echo '<input type="checkbox" value="1" name="'.ENABLE_URL_TRANSLATE.'" '.$this->checked ($this->transposh->options->get_enable_url_translate()).'/> '. 
     474                'Allow translation of permalinks and urls'; 
     475 
    466476    } 
    467477 
  • trunk/WordPress/plugin/transposh/wp/transposh_db.php

    r398 r406  
    4747    } 
    4848 
     49    /** 
     50     * Allow fetching of multiple translation requests from the database with a single query 
     51     * @param array $originals 
     52     * @param string $lang 
     53     */ 
    4954    function prefetch_translations($originals, $lang) { 
    5055        if (!$originals) return; 
     
    7075        logger($this->translations, 5); 
    7176    } 
     77 
    7278    /** 
    7379     * Fetch translation from db or cache. 
     
    126132        logger("Exit: $translated", 4); 
    127133        return $translated; 
     134    } 
     135 
     136    /** 
     137     * Fetch original from db or cache. 
     138     * Returns the original for a given translation. 
     139     * Will return NULL if no translation is available. 
     140     * @param string $original 
     141     * @param string $lang 
     142     * @return array list(translation,source) 
     143     */ 
     144    function fetch_original($translation, $lang) { 
     145        $original = NULL; 
     146        logger("Enter: $translation", 3); 
     147 
     148        //The original is saved in db in its escaped form 
     149        $translation = $GLOBALS['wpdb']->escape(html_entity_decode($translation, ENT_NOQUOTES, 'UTF-8')); 
     150 
     151        if(ENABLE_APC && function_exists('apc_fetch')) { 
     152            $cached = apc_fetch($translation .'_r_r_'. $lang, $rc); 
     153            if($rc === TRUE) { 
     154                logger("Exit from cache: $cached", 3); 
     155                return $cached; 
     156            } 
     157        } 
     158 
     159        if ($this->translations[$translation]) { 
     160            $original = $this->translations[$translation]; 
     161            logger("prefetch result for $translation >>> {$this->translations[$translation][0]} ({$this->translations[$translation][1]})" , 3); 
     162        } else { 
     163 
     164            $table_name = $GLOBALS['wpdb']->prefix . TRANSLATIONS_TABLE; 
     165            $query = "SELECT * FROM $table_name WHERE translated = '$translation' and lang = '$lang' "; 
     166            $row = $GLOBALS['wpdb']->get_row($query); 
     167 
     168            if($row !== FALSE) { 
     169                $original = stripslashes($row->original); 
     170                //$translated = array($translated_text, $row->source); 
     171                logger("db result for $translation >>> $original ($lang) ({$row->source})" , 3); 
     172            } 
     173        } 
     174 
     175        if(ENABLE_APC && function_exists('apc_store')) { 
     176            //If we don't have translation still we want to have it in cache 
     177            $cache_entry = $original; 
     178            if($cache_entry == NULL) { 
     179                $cache_entry = ""; 
     180            } 
     181 
     182            //update cache 
     183            $rc = apc_store($translation .'_r_r_'. $lang, $cache_entry, 3600); 
     184            if($rc === TRUE) { 
     185                logger("Stored in cache: $translation => $original", 4); 
     186            } 
     187        } 
     188 
     189        logger("Exit: $original", 3); 
     190        return $original; 
    128191    } 
    129192 
  • trunk/WordPress/plugin/transposh/wp/transposh_options.php

    r387 r406  
    6767//Option to enable/disable default language translation @since 0.3.6 
    6868define("ENABLE_SEARCH_TRANSLATE", "enable_search_translate"); 
     69//Option to enable/disable url translation @since 0.5.3 
     70define("ENABLE_URL_TRANSLATE", "enable_url_translate"); 
    6971//Option to enable/disable rewrite of permalinks 
    7072define("ENABLE_PERMALINKS", "enable_permalinks"); 
     
    165167     * Get a user sorted language list 
    166168     * @since 0.3.9 
    167      * @return array sorted list of languages, pointing to names and flags  
     169     * @return array sorted list of languages, pointing to names and flags 
    168170     */ 
    169171    function get_sorted_langs() { 
     
    216218        if (!isset($this->options[ENABLE_SEARCH_TRANSLATE])) return 1; // default is true 
    217219        return $this->options[ENABLE_SEARCH_TRANSLATE]; 
     220    } 
     221 
     222    function get_enable_url_translate() { 
     223        return $this->options[ENABLE_URL_TRANSLATE]; 
    218224    } 
    219225 
     
    343349    } 
    344350 
     351    function set_enable_url_translate($val) { 
     352        $val = ($val) ? 1 : 0; 
     353        $this->set_value($val, $this->options[ENABLE_URL_TRANSLATE]); 
     354    } 
     355 
    345356    function set_enable_auto_translate($val) { 
    346357        $val = ($val) ? 1 : 0; 
  • trunk/WordPress/plugin/transposh/wp/transposh_widget.php

    r355 r406  
    126126 
    127127        //remove any language identifier 
    128         $clean_page_url = cleanup_url($page_url,$this->transposh->home_url, true); 
     128            $clean_page_url = cleanup_url($page_url,$this->transposh->home_url, true); 
     129        if ($this->transposh->options->get_enable_url_translate()) { 
     130            $clean_page_url = get_original_url($clean_page_url,$this->transposh->target_language,array($this->transposh->database,'fetch_original')); 
     131        } 
    129132        logger ("WIDGET: clean page url: $clean_page_url ,orig: $page_url"); 
    130133 
     
    144147                            ($this->transposh->options->is_default_language($code))) { 
    145148                        logger ("code = ".$code,5); 
    146                         $page_url = rewrite_url_lang_param($clean_page_url,$this->transposh->home_url,$this->transposh->enable_permalinks_rewrite, $code, $this->transposh->edit_mode); 
     149                        if ($this->transposh->options->get_enable_url_translate()) { 
     150                            $page_url = translate_url($clean_page_url, '',$code,array(&$this->transposh->database,'fetch_translation')); 
     151                        } else { 
     152                            $page_url = $clean_page_url; 
     153                        } 
     154                        $page_url = rewrite_url_lang_param($page_url,$this->transposh->home_url,$this->transposh->enable_permalinks_rewrite, $code, $this->transposh->edit_mode); 
    147155                        if ($this->transposh->options->is_default_language($code)) { 
    148156                            $page_url = $clean_page_url; 
Note: See TracChangeset for help on using the changeset viewer.