googletranslate

googletranslate.inc

  1. <?php
  2. // vim:filetype=php expandtab tabstop=2 softtabstop=2 shiftwidth=2 autoindent smartindent
  3. // $Id$
  4.  
  5. function tribune_googletranslate_info() {
  6.   return t('Translates messages.');
  7. }
  8.  
  9. function tribune_googletranslate_filter(&$post) {
  10.   $answer = array(
  11.     'info' => variable_get('tribune_googletranslate_name', "Translator"),
  12.   );
  13.  
  14.   if (variable_get('tribune_googletranslate_authentified', FALSE)) {
  15.     $answer['login'] = $answer['info'];
  16.   }
  17.  
  18.   if (preg_match(':^/'. t('translate') .'(.*)$:', $post['message'], $matches)) {
  19.     $args = $matches[1];
  20.  
  21.     if (preg_match(':\s([a-zA-Z-]+)\s([a-zA-Z-]+)\s(.*)$:', $args, $matches)) {
  22.       $from = $matches[1];
  23.       $to   = $matches[2];
  24.       $text = $matches[3];
  25.  
  26.       if (preg_match("/((([01]?[0-9])|(2[0-3])):([0-5][0-9])(:([0-5][0-9]))?([:\^][0-9]|¹|²|³)?(@[0-9A-Za-z]+)?)/", $text, $matches)) {
  27.         $answers = array();
  28.  
  29.         $posts = tribune_get_posts_from_clock($matches[1]);
  30.  
  31.         if (count($posts) == 0) {
  32.           $answer['message'] = t("Could not find referenced post: !clock", array('!clock' => $matches[1]));
  33.         } else {
  34.           foreach ($posts as $id) {
  35.             $answer = array(
  36.               'info' => variable_get('tribune_googletranslate_name', "Translator"),
  37.             );
  38.             if (variable_get('tribune_googletranslate_authentified', FALSE)) {
  39.               $answer['login'] = $answer['info'];
  40.             }
  41.  
  42.             $ref_post = tribune_get_post($id);
  43.  
  44.             $response = _tribune_googletranslate_translate_text($from, $to, $ref_post['message']);
  45.  
  46.             if ($response['error']) {
  47.               $answer['message'] = t("Could not translate text: !text", array("!text" => $response['error']));
  48.             } else {
  49.               $answer['message'] = $response['text'];
  50.  
  51.               if (count($posts) > 1) {
  52.                 $answer['message'] = format_clock($ref_post['clock'], $ref_post['post_rank']) ." ". $answer['message'];
  53.               }
  54.             }
  55.  
  56.             $answer['message'] = tribune_filters_print_clock($post) ." ". $answer['message'];
  57.             $answers[] = $answer;
  58.           }
  59.  
  60.           return $answers;
  61.         }
  62.       } else {
  63.         $response = _tribune_googletranslate_translate_text($from, $to, $text);
  64.       }
  65.  
  66.       if ($response['error']) {
  67.         $answer['message'] = t("Could not translate text: !text", array("!text" => $response['error']));
  68.       } else {
  69.         $answer['message'] = $response['text'];
  70.       }
  71.     } else {
  72.       $answer['message'] = t("Bad syntax, syntax is: /translate from to text");
  73.     }
  74.  
  75.     $answer['message'] = tribune_filters_print_clock($post) ." ". $answer['message'];
  76.     return array($answer);
  77.   }
  78. }
  79.  
  80. function tribune_googletranslate_help() {
  81.   $user = array_shift(user_load_self(array()));
  82.   $help = 'Type "/'. t('translate') .' <em>from</em> <em>to</em> <em>text</em>" to translate <em>text</em>.';
  83.   return $help;
  84. }
  85.  
  86. function _tribune_googletranslate_translate_text($from, $to, $text) {
  87.   $url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=". urlencode($text) ."&langpair=". urlencode($from) ."%7C". urlencode($to);
  88.   if (variable_get("tribune_googletranslate_api_key", "")) {
  89.     $url .= "&key=". urlencode(variable_get("tribune_googletranslate_api_key", ""));
  90.   }
  91.  
  92.   $ch = curl_init();
  93.   curl_setopt($ch, CURLOPT_URL, $url);
  94.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  95.   curl_setopt($ch, CURLOPT_REFERER, url("tribune"));
  96.   $result = curl_exec($ch);
  97.  
  98.   if (function_exists("json_decode")) {
  99.     $result = json_decode($result);
  100.  
  101.     if ($result->responseStatus == 200) {
  102.       return array('error' => FALSE, 'text' => html_entity_decode($result->responseData->translatedText, ENT_QUOTES, 'UTF-8'));
  103.     } else {
  104.       return array('error' => html_entity_decode($result->responseDetails, ENT_QUOTES, 'UTF-8'));
  105.     }
  106.   } else {
  107.     // let's try to parse it by hand anyway
  108.     $result = str_replace('\u0026', '&', $result);
  109.  
  110.     if (preg_match('/"translatedText" *: *"([^"]*)"/', $result, $matches)) {
  111.       return array('error' => FALSE, 'text' => html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'));
  112.     } else if (preg_match('/"responseDetails" *: *"([^"]*)"/', $result, $matches)) {
  113.       return array('error' => html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'));
  114.     } else {
  115.       return array('error' => t("Could not parse Google response (server is lacking <tt>json_decode</tt>)"));
  116.     }
  117.   }
  118. }
  119.  
  120. function tribune_googletranslate_settings() {
  121.   $form = array();
  122.  
  123.   $form['tribune_googletranslate_name'] = array(
  124.     '#type'           => "textfield",
  125.     '#title'          => t("Display name"),
  126.     '#default_value'  => variable_get('tribune_googletranslate_name', "Translator"),
  127.   );
  128.  
  129.   $form['tribune_googletranslate_authentified'] = array(
  130.     '#type'           => "checkbox",
  131.     '#title'          => t("Appear to be authentified"),
  132.     '#default_value'  => variable_get('tribune_googletranslate_authentified', FALSE),
  133.     '#description'    => t("Whether this filter will appear to be 'anonymous' or 'authentified'. Since the filter does not correspond to a real user, posting as authentified may result in 'nickname collisions'."),
  134.   );
  135.  
  136.   $form['tribune_googletranslate_api_key'] = array(
  137.     '#type'           => "textfield",
  138.     '#title'          => t("Google API key"),
  139.     '#default_value'  => variable_get('tribune_googletranslate_api_key', ""),
  140.     '#description'    => t("Your site's application key. Google prefers that you provide it, but it is not required."),
  141.   );
  142.  
  143.   return system_settings_form($form);
  144. }
  145.  
  146. function tribune_googletranslate_get_available_languages() {
  147.   $languages = array();
  148.  
  149.   $languages["de"] = "German";
  150.   $languages["en"] = "English";
  151.   $languages["ar"] = "Arabic";
  152.   $languages["bg"] = "Bulgarian";
  153.   $languages["ca"] = "Catalan";
  154.   $languages["zh-CN"] = "Chinese (simplified)";
  155.   $languages["zh-TW"] = "Chinese (traditional)";
  156.   $languages["ko"] = "Korean";
  157.   $languages["hr"] = "Croatian";
  158.   $languages["da"] = "Danish";
  159.   $languages["es"] = "Spanish";
  160.   $languages["fi"] = "Finnish";
  161.   $languages["fr"] = "French";
  162.   $languages["el"] = "Greek";
  163.   $languages["iw"] = "Hebrew";
  164.   $languages["hi"] = "Hindi";
  165.   $languages["id"] = "Indonesian";
  166.   $languages["it"] = "Italian";
  167.   $languages["ja"] = "Japanese";
  168.   $languages["lv"] = "Latvian";
  169.   $languages["lt"] = "Lituanian";
  170.   $languages["nl"] = "Dutch";
  171.   $languages["no"] = "Norvegian";
  172.   $languages["pl"] = "Polish";
  173.   $languages["pt"] = "Portugese";
  174.   $languages["ro"] = "Romanian";
  175.   $languages["ru"] = "Russian";
  176.   $languages["sr"] = "Serbian";
  177.   $languages["sk"] = "Slovak";
  178.   $languages["sl"] = "Slovenian";
  179.   $languages["sv"] = "Swedish";
  180.   $languages["tl"] = "Filipino";
  181.   $languages["cs"] = "Czesh";
  182.   $languages["uk"] = "Ukrainian";
  183.   $languages["vi"] = "Vietnamese";
  184.  
  185.   $strings[] = "";
  186.   foreach ($languages as $code => $name) {
  187.     $strings[] = $code ." (". t($name) .")";
  188.   }
  189.  
  190.   return implode(", ", $strings);
  191. }
  192.