func()

in api/simultaneousinterpreter/translate_speech.go [81:133]


func (h *handler) translate(ctx context.Context, sourceLang, text string) (map[string]string, error) {
	sourceLangTag, err := language.Parse(strings.Split(sourceLang, "-")[0])
	if err != nil {
		return nil, hd.Errorf(ctx,
			http.StatusBadRequest,
			"invalid language code",
			"failed language.Parse: %w", err)
	}

	langs, err := h.getTranslateSupportedLanguages(ctx)
	if err != nil {
		return nil, hd.Wrapf("failed getTranslateSupportedLanguages: %w", err)
	}

	translations := map[string]string{}
	mu := &sync.Mutex{}

	eg := &errgroup.Group{}
	for _, lang := range langs {
		if sourceLangTag == lang.Tag {
			translations[lang.Name] = text

			continue
		}

		lang := lang
		eg.Go(func() error {
			resp, err := h.Translate.Translate(ctx, []string{text}, lang.Tag, &translate.Options{
				Source: sourceLangTag,
				Format: translate.Text,
			})
			if err != nil {
				return hd.Errorf(ctx,
					http.StatusInternalServerError,
					http.StatusText(http.StatusInternalServerError),
					"failed Translate.Translate: %w", err)
			}

			mu.Lock()
			defer mu.Unlock()

			translations[lang.Name] = resp[0].Text

			return nil
		})
	}

	if err := eg.Wait(); err != nil {
		return nil, hd.Wrapf("failed to translate: %w", err)
	}

	return translations, nil
}