【问题标题】:Google 翻译 Flash (SWF) 动作脚本
【发布时间】:2021-12-12 12:07:53
【问题描述】:

我们尝试在 Flash Professional CS6 的操作脚本中编写 Google 翻译,但它不起作用。

谁能帮忙?

代码不返回翻译结果。

代码:

private function translate(e)
{
var result_lv:LoadVars = new LoadVars();
result_lv.onLoad = function () {
var str:String = unescape(this);
var txtContent;
var translatedText:String = str.split('":"')[1].split('"}, ')[0];
if(translatedText != undefined)
txtContent.text = translatedText.split('r').join('n').split('"').join("'");
return txtContent.text;
}
var lorem_lv:LoadVars = new LoadVars();
var from:String = "fa";
var to:String = "en"
lorem_lv.v = "1.0";
lorem_lv.format = "text";
lorem_lv.q = e;
lorem_lv.langpair = from + "|" + to;
lorem_lv.sendAndLoad(" http://ajax.googleapis.com/ajax/services/language/translate ", result_lv, "GET");
}

代码解释:

样本

LoadVars.sendAndLoad( )

方法代码解释:

https://flylib.com/books/en/4.13.1.377/1/

================================================ =

编辑 1:

我编辑了我的代码:

我在主函数中添加了返回码,所以主函数有输出。

但该函数仍然没有返回任何翻译后的内容。

改进后的代码:

private function translate(e)
{
var result_lv:LoadVars = new LoadVars();
var txtContent;
result_lv.onLoad = function () {
var str:String = unescape(this);
var translatedText:String = str.split('":"')[1].split('"}, ')[0];
if(translatedText != undefined)
txtContent.text = translatedText.split('r').join('n').split('"').join("'");
return txtContent.text;
}
var lorem_lv:LoadVars = new LoadVars();
var from:String = "fa";
var to:String = "en"
lorem_lv.v = "1.0";
lorem_lv.format = "text";
lorem_lv.q = e;
lorem_lv.langpair = from + "|" + to;
lorem_lv.sendAndLoad(" http://ajax.googleapis.com/ajax/services/language/translate ", result_lv, "GET");
return txtContent.text;
}

================================================ =

编辑 2:

我们找到了一个可以正常返回翻译结果的有效 PHP 函数:

https://github.com/statickidz/php-google-translate-free/blob/1.1.1/src/GoogleTranslate.php

现在我们正在尝试在 Adob​​e Flash Professional CS6 的 Action Script 2 中加载 PHP 函数结果。

这里有一些关于如何做到这一点的解释:

Flash calling a PHP function

================================================ =

编辑 3:

一本关于 PHP for Flash 的好书:

基础 PHP for Flash 第 1 版:

https://www.amazon.com/Foundation-PHP-Flash-Steve-Webster/dp/1903450160

================================================ =

编辑 4:

其他一些关于 PHP for Flash 的优秀且完整的书籍:

基础 PHP 5 for Flash 第 1 版:

https://www.amazon.com/Foundation-PHP-Flash-David-Powers/dp/B0096EPX7Q

用于 Flash 的高级 PHP 第 1 版。版本:

https://www.amazon.com/Advanced-PHP-Flash-Steve-Webster/dp/1590591879

================================================ =

编辑 5:

我们重写了现在使用 PHP GoogleTranslate 函数的动作脚本函数。

请看下面的答案。

但它不返回翻译结果。

有人可以帮忙吗?

谢谢

【问题讨论】:

  • 您尝试在浏览器或 Postman 中执行此 GET 请求吗?也许此 API 不再可用,或者您需要 Google 的令牌才能使用它?
  • 我尝试在浏览器中加载的 SWF 对象中使用此 GET 请求。该 API 是 Google Translate 的 v1,不需要来自 google 的密钥。但版本 2 需要来自 google 的密钥。
  • 例如这个谷歌翻译 PHP 类在网络浏览器中工作:github.com/statickidz/php-google-translate-free/blob/1.1.1/src/… 我正在使用 Waterfox G3 和 Xampp 1.7.1 和 PHP 5.2.9 来测试这个脚本,它工作正常。但是在这里我们需要动作脚本才能工作。谢谢
  • 也许我们可以使用下页提到的这个工具来加载 php 函数结果在动作脚本中:stackoverflow.com/questions/3133266/…
  • 我们正在尝试在动作脚本中调用有效的 php 和 curl 函数。

标签: actionscript


【解决方案1】:

根据上一个答案的评论Action Script 2 代码改为:

function googletranslate(e:String):String
{
/*LoadVars send example*/
// init LoadVars Object
var lv:LoadVars = new LoadVars();
var result_lv:LoadVars = new LoadVars();
// set Variables
lv.sVar1 = "fa";
lv.sVar2 = "en";
lv.sVar3 = e;
// send and load variables
lv.sendAndLoad("google-translate-result.php?", result_lv, "POST");
return result_lv.lVarresult;
}

【讨论】:

    【解决方案2】:

    这是我们编写的代码:

    我们的函数是使用下面地址上的示例代码编写的:

    Easy way to bring a php variable on flash with AS2

    但它不返回翻译结果。当我将返回字符串值设置为 e 变量时,函数工作。但是当我将 return 设置为 $output 变量时,它不起作用。

    动作脚本 2 代码:

    function googletranslate(e:String):String
        {
            
    
            /*LoadVars send example*/
            // init LoadVars Object
            var lv:LoadVars = new LoadVars();
            
            // set Variables
            lv.sVar1 = "fa";
            lv.sVar2 = "en";
            lv.sVar3 = e;
            // define onLoad Callback
            lv.onLoad = onLoadCallBack;
            
            // send and load variables
            lv.sendAndLoad("google-translate-result.php?", lv, "POST");
            
            var $output;
            
            // onLoad Callback
            function onLoadCallBack(succes)
            {
                // if succes
                if(succes)
                {
                    // trace variables
                    $output = this.lVarresult;
                    
                }
                else
                {
                    // loading failed
                    $output = "Loading Error!!";
                }
            }
            return $output;
        }
    

    ================================================ ===============

    编辑:

    PHP (google-translate-result.php) 代码已更改:

    $_POST 更改为 $_GET,现在结果 php 代码正在通过使用此 url 自行工作:

    Server_URL/google-translate-result.php?sVar1=fa&sVar2=en&sVar3=%DA%A9%D8%AA%D8%A7%D8%A8%20%D8%AA%D8%B3%D8%AA

    但 ActionScript 仍然没有返回翻译结果。

    ================================================ ===============

    PHP 代码(google-translate-result.php):

    <?php
    require_once('GoogleTranslate.php');
    // get variables
        $var1 = $_GET['sVar1'];
        $var2 = $_GET['sVar2'];
        $var3 = $_GET['sVar3'];
        
        $result = GoogleTranslate::translate($var1,$var2,$var3);
        // send variables
        echo "&lVarresult=$result&";
    

    PHP 代码(GoogleTranslate.php):

    <?php
    
    /**
     * GoogleTranslate.class.php
     *
     * Class to talk with Google Translator for free.
     *
     * @package PHP Google Translate Free;
     * @category Translation
     * @author Adrián Barrio Andrés
     * @author Paris N. Baltazar Salguero <sieg.sb@gmail.com>
     * @copyright 2016 Adrián Barrio Andrés
     * @license https://opensource.org/licenses/GPL-3.0 GNU General Public License 3.0
     * @version 2.0
     * @link https://statickidz.com/
     */
    
    /**
     * Main class GoogleTranslate
     *
     * @package GoogleTranslate
     *
     */
    class GoogleTranslate
    {
    
        /**
         * Retrieves the translation of a text
         *
         * @param string $source
         *            Original language of the text on notation xx. For example: es, en, it, fr...
         * @param string $target
         *            Language to which you want to translate the text in format xx. For example: es, en, it, fr...
         * @param string $text
         *            Text that you want to translate
         *
         * @return string a simple string with the translation of the text in the target language
         */
        public static function translate($source, $target, $text)
        {
            // Request translation
            $response = self::requestTranslation($source, $target, $text);
    
            // Get translation text
            // $response = self::getStringBetween("onmouseout=\"this.style.backgroundColor='#fff'\">", "</span></div>", strval($response));
    
            // Clean translation
            $translation = self::getSentencesFromJSON($response);
    
            return $translation;
        }
    
        /**
         * Internal function to make the request to the translator service
         *
         * @internal
         *
         * @param string $source
         *            Original language taken from the 'translate' function
         * @param string $target
         *            Target language taken from the ' translate' function
         * @param string $text
         *            Text to translate taken from the 'translate' function
         *
         * @return object[] The response of the translation service in JSON format
         */
        protected static function requestTranslation($source, $target, $text)
        {
    
            // Google translate URL
            $url = "https://translate.google.com/translate_a/single?client=at&dt=t&dt=ld&dt=qca&dt=rm&dt=bd&dj=1&hl=es-ES&ie=UTF-8&oe=UTF-8&inputm=2&otf=2&iid=1dd3b944-fa62-4b55-b330-74909a99969e";
    
            $fields = array(
                'sl' => urlencode($source),
                'tl' => urlencode($target),
                'q' => urlencode($text)
            );
    
            // URL-ify the data for the POST
            $fields_string = "";
            foreach ($fields as $key => $value) {
                $fields_string .= $key . '=' . $value . '&';
            }
    
            rtrim($fields_string, '&');
    
            // Open connection
            $ch = curl_init();
    
            // Set the url, number of POST vars, POST data
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, count($fields));
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_USERAGENT, 'AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1');
    
            // Execute post
            $result = curl_exec($ch);
    
            // Close connection
            curl_close($ch);
    
            return $result;
        }
    
        /**
         * Dump of the JSON's response in an array
         *
         * @param string $json
         *            The JSON object returned by the request function
         *
         * @return string A single string with the translation
         */
        protected static function getSentencesFromJSON($json)
        {
            $sentencesArray = json_decode($json, true);
            $sentences = "";
    
            foreach ($sentencesArray["sentences"] as $s) {
                $sentences .= isset($s["trans"]) ? $s["trans"] : '';
            }
    
            return $sentences;
        }
    }
    

    【讨论】:

    • (1) 尝试将 $output 重命名为 output... (2) 为什么不只是 return this.lVarresult; 如果 lVarresult 是否正确? (3) 也许不要将您的 onLoadCallBack 函数困在另一个函数 (function googletranslate) 中,将它们作为单独的函数...
    • 谢谢。我在新答案中更改了 ActionScript 2 代码。
    【解决方案3】:

    PHP-script that you've mentioned in comments 中,作者使用链接https://translate.google.com/translate_a/single?... 与一些客户端身份验证数据,如iid,并将User-Agent 设置为Android 手机:

    curl_setopt($ch, CURLOPT_USERAGENT, 'AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1');
    

    我认为这个脚本试图伪装请求,就像它是从 Android 谷歌翻译应用发出的一样。

    但在您的 AcrionScript 代码中,您使用的是另一个 URL:

    lorem_lv.sendAndLoad(" http://ajax.googleapis.com/ajax/services/language/translate ", result_lv, "GET");
    

    这个简单的HTTP Google Translate API v1 已经很老了,already not available

    您可以按照此link 自行检查 - 它响应 404。

    【讨论】:

    • 谢谢。我已经编辑了我的问题:编辑 2
    • 我在问题中添加了一些关于 PHP for Flash 的优秀而完整的书籍。
    猜你喜欢
    • 2016-01-23
    • 2012-08-11
    • 2015-04-09
    • 2010-12-24
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多