protected function set($setting, $value)
 {
     $xml = new AlfredResult();
     $xml->setShared('uid', 'setting');
     $setLength = strlen($setting);
     $validOptionKeys = array_keys($this->validOptions);
     if (!in_array($setting, $validOptionKeys)) {
         // find valid options
         $valid = array_filter($validOptionKeys, function ($value) use($setting, $setLength) {
             return $setting == strtolower(substr($value, 0, $setLength));
         });
         if (count($valid) > 0) {
             foreach ($valid as $optionKey) {
                 $xml->addItem(array('title' => $this->validOptions[$optionKey], 'subtitle' => $optionKey, 'autocomplete' => $optionKey));
             }
         } else {
             $xml->addItem(array('title' => 'Unknown option ' . $value));
         }
     } else {
         $item = array('title' => $setting);
         if (empty($value)) {
             $item['subtitle'] = 'Current value = ' . $this->settings[$setting];
         } else {
             $trimmedValue = strtolower(trim($value));
             if ($trimmedValue == 'default') {
                 $trimmedValue = $this->defaultSettings[$setting];
             }
             if ($this->languages->isAvailable($trimmedValue)) {
                 $item['subtitle'] = 'New value = ' . $trimmedValue;
                 $item['arg'] = $setting . ':' . $trimmedValue;
             } else {
                 $requestedLanguages = explode(',', $trimmedValue);
                 $validLanguages = array();
                 foreach ($requestedLanguages as $languageKey) {
                     $trimmedKey = trim($languageKey);
                     if ($this->languages->isAvailable($trimmedKey)) {
                         $validLanguages[$trimmedKey] = $this->languages->map($trimmedKey);
                     }
                 }
                 if (count($validLanguages) > 0) {
                     $checkedValue = implode(',', array_keys($validLanguages));
                     $item['subtitle'] = 'New value = ' . implode(', ', $validLanguages) . ' (' . $checkedValue . ')';
                     $item['arg'] = $setting . ':' . $checkedValue;
                 } else {
                     $item['subtitle'] = 'Invalid value ' . $value;
                 }
             }
         }
         $xml->addItem($item);
     }
     return $xml;
 }
/**
 * The method that is called by Alfred
 *
 * @param string $request	User input string
 */
function googleTranslate($request, $languages = false)
{
    if ($languages) {
        list($sourceLanguage, $targetLanguage) = $languages;
        $phrase = $request;
    } else {
        list($phrase, $sourceLanguage, $targetLanguage) = parseRequest($request);
    }
    $url = 'http://translate.google.com/translate_a/t?client=p&text=' . urlencode($phrase) . '&hl=en-EN&sl=' . $sourceLanguage . '&tl=' . $targetLanguage . '&multires=1&ssel=0&tsel=0&sc=1&ie=UTF-8&oe=UTF-8';
    $userUrl = 'https://translate.google.com/#' . $sourceLanguage . '/' . $targetLanguage . '/' . urlencode($phrase);
    $defaults = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => true);
    $ch = curl_init();
    curl_setopt_array($ch, $defaults);
    $out = curl_exec($ch);
    curl_close($ch);
    $xml = new AlfredResult();
    $xml->setShared('uid', 'mtranslate');
    $iconFilename = 'Icons/' . $targetLanguage . '.png';
    if (!file_exists($iconFilename)) {
        $iconFilename = 'icon.png';
    }
    $xml->setShared('icon', $iconFilename);
    //$stderr = fopen('php://stderr', 'w');
    //fwrite($stderr, $out);
    //fclose($stderr);
    $json = json_decode($out);
    $sourceLanguage = $json->src;
    if (isset($json->dict)) {
        $googleResults = $json->dict[0]->entry;
        if (is_array($googleResults)) {
            foreach ($googleResults as $translatedData) {
                $xml->addItem(array('arg' => $userUrl . '|' . $translatedData->word, 'valid' => 'yes', 'title' => $translatedData->word . ' (' . languageMap($targetLanguage) . ')', 'subtitle' => implode(', ', $translatedData->reverse_translation) . ' (' . languageMap($sourceLanguage) . ')'));
            }
        }
    } elseif (isset($json->sentences)) {
        foreach ($json->sentences as $sentence) {
            $xml->addItem(array('arg' => $userUrl . '|' . $sentence->trans, 'valid' => 'yes', 'title' => $sentence->trans . ' (' . languageMap($targetLanguage) . ')', 'subtitle' => $sentence->orig . ' (' . languageMap($sourceLanguage) . ')'));
        }
    } else {
        $xml->addItem(array('title' => 'No results found'));
    }
    // var_dump($xml);
    echo $xml;
}
 protected function processGoogleResults(array $googleResults)
 {
     $xml = new AlfredResult();
     $xml->setShared('uid', 'mtranslate');
     foreach ($googleResults as $targetLanguage => $result) {
         $sourceLanguage = $result->src;
         if (isset($result->dict)) {
             $dictResults = $result->dict[0]->entry;
             if (is_array($dictResults)) {
                 foreach ($dictResults as $translatedData) {
                     $xml->addItem(array('arg' => $this->getUserURL($sourceLanguage, $targetLanguage, $translatedData->reverse_translation[0]) . '|' . $translatedData->word, 'valid' => 'yes', 'title' => $translatedData->word . ' (' . $this->languages->map($targetLanguage) . ')', 'subtitle' => implode(', ', $translatedData->reverse_translation) . ' (' . $this->languages->map($sourceLanguage) . ')', 'icon' => $this->getFlag($targetLanguage)));
                     //
                     // If more than one target language is set, break after the first entry
                     if (count($googleResults) > 1) {
                         break;
                     }
                 }
             }
         } elseif (isset($result->sentences)) {
             foreach ($result->sentences as $sentence) {
                 $xml->addItem(array('arg' => $this->getUserURL($sourceLanguage, $targetLanguage, $sentence->orig) . '|' . $sentence->trans, 'valid' => 'yes', 'title' => $sentence->trans . ' (' . $this->languages->map($targetLanguage) . ')', 'subtitle' => $sentence->orig . ' (' . $this->languages->map($sourceLanguage) . ')', 'icon' => $this->getFlag($targetLanguage)));
             }
         } else {
             $xml->addItem(array('title' => 'No results found'));
         }
     }
     return $xml;
 }