Skip to content

Commit

Permalink
Fix: translation issue on the webpage
Browse files Browse the repository at this point in the history
  • Loading branch information
fantakim committed Sep 3, 2024
1 parent bf169b0 commit 77d9ed1
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 70 deletions.
2 changes: 1 addition & 1 deletion PapagoSrt.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33723.286
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PapagoSrt", "PapagoSrt\PapagoSrt.csproj", "{3DE66D75-95CC-4E9E-BC82-876B01356080}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PapagoSrt", "PapagoSrt\PapagoSrt.csproj", "{3DE66D75-95CC-4E9E-BC82-876B01356080}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
76 changes: 42 additions & 34 deletions PapagoSrt/Form1.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Text;

namespace PapagoSrt
{
Expand Down Expand Up @@ -88,18 +89,14 @@ private async void btnStart_Click(object sender, EventArgs e)

btnStart.Enabled = false;

var backup = BackupClipboard();
using (var driver = Papago.CreateChromeDriver())
{
await System.Threading.Tasks.Task.Run(() =>
{
foreach (var task in pendingTasks)
{
var content = File.ReadAllText(task.Filename);
SetTextClipboard(content);
var translated = Papago.Translate(driver);
var contents = GetSrtChunks(task.Filename);
var translated = Papago.Translate(driver, contents);
if (translated.Length == 0)
{
task.SetStatus(TaskStatus.Failure);
Expand All @@ -114,7 +111,6 @@ await System.Threading.Tasks.Task.Run(() =>
});
}

RestoreClipboard(backup);
MessageBox.Show("작업이 완료 되었습니다", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

btnStart.Enabled = true;
Expand Down Expand Up @@ -165,39 +161,51 @@ private string AddSuffixToFileName(string filePath, string suffix)
return Path.Combine(directory, $"{fileName}{suffix}{extension}");
}

private Dictionary<string, object> BackupClipboard()
private static List<string> GetSrtChunks(string filePath, int maxCharacters = 3000)
{
var backup = new Dictionary<string, object>();
var dataObject = Clipboard.GetDataObject();
var formats = dataObject.GetFormats(false);
foreach (var format in formats)
{
backup.Add(format, dataObject.GetData(format, false));
}
var result = new List<string>();
var currentChunk = new StringBuilder();

return backup;
}

private void SetTextClipboard(string text)
{
var thread = new Thread(new ThreadStart(() =>
using (var reader = new StreamReader(filePath, Encoding.UTF8))
{
Clipboard.SetText(text);
}));
var line = string.Empty;
while ((line = reader.ReadLine()) != null)
{
if (currentChunk.Length + line.Length > maxCharacters)
{
if (currentChunk.Length > 0)
{
result.Add(currentChunk.ToString().TrimEnd());
currentChunk.Clear();
}

thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
if (line.Length > maxCharacters)
{
int lastNewLineIndex = line.LastIndexOf('\n', maxCharacters);
if (lastNewLineIndex == -1)
{
lastNewLineIndex = maxCharacters;
}
result.Add(line.Substring(0, lastNewLineIndex).TrimEnd());
}
else
{
currentChunk.Append(line + "\n");
}
}
else
{
currentChunk.Append(line + "\n");
}
}

private void RestoreClipboard(Dictionary<string, object> backup)
{
Clipboard.Clear();
if (currentChunk.Length > 0)
{
result.Add(currentChunk.ToString().TrimEnd());
}
}

backup.ToList().ForEach(x =>
{
Clipboard.SetData(x.Key, x.Value);
});
return result;
}
}
}
2 changes: 1 addition & 1 deletion PapagoSrt/Form1.resx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
Expand Down
60 changes: 26 additions & 34 deletions PapagoSrt/Papago.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using Keys = OpenQA.Selenium.Keys;
using SeleniumExtras.WaitHelpers;
using System.Text;

namespace PapagoSrt
{
Expand All @@ -25,46 +26,37 @@ public static ChromeDriver CreateChromeDriver()
return driver;
}

public static string Translate(ChromeDriver driver)
public static string Translate(ChromeDriver driver, IList<string> contents)
{
driver.Navigate().GoToUrl("https://main--venerable-zabaione-67b63d.netlify.app");
driver.Navigate().GoToUrl($"https://papago.naver.com/?sk=auto&tk=ko");

driver.WaitForFindElement(By.LinkText("파파고 번역 사이트")).Click();

var frame = driver.WaitForFindElement(By.Id("translatedFrame"));
driver.SwitchTo().Frame(frame);

var textarea = driver.WaitForFindElement(By.Id("mat-input-0"));
textarea.Clear();
textarea.SendKeys(Keys.Control + "v");

var saveButton = driver.WaitForFindElement(By.XPath("/html/body/app-root/div/section[1]/button"));
saveButton.Click();
try
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("btnTranslate")));
}
catch
{
throw new Exception("Webpage Timed out!");
}

var elements = driver.FindElements(By.XPath("//*[@papago-id]"));
var lastElement = elements.LastOrDefault();
if (lastElement == null)
return string.Empty;
var sourceTextbox = driver.FindElement(By.Id("txtSource"));
var targetTextbox = driver.FindElement(By.Id("txtTarget"));

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));
wait.Until(d => lastElement.GetAttribute("papago-translate") == "translated");
var translatedText = new StringBuilder();
foreach (var content in contents)
{
var script = $"var ele = `{content.Replace("`", "\\`")}`;document.getElementById('txtSource').value=ele;";
((IJavaScriptExecutor)driver).ExecuteScript(script);
sourceTextbox.SendKeys(" ");

var result = driver.WaitForFindElement(By.ClassName("result"));
return result.Text;
}
}
Thread.Sleep(2000);

public static class WebDriverExtensions
{
public static IWebElement WaitForFindElement(this IWebDriver driver, By by, int timeoutInSeconds = 5)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
if (wait.Until(x => x.FindElement(by).Displayed))
{
return driver.FindElement(by);
var translated = targetTextbox.Text;
translatedText.Append(translated);
}

return null;
return translatedText.ToString();
}
}
}
1 change: 1 addition & 0 deletions PapagoSrt/PapagoSrt.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="DotNetSeleniumExtras.WaitHelpers" Version="3.11.0" />
<PackageReference Include="Selenium.Support" Version="4.16.2" />
<PackageReference Include="Selenium.WebDriver" Version="4.16.2" />
</ItemGroup>
Expand Down

0 comments on commit 77d9ed1

Please sign in to comment.