mirror of
https://github.com/zxing/zxing.git
synced 2025-03-05 20:48:51 -08:00
Use new translate v2 API; v1 is deprecated and we should probably not have been encouraging people to access it automatically as it was apparently quite abused. v2 is for-pay; bring your own key. But, no more rate limiting.
git-svn-id: https://zxing.googlecode.com/svn/trunk@1977 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
8743bb6de2
commit
bfbcf2b796
|
@ -34,9 +34,11 @@ import java.io.FileFilter;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>A utility which auto-translates the English-language text in a directory of HTML documents using
|
* <p>A utility which auto-translates the English-language text in a directory of HTML documents using
|
||||||
|
@ -56,9 +58,11 @@ import java.util.Queue;
|
||||||
*/
|
*/
|
||||||
public final class HtmlAssetTranslator {
|
public final class HtmlAssetTranslator {
|
||||||
|
|
||||||
|
private static final Pattern COMMA = Pattern.compile(",");
|
||||||
|
|
||||||
private HtmlAssetTranslator() {}
|
private HtmlAssetTranslator() {}
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws IOException {
|
||||||
File assetsDir = new File(args[0]);
|
File assetsDir = new File(args[0]);
|
||||||
Collection<String> languagesToTranslate = parseLanguagesToTranslate(assetsDir, args[1]);
|
Collection<String> languagesToTranslate = parseLanguagesToTranslate(assetsDir, args[1]);
|
||||||
Collection<String> filesToTranslate = parseFilesToTranslate(args);
|
Collection<String> filesToTranslate = parseFilesToTranslate(args);
|
||||||
|
@ -71,6 +75,7 @@ public final class HtmlAssetTranslator {
|
||||||
Collection<String> languages = new ArrayList<String>();
|
Collection<String> languages = new ArrayList<String>();
|
||||||
if ("all".equals(languageArg)) {
|
if ("all".equals(languageArg)) {
|
||||||
FileFilter fileFilter = new FileFilter() {
|
FileFilter fileFilter = new FileFilter() {
|
||||||
|
@Override
|
||||||
public boolean accept(File file) {
|
public boolean accept(File file) {
|
||||||
return file.isDirectory() && file.getName().startsWith("html-") && !"html-en".equals(file.getName());
|
return file.isDirectory() && file.getName().startsWith("html-") && !"html-en".equals(file.getName());
|
||||||
}
|
}
|
||||||
|
@ -79,7 +84,7 @@ public final class HtmlAssetTranslator {
|
||||||
languages.add(languageDir.getName().substring(5));
|
languages.add(languageDir.getName().substring(5));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
languages.add(languageArg);
|
languages.addAll(Arrays.asList(COMMA.split(languageArg)));
|
||||||
}
|
}
|
||||||
return languages;
|
return languages;
|
||||||
}
|
}
|
||||||
|
@ -103,6 +108,7 @@ public final class HtmlAssetTranslator {
|
||||||
StringsResourceTranslator.translateString("Translated by Google Translate.", language);
|
StringsResourceTranslator.translateString("Translated by Google Translate.", language);
|
||||||
|
|
||||||
File[] sourceFiles = englishHtmlDir.listFiles(new FilenameFilter() {
|
File[] sourceFiles = englishHtmlDir.listFiles(new FilenameFilter() {
|
||||||
|
@Override
|
||||||
public boolean accept(File dir, String name) {
|
public boolean accept(File dir, String name) {
|
||||||
return name.endsWith(".html") && (filesToTranslate.isEmpty() || filesToTranslate.contains(name));
|
return name.endsWith(".html") && (filesToTranslate.isEmpty() || filesToTranslate.contains(name));
|
||||||
}
|
}
|
||||||
|
@ -128,7 +134,7 @@ public final class HtmlAssetTranslator {
|
||||||
} catch (ParserConfigurationException pce) {
|
} catch (ParserConfigurationException pce) {
|
||||||
throw new IllegalStateException(pce);
|
throw new IllegalStateException(pce);
|
||||||
} catch (SAXException sae) {
|
} catch (SAXException sae) {
|
||||||
throw new IOException(sae.toString());
|
throw new IOException(sae);
|
||||||
}
|
}
|
||||||
|
|
||||||
Element rootElement = document.getDocumentElement();
|
Element rootElement = document.getDocumentElement();
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.io.OutputStreamWriter;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -51,13 +52,12 @@ import java.util.regex.Pattern;
|
||||||
*/
|
*/
|
||||||
public final class StringsResourceTranslator {
|
public final class StringsResourceTranslator {
|
||||||
|
|
||||||
private static final long MIN_API_CALL_INTERVAL_MS = 10 * 1000L;
|
private static final String API_KEY = "INSERT-YOUR-KEY";
|
||||||
|
|
||||||
private static final Charset UTF8 = Charset.forName("UTF-8");
|
private static final Charset UTF8 = Charset.forName("UTF-8");
|
||||||
private static final Pattern ENTRY_PATTERN = Pattern.compile("<string name=\"([^\"]+)\".*>([^<]+)</string>");
|
private static final Pattern ENTRY_PATTERN = Pattern.compile("<string name=\"([^\"]+)\".*>([^<]+)</string>");
|
||||||
private static final Pattern STRINGS_FILE_NAME_PATTERN = Pattern.compile("values-(.+)");
|
private static final Pattern STRINGS_FILE_NAME_PATTERN = Pattern.compile("values-(.+)");
|
||||||
private static final Pattern TRANSLATE_RESPONSE_PATTERN = Pattern.compile(
|
private static final Pattern TRANSLATE_RESPONSE_PATTERN = Pattern.compile("translatedText\":\\s*\"([^\"]+)\"");
|
||||||
"\\{\"translatedText\":\"([^\"]+)\"\\}");
|
|
||||||
|
|
||||||
private static final String APACHE_2_LICENSE =
|
private static final String APACHE_2_LICENSE =
|
||||||
"<!--\n" +
|
"<!--\n" +
|
||||||
|
@ -82,8 +82,6 @@ public final class StringsResourceTranslator {
|
||||||
LANGUAGE_CODE_MASSAGINGS.put("zh-rTW", "zh-tw");
|
LANGUAGE_CODE_MASSAGINGS.put("zh-rTW", "zh-tw");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long nextAllowedAPICallTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
private StringsResourceTranslator() {}
|
private StringsResourceTranslator() {}
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
|
@ -94,6 +92,7 @@ public final class StringsResourceTranslator {
|
||||||
Collection<String> forceRetranslation = Arrays.asList(args).subList(1, args.length);
|
Collection<String> forceRetranslation = Arrays.asList(args).subList(1, args.length);
|
||||||
|
|
||||||
File[] translatedValuesDirs = resDir.listFiles(new FileFilter() {
|
File[] translatedValuesDirs = resDir.listFiles(new FileFilter() {
|
||||||
|
@Override
|
||||||
public boolean accept(File file) {
|
public boolean accept(File file) {
|
||||||
return file.isDirectory() && file.getName().startsWith("values-");
|
return file.isDirectory() && file.getName().startsWith("values-");
|
||||||
}
|
}
|
||||||
|
@ -178,35 +177,15 @@ public final class StringsResourceTranslator {
|
||||||
}
|
}
|
||||||
System.out.println(" Need translation for " + english);
|
System.out.println(" Need translation for " + english);
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
if (now < nextAllowedAPICallTime) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(nextAllowedAPICallTime - now);
|
|
||||||
} catch (InterruptedException ie) {
|
|
||||||
// continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nextAllowedAPICallTime = now + MIN_API_CALL_INTERVAL_MS;
|
|
||||||
|
|
||||||
URL translateURL = new URL(
|
URL translateURL = new URL(
|
||||||
"http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" +
|
"https://www.googleapis.com/language/translate/v2?key=" + API_KEY + "&q=" +
|
||||||
URLEncoder.encode(english, "UTF-8") +
|
URLEncoder.encode(english, "UTF-8") +
|
||||||
"&langpair=en%7C" + language);
|
"&source=en&target=" + language);
|
||||||
StringBuilder translateResult = new StringBuilder();
|
CharSequence translateResult = fetch(translateURL);
|
||||||
Reader in = null;
|
|
||||||
try {
|
|
||||||
in = new InputStreamReader(translateURL.openStream(), UTF8);
|
|
||||||
char[] buffer = new char[1024];
|
|
||||||
int charsRead;
|
|
||||||
while ((charsRead = in.read(buffer)) > 0) {
|
|
||||||
translateResult.append(buffer, 0, charsRead);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
quietClose(in);
|
|
||||||
}
|
|
||||||
Matcher m = TRANSLATE_RESPONSE_PATTERN.matcher(translateResult);
|
Matcher m = TRANSLATE_RESPONSE_PATTERN.matcher(translateResult);
|
||||||
if (!m.find()) {
|
if (!m.find()) {
|
||||||
System.err.println("No translate result");
|
System.err.println("No translate result");
|
||||||
|
System.err.println(translateResult);
|
||||||
return english;
|
return english;
|
||||||
}
|
}
|
||||||
String translation = m.group(1);
|
String translation = m.group(1);
|
||||||
|
@ -220,6 +199,24 @@ public final class StringsResourceTranslator {
|
||||||
return translation;
|
return translation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static CharSequence fetch(URL translateURL) throws IOException {
|
||||||
|
URLConnection connection = translateURL.openConnection();
|
||||||
|
connection.connect();
|
||||||
|
StringBuilder translateResult = new StringBuilder(200);
|
||||||
|
Reader in = null;
|
||||||
|
try {
|
||||||
|
in = new InputStreamReader(connection.getInputStream(), UTF8);
|
||||||
|
char[] buffer = new char[1024];
|
||||||
|
int charsRead;
|
||||||
|
while ((charsRead = in.read(buffer)) > 0) {
|
||||||
|
translateResult.append(buffer, 0, charsRead);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
quietClose(in);
|
||||||
|
}
|
||||||
|
return translateResult;
|
||||||
|
}
|
||||||
|
|
||||||
private static SortedMap<String,String> readLines(File file) throws IOException {
|
private static SortedMap<String,String> readLines(File file) throws IOException {
|
||||||
SortedMap<String,String> entries = new TreeMap<String,String>();
|
SortedMap<String,String> entries = new TreeMap<String,String>();
|
||||||
BufferedReader reader = null;
|
BufferedReader reader = null;
|
||||||
|
|
Loading…
Reference in a new issue