#!/usr/bin/env slsh require ("curl"); private variable My_Language = "English"; private variable Supported_Translations = ["zh_en", "zt_en", "en_zh", "en_zt", "en_nl", "en_fr", "en_de", "en_el", "en_it", "en_ja", "en_ko", "en_pt", "en_ru", "en_es", "nl_en", "nl_fr", "fr_en", "fr_de", "fr_el", "fr_it", "fr_pt", "fr_nl", "fr_es", "de_en", "de_fr", "el_en", "el_fr", "it_en", "it_fr", "ja_en", "ko_en", "pt_en", "pt_fr", "ru_en", "es_en", "es_fr"]; private variable Languages = Assoc_Type[String_Type]; private define add_language (lang, desc) { Languages[strlow(lang)] = strlow (desc); } add_language ("zh", "Chinese-simple"); add_language ("zt", "Chinese-traditional"); add_language ("en", "English"); add_language ("nl", "Dutch"); add_language ("fr", "French"); add_language ("de", "German"); add_language ("el", "Greek"); add_language ("it", "Italian"); add_language ("ja", "Japanese"); add_language ("ko", "Korean"); add_language ("pt", "Portugese"); add_language ("ru", "Russian"); add_language ("es", "Spanish"); private define lookup_language (lang) { lang = strlow (lang); if (assoc_key_exists (Languages, lang)) return lang; variable vals = assoc_get_values (Languages); variable i = where (vals == lang); if (length (i) == 0) throw NotImplementedError, "Language $lang is unknown or unsupported"$; return assoc_get_keys (Languages)[i[0]]; } private define lookup_translation (from, to) { variable trans = sprintf ("%s_%s", lookup_language (from), lookup_language(to)); if (any (Supported_Translations == trans)) return trans; throw NotImplementedError, "Translating from $from to $to is not supported"$; } private define make_encode_table () { variable table = array_map (String_Type, &sprintf, ("%%%02X", [0:255])); variable ok = [['A':'Z'], ['a':'z'], ['0':'9'], '.', '-', '*', '_', '/', '~']; table[ok] = array_map (String_Type, &char, ok); table[' '] = "+"; return table; } private variable Encode_Table = make_encode_table (); private define encode (text) { variable len = strlen (text); variable new_text = String_Type[len]; variable i; _for i (0, len-1, 1) new_text[i] = Encode_Table[text[i]]; return strjoin (new_text, ""); } private define parse_output (str) { (str,) = strreplace (str, "\n", "\x01", strbytelen (str)); % Look for TEXT in %