WatsonTranslateEndpoint.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Text;
  6. using SimpleJSON;
  7. using UnityEngine;
  8. using XUnity.AutoTranslator.Plugin.Core;
  9. using XUnity.AutoTranslator.Plugin.Core.Configuration;
  10. using XUnity.AutoTranslator.Plugin.Core.Constants;
  11. using XUnity.AutoTranslator.Plugin.Core.Endpoints;
  12. using XUnity.AutoTranslator.Plugin.Core.Endpoints.Www;
  13. using XUnity.AutoTranslator.Plugin.Core.Extensions;
  14. using XUnity.AutoTranslator.Plugin.Core.Utilities;
  15. using XUnity.AutoTranslator.Plugin.Core.Web;
  16. namespace WatsonTranslate
  17. {
  18. internal class WatsonTranslateEndpoint : WwwEndpoint
  19. {
  20. private static readonly HashSet<string> SupportedLanguagePairs = new HashSet<string> { "ar-en", "ca-es", "zh-en", "zh-TW-en", "cs-en", "da-en", "nl-en", "en-ar", "en-cs", "en-da", "en-de", "en-es", "en-fi", "en-fr", "en-hi", "en-it", "en-ja", "en-ko", "en-nb", "en-nl", "en-pl", "en-pt", "en-ru", "en-sv", "en-tr", "en-zh", "en-zh-TW", "fi-en", "fr-de", "fr-en", "fr-es", "de-en", "de-fr", "de-it", "hi-en", "hu-en", "it-de", "it-en", "ja-en", "ko-en", "nb-en", "pl-en", "pt-en", "ru-en", "es-ca", "es-en", "es-fr", "sv-en", "tr-en" };
  21. private static readonly string RequestTemplate = "{{\"text\":[\"{2}\"],\"model_id\":\"{0}-{1}\"}}";
  22. private string _fullUrl;
  23. private string _url;
  24. private string _key;
  25. public WatsonTranslateEndpoint()
  26. {
  27. }
  28. public override string Id => "WatsonTranslate";
  29. public override string FriendlyName => "Watson Language Translator";
  30. public override void Initialize( IInitializationContext context )
  31. {
  32. _url = context.GetOrCreateSetting( "Watson", "Url", "" );
  33. _key = context.GetOrCreateSetting( "Watson", "Key", "" );
  34. if( string.IsNullOrEmpty( _url ) ) throw new Exception( "The WatsonTranslate endpoint requires a url which has not been provided." );
  35. if( string.IsNullOrEmpty( _key ) ) throw new Exception( "The WatsonTranslate endpoint requires a key which has not been provided." );
  36. _fullUrl = _url.TrimEnd( '/' ) + "/v3/translate?version=2018-05-01";
  37. var model = context.SourceLanguage + "-" + context.DestinationLanguage;
  38. if( !SupportedLanguagePairs.Contains( model ) ) throw new Exception( $"The language model '{model}' is not supported." );
  39. }
  40. public override void OnCreateRequest( IWwwRequestCreationContext context )
  41. {
  42. var request = new WwwRequestInfo(
  43. _fullUrl,
  44. string.Format(
  45. RequestTemplate,
  46. context.SourceLanguage,
  47. context.DestinationLanguage,
  48. TextHelper.EscapeJson( context.UntranslatedText ) ) );
  49. request.Headers[ "User-Agent" ] = string.IsNullOrEmpty( AutoTranslatorSettings.UserAgent ) ? "curl/7.55.1" : AutoTranslatorSettings.UserAgent;
  50. request.Headers[ "Accept" ] = "application/json";
  51. request.Headers[ "Content-Type" ] = "application/json";
  52. request.Headers[ "Authorization" ] = "Basic " + Convert.ToBase64String( Encoding.ASCII.GetBytes( "apikey:" + _key ) );
  53. context.Complete( request );
  54. }
  55. public override void OnExtractTranslation( IWwwTranslationExtractionContext context )
  56. {
  57. var data = context.ResponseData;
  58. var obj = JSON.Parse( data );
  59. var lineBuilder = new StringBuilder( data.Length );
  60. foreach( JSONNode entry in obj.AsObject[ "translations" ].AsArray )
  61. {
  62. var token = entry.AsObject[ "translation" ].ToString();
  63. token = token.Substring( 1, token.Length - 2 ).UnescapeJson();
  64. if( !lineBuilder.EndsWithWhitespaceOrNewline() ) lineBuilder.Append( "\n" );
  65. lineBuilder.Append( token );
  66. }
  67. var translated = lineBuilder.ToString();
  68. context.Complete( translated );
  69. }
  70. }
  71. }