Fix isoLangs generator
The isoLangs generator didn't detect a new set of languages which were
rencently added to Google Translate. This is because the
https://translate.google.com/translate_a/l?client=chrome endpoint no
longer returns the full list of languages.
Bug: translateselectedtext:8
Change-Id: If529a6001bc8c80db997e254249dbebd1245f1f3
diff --git a/tools/langs/langs.go b/tools/langs/langs.go
index acfb811..f7f3a2d 100644
--- a/tools/langs/langs.go
+++ b/tools/langs/langs.go
@@ -7,11 +7,14 @@
"log"
"net/http"
"os"
+ "regexp"
"strings"
)
const isoLangsFileName = "isoLangs.json"
+var initDataRe = regexp.MustCompile(`AF_initDataCallback\(.*data: ?(.+), ?sideChannel`)
+
type Language struct {
CodeName string `json:"-"`
Name string `json:"name"`
@@ -55,31 +58,43 @@
log.Fatalf("Couldn't unmarshal JSON file %v, error: %v", isoLangsFileName, err)
}
- resp, err := http.Get("http://translate.google.com/translate_a/l?client=chrome")
+ resp, err := http.Get("http://translate.google.com/")
if err != nil {
- log.Fatalf("Couldn't get current Google Translate languages from server, error: %v", err)
+ log.Fatalf("Couldn't get current Google Translate page from server, error: %v", err)
}
defer resp.Body.Close()
gTranslateRawData, err := ioutil.ReadAll(resp.Body)
if err != nil {
- log.Fatalf("Couldn't read body data from Google Translate languages request, error: %v", err)
+ log.Fatalf("Couldn't read body data from Google Translate request, error: %v", err)
}
- var gTranslateJson map[string]interface{}
- if err := json.Unmarshal(gTranslateRawData, &gTranslateJson); err != nil {
+ initDataMatches := initDataRe.FindSubmatch(gTranslateRawData)
+ if len(initDataMatches) < 2 {
+ log.Fatalln("Couldn't find languages information in Google Translate homepage.")
+ }
+ initDataRaw := initDataMatches[1]
+
+ var gTranslateJson []interface{}
+ if err := json.Unmarshal(initDataRaw, &gTranslateJson); err != nil {
log.Fatalf("Couldn't unmarshal JSON data from the Google Translate languages request, error: %v", err)
}
- gTranslateLangs := gTranslateJson["tl"].(map[string]interface{})
+ gTranslateLangs := gTranslateJson[1].([]interface{})
langs := make(map[string]Language, len(gTranslateLangs))
- for langCode, name := range gTranslateLangs {
+ for _, lang := range gTranslateLangs {
+ langSlice := lang.([]interface{})
+ if len(langSlice) < 2 {
+ log.Fatalln("A Google Translate language entry is malformed.")
+ }
+ langCode := langSlice[0].(string)
+ name := langSlice[1].(string)
isoLang, err := getLanguage(isoLangs, langCode)
if err != nil {
log.Fatalf("Didn't find language '%v' in isoLangs, error: %v", langCode, err)
}
- isoLang.Name = name.(string)
+ isoLang.Name = name
langs[langCode] = isoLang
}