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:
srowen 2011-10-18 10:04:57 +00:00
parent 8743bb6de2
commit bfbcf2b796
2 changed files with 36 additions and 33 deletions

View file

@ -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();

View file

@ -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;