Переглянути джерело

fixed gtrans legit with proper json parsing

Scrublord1336 6 роки тому
батько
коміт
ca00f8476a

+ 47 - 0
src/XUnity.AutoTranslator.Plugin.Core/Extensions/StringExtensions.cs

@@ -289,5 +289,52 @@ namespace XUnity.AutoTranslator.Plugin.Core.Extensions
 
          return builder.ToString();
       }
+
+      public static string EscapeJson( this string str )
+      {
+         if( str == null || str.Length == 0 )
+         {
+            return "";
+         }
+
+         char c;
+         int len = str.Length;
+         StringBuilder sb = new StringBuilder( len + 4 );
+         for( int i = 0 ; i < len ; i += 1 )
+         {
+            c = str[ i ];
+            switch( c )
+            {
+               case '\\':
+               case '"':
+                  sb.Append( '\\' );
+                  sb.Append( c );
+                  break;
+               case '/':
+                  sb.Append( '\\' );
+                  sb.Append( c );
+                  break;
+               case '\b':
+                  sb.Append( "\\b" );
+                  break;
+               case '\t':
+                  sb.Append( "\\t" );
+                  break;
+               case '\n':
+                  sb.Append( "\\n" );
+                  break;
+               case '\f':
+                  sb.Append( "\\f" );
+                  break;
+               case '\r':
+                  sb.Append( "\\r" );
+                  break;
+               default:
+                  sb.Append( c );
+                  break;
+            }
+         }
+         return sb.ToString();
+      }
    }
 }

+ 41 - 39
src/XUnity.AutoTranslator.Plugin.Core/Web/GoogleTranslateLegitimateEndpoint.cs

@@ -37,18 +37,21 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
       {
          try
          {
-            var obj = JsonUtility.FromJson<GResponse>( result );
-            var translations = obj?.data?.translations;
-            if( translations != null && translations.Count > 0 )
-            {
-               translated = translations[ 0 ]?.translatedText;
-               return true;
-            }
-            else
+            var obj = JSON.Parse( result );
+            var lineBuilder = new StringBuilder( result.Length );
+
+            foreach( JSONNode entry in obj.AsObject[ "data" ].AsObject[ "translations" ].AsArray )
             {
-               translated = string.Empty;
-               return true;
+               var token = entry.AsObject[ "translatedText" ].ToString();
+               token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
+
+               if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
+
+               lineBuilder.Append( token );
             }
+
+            translated = lineBuilder.ToString();
+            return true;
          }
          catch
          {
@@ -64,13 +67,14 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 
       public override string GetRequestObject( string untranslatedText, string from, string to )
       {
-         return JsonUtility.ToJson( new GRequest
-         {
-            q = untranslatedText,
-            target = to,
-            source = from,
-            format = "text"
-         } );
+         var b = new StringBuilder();
+         b.Append( "{" );
+         b.Append( "\"q\":\"" ).Append( untranslatedText.EscapeJson() ).Append( "\"," );
+         b.Append( "\"target\":\"" ).Append( to ).Append( "\"," );
+         b.Append( "\"source\":\"" ).Append( from ).Append( "\"," );
+         b.Append( "\"format\":\"text\"" );
+         b.Append( "}" );
+         return b.ToString();
       }
 
       public override bool ShouldGetSecondChanceAfterFailure()
@@ -78,32 +82,30 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          return false;
       }
    }
+   
+   //public class GRequest
+   //{
+   //   public string q { get; set; }
 
-   [Serializable]
-   public class GRequest
-   {
-      public string q { get; set; }
+   //   public string target { get; set; }
 
-      public string target { get; set; }
+   //   public string source { get; set; }
 
-      public string source { get; set; }
+   //   public string format { get; set; }
+   //}
 
-      public string format { get; set; }
-   }
+   //public class GResponse
+   //{
+   //   public GData data { get; set; }
+   //}
 
-   public class GResponse
-   {
-      public GData data { get; set; }
-   }
-
-   public class GData
-   {
-      public List<GTranslation> translations { get; set; }
-   }
-
-   public class GTranslation
-   {
-      public string translatedText { get; set; }
-   }
+   //public class GData
+   //{
+   //   public List<GTranslation> translations { get; set; }
+   //}
 
+   //public class GTranslation
+   //{
+   //   public string translatedText { get; set; }
+   //}
 }

+ 2 - 2
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownHttpEndpoint.cs

@@ -8,7 +8,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
    public abstract class KnownHttpEndpoint : IKnownEndpoint
    {
-      private static readonly TimeSpan MaxUnusedLifespan = TimeSpan.FromSeconds( 25 );
+      private static readonly TimeSpan MaxUnusedLifespan = TimeSpan.FromSeconds( 50 );
 
       private ServicePoint[] _servicePoints;
       private bool _isBusy = false;
@@ -127,7 +127,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          if( !_isBusy && _clientLastUse.HasValue && DateTime.UtcNow - _clientLastUse > MaxUnusedLifespan && !_client.IsBusy
             && _servicePoints != null && _servicePoints.Length > 0 )
          {
-            Logger.Current.Debug( "Closing service points because they were not used for 25 seconds." );
+            Logger.Current.Debug( "Closing service points because they were not used for 50 seconds." );
 
             _isBusy = true;
             _clientLastUse = null;