Преглед изворни кода

added baidu translate support

gravydevsupreme пре 7 година
родитељ
комит
3306d94c39

+ 45 - 19
src/XUnity.AutoTranslator.Plugin.Core/Configuration/Settings.cs

@@ -33,27 +33,53 @@ namespace XUnity.AutoTranslator.Plugin.Core.Configuration
       public static int MinDialogueChars;
       public static bool EnableSSL;
 
+      public static string BaiduAppId;
+      public static string BaiduAppSecret;
+
       public static void Configure()
       {
-         ServiceEndpoint = Config.Current.Preferences[ "AutoTranslator" ][ "Endpoint" ].GetOrDefault( KnownEndpointNames.GoogleTranslate, true );
-         Language = Config.Current.Preferences[ "AutoTranslator" ][ "Language" ].GetOrDefault( "en" );
-         FromLanguage = Config.Current.Preferences[ "AutoTranslator" ][ "FromLanguage" ].GetOrDefault( "ja", true );
-         Delay = Config.Current.Preferences[ "AutoTranslator" ][ "Delay" ].GetOrDefault( 0f );
-         TranslationDirectory = Config.Current.Preferences[ "AutoTranslator" ][ "Directory" ].GetOrDefault( @"Translation" );
-         OutputFile = Config.Current.Preferences[ "AutoTranslator" ][ "OutputFile" ].GetOrDefault( @"Translation\_AutoGeneratedTranslations.{lang}.txt" );
-         MaxCharactersPerTranslation = Config.Current.Preferences[ "AutoTranslator" ][ "MaxCharactersPerTranslation" ].GetOrDefault( 150 );
-         EnablePrintHierarchy = Config.Current.Preferences[ "AutoTranslator" ][ "EnablePrintHierarchy" ].GetOrDefault( false );
-
-         IgnoreWhitespaceInDialogue = Config.Current.Preferences[ "AutoTranslator" ][ "IgnoreWhitespaceInDialogue" ].GetOrDefault( true );
-         MinDialogueChars = Config.Current.Preferences[ "AutoTranslator" ][ "MinDialogueChars" ].GetOrDefault( 18 );
-
-         EnableIMGUI = Config.Current.Preferences[ "AutoTranslator" ][ "EnableIMGUI" ].GetOrDefault( true );
-         EnableUGUI = Config.Current.Preferences[ "AutoTranslator" ][ "EnableUGUI" ].GetOrDefault( true );
-         EnableNGUI = Config.Current.Preferences[ "AutoTranslator" ][ "EnableNGUI" ].GetOrDefault( true );
-         EnableTextMeshPro = Config.Current.Preferences[ "AutoTranslator" ][ "EnableTextMeshPro" ].GetOrDefault( true );
-         AllowPluginHookOverride = Config.Current.Preferences[ "AutoTranslator" ][ "AllowPluginHookOverride" ].GetOrDefault( true );
-
-         EnableSSL = Config.Current.Preferences[ "AutoTranslator" ][ "EnableSSL" ].GetOrDefault( false );
+         try
+         {
+            // clear configuration from old versions...
+            var section = Config.Current.Preferences[ "AutoTranslator" ];
+            foreach( var key in section.Keys.ToList() )
+            {
+               section.DeleteKey( key.Key );
+            }
+
+            Config.Current.Preferences.DeleteSection( "AutoTranslator" );
+         }
+         catch( Exception e )
+         {
+            Console.WriteLine( "[ERROR][XUnity.AutoTranslator]: An error occurred while removing legacy configuration. " + Environment.NewLine + e );
+         }
+
+
+
+         ServiceEndpoint = Config.Current.Preferences[ "Service" ][ "Endpoint" ].GetOrDefault( KnownEndpointNames.GoogleTranslate, true );
+         EnableSSL = Config.Current.Preferences[ "Service" ][ "EnableSSL" ].GetOrDefault( false );
+
+         Language = Config.Current.Preferences[ "General" ][ "Language" ].GetOrDefault( "en" );
+         FromLanguage = Config.Current.Preferences[ "General" ][ "FromLanguage" ].GetOrDefault( "ja", true );
+
+         TranslationDirectory = Config.Current.Preferences[ "Files" ][ "Directory" ].GetOrDefault( @"Translation" );
+         OutputFile = Config.Current.Preferences[ "Files" ][ "OutputFile" ].GetOrDefault( @"Translation\_AutoGeneratedTranslations.{lang}.txt" );
+
+         EnableIMGUI = Config.Current.Preferences[ "TextFrameworks" ][ "EnableIMGUI" ].GetOrDefault( true );
+         EnableUGUI = Config.Current.Preferences[ "TextFrameworks" ][ "EnableUGUI" ].GetOrDefault( true );
+         EnableNGUI = Config.Current.Preferences[ "TextFrameworks" ][ "EnableNGUI" ].GetOrDefault( true );
+         EnableTextMeshPro = Config.Current.Preferences[ "TextFrameworks" ][ "EnableTextMeshPro" ].GetOrDefault( true );
+         AllowPluginHookOverride = Config.Current.Preferences[ "TextFrameworks" ][ "AllowPluginHookOverride" ].GetOrDefault( true );
+
+         Delay = Config.Current.Preferences[ "Behaviour" ][ "Delay" ].GetOrDefault( 0f );
+         MaxCharactersPerTranslation = Config.Current.Preferences[ "Behaviour" ][ "MaxCharactersPerTranslation" ].GetOrDefault( 150 );
+         IgnoreWhitespaceInDialogue = Config.Current.Preferences[ "Behaviour" ][ "IgnoreWhitespaceInDialogue" ].GetOrDefault( true );
+         MinDialogueChars = Config.Current.Preferences[ "Behaviour" ][ "MinDialogueChars" ].GetOrDefault( 18 );
+
+         BaiduAppId = Config.Current.Preferences[ "Baidu" ][ "BaiduAppId" ].GetOrDefault( "" );
+         BaiduAppSecret = Config.Current.Preferences[ "Baidu" ][ "BaiduAppSecret" ].GetOrDefault( "" );
+         
+         EnablePrintHierarchy = Config.Current.Preferences[ "Debug" ][ "EnablePrintHierarchy" ].GetOrDefault( false );
 
          AutoTranslationsFilePath = Path.Combine( Config.Current.DataPath, OutputFile.Replace( "{lang}", Language ) );
 

+ 2 - 0
src/XUnity.AutoTranslator.Plugin.Core/Constants/KnownEndpointNames.cs

@@ -8,5 +8,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Constants
    public static class KnownEndpointNames
    {
       public const string GoogleTranslate = "GoogleTranslate";
+
+      public const string BaiduTranslate = "BaiduTranslate";
    }
 }

+ 18 - 3
src/XUnity.AutoTranslator.Plugin.Core/Extensions/StringExtensions.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Linq;
 using System.Text;
 using XUnity.AutoTranslator.Plugin.Core.Configuration;
@@ -64,6 +65,9 @@ namespace XUnity.AutoTranslator.Plugin.Core.Extensions
                   case '\\':
                      escapeWith = '\\';
                      break;
+                  case 'u':
+                     escapeWith = 'u';
+                     break;
                   default:
                      found = false;
                      break;
@@ -72,9 +76,20 @@ namespace XUnity.AutoTranslator.Plugin.Core.Extensions
                // remove previous char and go one back
                if( found )
                {
-                  // found proper escaping
-                  builder.Remove( --i, 2 );
-                  builder.Insert( i, escapeWith );
+                  if( escapeWith == 'u' )
+                  {
+                     // unicode crap, lets handle the next 4 characters manually
+                     int code = int.Parse( new string( new char[] { builder[ i + 1 ], builder[ i + 2 ], builder[ i + 3 ], builder[ i + 4 ] } ), NumberStyles.HexNumber );
+                     var replacingChar = (char)code;
+                     builder.Remove( --i, 6 );
+                     builder.Insert( i, replacingChar );
+                  }
+                  else
+                  {
+                     // found proper escaping
+                     builder.Remove( --i, 2 );
+                     builder.Insert( i, escapeWith );
+                  }
                }
                else
                {

+ 19 - 6
src/XUnity.AutoTranslator.Plugin.Core/Web/AutoTranslateClient.cs

@@ -45,9 +45,10 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 
       public static IEnumerator TranslateByWWW( string untranslated, string from, string to, Action<string> success, Action failure )
       {
-         var url = _endpoint.GetServiceUrl( WWW.EscapeURL( untranslated ), from, to );
+         var url = _endpoint.GetServiceUrl( untranslated, from, to );
          var headers = new Dictionary<string, string>();
          _endpoint.ApplyHeaders( headers );
+
          using( var www = new WWW( url, null, headers ) )
          {
             _runningTranslations++;
@@ -70,18 +71,30 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
             }
             else
             {
-               string translatedText = null;
                var text = www.text;
                if( text != null )
                {
                   try
                   {
-                     translatedText = _endpoint.ExtractTranslated( text ) ?? string.Empty;
+                     if( _endpoint.TryExtractTranslated( text, out var translatedText ) )
+                     {
+                        translatedText = translatedText ?? string.Empty;
+                        success( translatedText );
+                     }
+                     else
+                     {
+                        failure();
+                     }
+                  }
+                  catch
+                  {
+                     failure();
                   }
-                  catch { }
                }
-
-               success( translatedText );
+               else
+               {
+                  failure();
+               }
             }
          }
       }

+ 108 - 0
src/XUnity.AutoTranslator.Plugin.Core/Web/BaiduTranslateEndpoint.cs

@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Security.Cryptography;
+using System.Text;
+using SimpleJSON;
+using UnityEngine;
+using XUnity.AutoTranslator.Plugin.Core.Configuration;
+using XUnity.AutoTranslator.Plugin.Core.Constants;
+using XUnity.AutoTranslator.Plugin.Core.Extensions;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Web
+{
+   public class BaiduTranslateEndpoint : KnownEndpoint
+   {
+      private static ServicePoint ServicePoint;
+      private static readonly string HttpServicePointTemplateUrl = "http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}";
+      private static readonly string HttpsServicePointTemplateUrl = "https://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}";
+
+      private static readonly MD5 HashMD5 = MD5.Create();
+
+      public BaiduTranslateEndpoint()
+         : base( KnownEndpointNames.GoogleTranslate )
+      {
+
+      }
+
+      private static string CreateMD5( string input )
+      {
+         byte[] inputBytes = Encoding.UTF8.GetBytes( input );
+         byte[] hashBytes = HashMD5.ComputeHash( inputBytes );
+
+         StringBuilder sb = new StringBuilder();
+         for( int i = 0 ; i < hashBytes.Length ; i++ )
+         {
+            sb.Append( hashBytes[ i ].ToString( "X2" ) );
+         }
+         return sb.ToString().ToLower();
+      }
+
+      public override void ApplyHeaders( Dictionary<string, string> headers )
+      {
+         headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36";
+         headers[ "Accept-Charset" ] = "UTF-8";
+      }
+
+      public override void ApplyHeaders( WebHeaderCollection headers )
+      {
+         headers[ HttpRequestHeader.UserAgent ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36";
+         headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
+      }
+
+      public override void ConfigureServicePointManager()
+      {
+         try
+         {
+            ServicePoint = ServicePointManager.FindServicePoint( new Uri( "http://api.fanyi.baidu.com" ) );
+            ServicePoint.ConnectionLimit = 5;
+         }
+         catch
+         {
+         }
+      }
+
+      public override bool TryExtractTranslated( string result, out string translated )
+      {
+         try
+         {
+            if( result.StartsWith( "{\"error" ) )
+            {
+               translated = null;
+               return false;
+            }
+
+
+            var obj = JSON.Parse( result );
+            var lineBuilder = new StringBuilder( result.Length );
+
+            foreach( JSONNode entry in obj.AsObject[ "trans_result" ].AsArray )
+            {
+               var token = entry.AsObject[ "dst" ].ToString();
+               token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
+
+               if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( " " );
+
+               lineBuilder.Append( token );
+            }
+
+            translated = lineBuilder.ToString();
+            return true;
+         }
+         catch( Exception )
+         {
+            translated = null;
+            return false;
+         }
+      }
+
+      public override string GetServiceUrl( string untranslatedText, string from, string to )
+      {
+         string salt = DateTime.UtcNow.Millisecond.ToString();
+         var md5 = CreateMD5( Settings.BaiduAppId + untranslatedText + salt + Settings.BaiduAppSecret );
+
+         return string.Format( Settings.EnableSSL ? HttpsServicePointTemplateUrl : HttpServicePointTemplateUrl, WWW.EscapeURL( untranslatedText ), from, to, Settings.BaiduAppId, salt, md5 );
+      }
+   }
+}

+ 4 - 3
src/XUnity.AutoTranslator.Plugin.Core/Web/DefaultEndpoint.cs

@@ -35,14 +35,15 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          }
       }
 
-      public override string ExtractTranslated( string result )
+      public override bool TryExtractTranslated( string result, out string translated )
       {
-         return result;
+         translated = result;
+         return true;
       }
 
       public override string GetServiceUrl( string untranslatedText, string from, string to )
       {
-         return string.Format( ServicePointTemplateUrl, Identifier, from, to, untranslatedText );
+         return string.Format( ServicePointTemplateUrl, Identifier, from, to, WWW.EscapeURL( untranslatedText ) );
       }
    }
 }

+ 21 - 12
src/XUnity.AutoTranslator.Plugin.Core/Web/GoogleTranslateEndpoint.cs

@@ -56,27 +56,36 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          }
       }
 
-      public override string ExtractTranslated( string result )
+      public override bool TryExtractTranslated( string result, out string translated )
       {
-         var arr = JSON.Parse( result );
-         var lineBuilder = new StringBuilder( result.Length );
-
-         foreach( JSONNode entry in arr.AsArray[ 0 ].AsArray )
+         try
          {
-            var token = entry.AsArray[ 0 ].ToString();
-            token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
+            var arr = JSON.Parse( result );
+            var lineBuilder = new StringBuilder( result.Length );
 
-            if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( " " );
+            foreach( JSONNode entry in arr.AsArray[ 0 ].AsArray )
+            {
+               var token = entry.AsArray[ 0 ].ToString();
+               token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
 
-            lineBuilder.Append( token );
-         }
+               if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( " " );
+
+               lineBuilder.Append( token );
+            }
 
-         return lineBuilder.ToString();
+            translated = lineBuilder.ToString();
+            return true;
+         }
+         catch
+         {
+            translated = null;
+            return false;
+         }
       }
 
       public override string GetServiceUrl( string untranslatedText, string from, string to )
       {
-         return string.Format( Settings.EnableSSL ? HttpsServicePointTemplateUrl : HttpServicePointTemplateUrl, from, to, untranslatedText );
+         return string.Format( Settings.EnableSSL ? HttpsServicePointTemplateUrl : HttpServicePointTemplateUrl, from, to, WWW.EscapeURL( untranslatedText ) );
       }
    }
 }

+ 1 - 1
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownEndpoint.cs

@@ -23,6 +23,6 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 
       public abstract void ApplyHeaders( WebHeaderCollection headers );
 
-      public abstract string ExtractTranslated( string result );
+      public abstract bool TryExtractTranslated( string result, out string translated );
    }
 }

+ 3 - 0
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownEndpoints.cs

@@ -9,6 +9,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
    public static class KnownEndpoints
    {
       public static readonly KnownEndpoint GoogleTranslate = new GoogleTranslateEndpoint();
+      public static readonly KnownEndpoint BaiduTranslate = new BaiduTranslateEndpoint();
 
       public static KnownEndpoint FindEndpoint( string identifier )
       {
@@ -18,6 +19,8 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          {
             case KnownEndpointNames.GoogleTranslate:
                return GoogleTranslate;
+            case KnownEndpointNames.BaiduTranslate:
+               return BaiduTranslate;
             default:
                return new DefaultEndpoint( identifier );
          }