Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/I2/Loc/GoogleTranslation.cs
2026-02-21 16:45:37 +08:00

179 lines
5.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using UnityEngine;
namespace I2.Loc
{
public static class GoogleTranslation
{
public static bool CanTranslate()
{
return LocalizationManager.Sources.Count > 0 && !string.IsNullOrEmpty(LocalizationManager.GetWebServiceURL());
}
public static void Translate(string text, string LanguageCodeFrom, string LanguageCodeTo, Action<string> OnTranslationReady)
{
WWW translationWWW = GetTranslationWWW(text, LanguageCodeFrom, LanguageCodeTo);
CoroutineManager.pInstance.StartCoroutine(WaitForTranslation(translationWWW, OnTranslationReady, text));
}
private static IEnumerator WaitForTranslation(WWW www, Action<string> OnTranslationReady, string OriginalText)
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.LogError(www.error);
OnTranslationReady(string.Empty);
}
else
{
string obj = ParseTranslationResult(www.text, OriginalText);
OnTranslationReady(obj);
}
}
public static string ForceTranslate(string text, string LanguageCodeFrom, string LanguageCodeTo)
{
WWW translationWWW = GetTranslationWWW(text, LanguageCodeFrom, LanguageCodeTo);
while (!translationWWW.isDone)
{
}
if (!string.IsNullOrEmpty(translationWWW.error))
{
Debug.LogError("-- " + translationWWW.error);
return string.Empty;
}
return ParseTranslationResult(translationWWW.text, text);
}
public static WWW GetTranslationWWW(string text, string LanguageCodeFrom, string LanguageCodeTo)
{
LanguageCodeFrom = GoogleLanguages.GetGoogleLanguageCode(LanguageCodeFrom);
LanguageCodeTo = GoogleLanguages.GetGoogleLanguageCode(LanguageCodeTo);
if (TitleCase(text) == text && text.ToUpper() != text)
{
text = text.ToLower();
}
string url = string.Format("{0}?action=Translate&list={1}:{2}={3}", LocalizationManager.GetWebServiceURL(), LanguageCodeFrom, LanguageCodeTo, Uri.EscapeUriString(text));
return new WWW(url);
}
public static string ParseTranslationResult(string html, string OriginalText)
{
try
{
string text = html;
if (TitleCase(OriginalText) == OriginalText && OriginalText.ToUpper() != OriginalText)
{
text = TitleCase(text);
}
return text;
}
catch (Exception ex)
{
Debug.LogError(ex.Message);
return string.Empty;
}
}
public static void Translate(List<TranslationRequest> requests, Action<List<TranslationRequest>> OnTranslationReady)
{
WWW translationWWW = GetTranslationWWW(requests);
CoroutineManager.pInstance.StartCoroutine(WaitForTranslation(translationWWW, OnTranslationReady, requests));
}
public static WWW GetTranslationWWW(List<TranslationRequest> requests)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(LocalizationManager.GetWebServiceURL());
stringBuilder.Append("?action=Translate&list=");
bool flag = true;
foreach (TranslationRequest request in requests)
{
if (!flag)
{
stringBuilder.Append("<I2Loc>");
}
stringBuilder.Append(request.LanguageCode);
stringBuilder.Append(":");
for (int i = 0; i < request.TargetLanguagesCode.Length; i++)
{
if (i != 0)
{
stringBuilder.Append(",");
}
stringBuilder.Append(request.TargetLanguagesCode[i]);
}
stringBuilder.Append("=");
string stringToEscape = ((!(TitleCase(request.Text) == request.Text)) ? request.Text : request.Text.ToLowerInvariant());
stringBuilder.Append(Uri.EscapeUriString(stringToEscape));
flag = false;
}
string url = stringBuilder.ToString();
return new WWW(url);
}
private static IEnumerator WaitForTranslation(WWW www, Action<List<TranslationRequest>> OnTranslationReady, List<TranslationRequest> requests)
{
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Debug.LogError(www.error);
OnTranslationReady(requests);
}
else
{
ParseTranslationResult(www.text, requests);
OnTranslationReady(requests);
}
}
public static string ParseTranslationResult(string html, List<TranslationRequest> requests)
{
if (html.StartsWith("<!DOCTYPE html>") || html.StartsWith("<HTML>"))
{
return "There was a problem contacting the WebService. Please try again later";
}
string[] array = html.Split(new string[1] { "<I2Loc>" }, StringSplitOptions.None);
string[] separator = new string[1] { "<i2>" };
for (int i = 0; i < Mathf.Min(requests.Count, array.Length); i++)
{
TranslationRequest value = requests[i];
value.Results = array[i].Split(separator, StringSplitOptions.None);
if (TitleCase(value.Text) == value.Text)
{
for (int j = 0; j < value.Results.Length; j++)
{
value.Results[j] = TitleCase(value.Results[j]);
}
}
requests[i] = value;
}
return string.Empty;
}
public static string UppercaseFirst(string s)
{
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
char[] array = s.ToLower().ToCharArray();
array[0] = char.ToUpper(array[0]);
return new string(array);
}
public static string TitleCase(string s)
{
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s);
}
}
}