func (vs *verifyStrings) isTemplatedStringTranslationInvalid(stringInfo common.I18nStringInfo) bool { if !common.IsTemplatedString(stringInfo.ID) || !common.IsTemplatedString(stringInfo.Translation) { return false } translationArgs := common.GetTemplatedStringArgs(stringInfo.Translation) argsMap := make(map[string]string) for _, translationArg := range translationArgs { argsMap[translationArg] = translationArg } var missingArgs []string idArgs := common.GetTemplatedStringArgs(stringInfo.ID) for _, idArg := range idArgs { if _, ok := argsMap[idArg]; !ok { missingArgs = append(missingArgs, idArg) } } if len(missingArgs) > 0 { vs.Println("i18n4go: templated string is invalid, missing args in translation:", strings.Join(missingArgs, ",")) return true } return false }
func (rp *rewritePackage) wrapMultiArgsCallExpr(callExpr *ast.CallExpr) { for i, arg := range callExpr.Args { if basicLit, ok := arg.(*ast.BasicLit); ok { if basicLit.Kind == token.STRING { valueWithoutQuotes, _ := strconv.Unquote(basicLit.Value) //basicLit.Value[1 : len(basicLit.Value)-1] if common.IsTemplatedString(valueWithoutQuotes) { rp.wrapCallExprWithTemplatedT(basicLit, callExpr, i) } else if common.IsInterpolatedString(valueWithoutQuotes) { rp.wrapCallExprWithInterpolatedT(basicLit, callExpr, i) } else { rp.wrapExprArgs(callExpr.Args) } } else { rp.wrapExprArgs(callExpr.Args) } } } }
func (vs *verifyStrings) verify(inputFilename string, targetFilename string) error { common.CheckFile(targetFilename) inputI18nStringInfos, err := common.LoadI18nStringInfos(inputFilename) if err != nil { vs.Println("i18n4go: Error loading the i18n strings from input filename:", inputFilename) return err } if len(inputI18nStringInfos) == 0 { return fmt.Errorf("i18n4go: Error input file: %s is empty", inputFilename) } inputMap, err := common.CreateI18nStringInfoMap(inputI18nStringInfos) if err != nil { return fmt.Errorf("File has duplicated key: %s\n%s", inputFilename, err) } targetI18nStringInfos, err := common.LoadI18nStringInfos(targetFilename) if err != nil { vs.Println("i18n4go: Error loading the i18n strings from target filename:", targetFilename) return err } var targetExtraStringInfos, targetInvalidStringInfos []common.I18nStringInfo for _, stringInfo := range targetI18nStringInfos { if _, ok := inputMap[stringInfo.ID]; ok { if common.IsTemplatedString(stringInfo.ID) && vs.isTemplatedStringTranslationInvalid(stringInfo) { vs.Println("i18n4go: WARNING target file has invalid templated translations with key ID: ", stringInfo.ID) targetInvalidStringInfos = append(targetInvalidStringInfos, stringInfo) } delete(inputMap, stringInfo.ID) } else { vs.Println("i18n4go: WARNING target file has extra key with ID: ", stringInfo.ID) targetExtraStringInfos = append(targetExtraStringInfos, stringInfo) } } var verficationError error if len(targetExtraStringInfos) > 0 { vs.Println("i18n4go: WARNING target file contains total of extra keys:", len(targetExtraStringInfos)) diffFilename, err := vs.generateExtraKeysDiffFile(targetExtraStringInfos, targetFilename) if err != nil { vs.Println("i18n4go: ERROR could not create the diff file:", err) return err } vs.Println("i18n4go: generated diff file:", diffFilename) verficationError = fmt.Errorf("i18n4go: target file has extra i18n strings with IDs: %s", strings.Join(keysForI18nStringInfos(targetExtraStringInfos), ",")) } if len(targetInvalidStringInfos) > 0 { vs.Println("i18n4go: WARNING target file contains total of invalid translations:", len(targetInvalidStringInfos)) diffFilename, err := vs.generateInvalidTranslationDiffFile(targetInvalidStringInfos, targetFilename) if err != nil { vs.Println("i18n4go: ERROR could not create the diff file:", err) return err } vs.Println("i18n4go: generated diff file:", diffFilename) verficationError = fmt.Errorf("i18n4go: target file has invalid i18n strings with IDs: %s", strings.Join(keysForI18nStringInfos(targetInvalidStringInfos), ",")) } if len(inputMap) > 0 { vs.Println("i18n4go: ERROR input file does not match target file:", targetFilename) diffFilename, err := vs.generateMissingKeysDiffFile(valuesForI18nStringInfoMap(inputMap), targetFilename) if err != nil { vs.Println("i18n4go: ERROR could not create the diff file:", err) return err } vs.Println("i18n4go: generated diff file:", diffFilename) verficationError = fmt.Errorf("i18n4go: target file is missing i18n strings with IDs: %s", strings.Join(keysForI18nStringInfoMap(inputMap), ",")) } return verficationError }