#!/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 %
TEXT
variable start_re = "
"; variable end_re = "
"; variable re = strcat (start_re, "\([^<]+\)"r, end_re); variable n = string_match (str, re, 1); if (n == 0) return ""; variable pos, match_len; (pos, match_len) = string_match_nth (1); str = substrbytes (str, pos+1, match_len); (str,) = strreplace (str, "\x01", "\n", strbytelen (str)); return str; } private define write_callback (vp, data) { @vp = strcat (@vp, data); return 0; } define babelfish (from, to, text) { variable c = curl_new ("http://babelfish.altavista.com/babelfish/tr?il=en"); variable postdata = strcat ("doit=done&urltext=", text, "&lp=", lookup_translation (from, to), "&Submit=Translate", "&enc=utf8"); curl_setopt (c, CURLOPT_POSTFIELDS, postdata); curl_setopt (c, CURLOPT_FOLLOWLOCATION); curl_setopt (c, CURLOPT_HTTPHEADER, ["User-Agent: S-Lang cURL Module", "Content-Type: application/x-www-form-urlencoded", "Accept-Charset: ISO-8859-1,utf-8" ]); text = ""; curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_callback, &text); curl_perform (c); text = parse_output (text); return text; } private define usage () { () = fprintf (stderr, "Usage: %s [--to lang-out] lang-in [phrase|-]\n", __argv[0]); exit (1); } define slsh_main () { variable lang_out = My_Language, lang_in = NULL; variable i = 1; while (i < __argc) { variable arg = __argv[i]; i++; if (arg == "--to") { if (i == __argc) usage (); lang_out = __argv[i]; i++; continue; } lang_in = arg; break; } if (lang_in == NULL) usage (); variable text = "-"; if (i == __argc) { if (isatty (stdin)) usage (); } else text = strjoin (__argv[[i:]], " "); if (text == "-") { text = ""; variable line; while (-1 != fgets (&line, stdin)) text = strcat (text, encode (line)); } message (babelfish (lang_in, lang_out, text)); }

AltStyle によって変換されたページ (->オリジナル) /