Albirew/nyaa-pantsu
Albirew
/
nyaa-pantsu
Archivé
1
0
Bifurcation 0

Replace 'en-us' literals with the default language

This consolidates the places where a default language has to be set.

- Removed import of the 'userService' package into the 'languages' util
  package
  This was required to prevent a cyclic import between the two packages.
- Added a 'UserRetriever' interface to read the language setting of users
  inside the 'languages' package
Cette révision appartient à :
Atvaark 2017-05-14 21:45:50 +02:00
Parent 953f67f18e
révision cd844aec45
18 fichiers modifiés avec 102 ajouts et 56 suppressions

Voir le fichier

@ -33,13 +33,12 @@ type Config struct {
I2P *I2PConfig `json:"i2p"`
// filesize fetcher config
FilesizeFetcher FilesizeFetcherConfig `json:"filesize_fetcher"`
// internationalization config
// internationalization config
I18n I18nConfig `json:"i18n"`
}
var Defaults = Config{"localhost", 9999, "sqlite3", "./nyaa.db?cache_size=50", "default", DefaultScraperConfig, DefaultCacheConfig, DefaultSearchConfig, nil, DefaultFilesizeFetcherConfig, DefaultI18nConfig}
var allowedDatabaseTypes = map[string]bool{
"sqlite3": true,
"postgres": true,

Voir le fichier

@ -7,5 +7,5 @@ type I18nConfig struct {
var DefaultI18nConfig = I18nConfig{
TranslationsDirectory: "translations",
DefaultLanguage: "en-us", // TODO: Remove refs to "en-us" from the code and templates
DefaultLanguage: "en-us",
}

Voir le fichier

@ -15,6 +15,7 @@ import (
"github.com/ewhal/nyaa/router"
"github.com/ewhal/nyaa/service/scraper"
"github.com/ewhal/nyaa/service/torrent/filesizeFetcher"
"github.com/ewhal/nyaa/service/user"
"github.com/ewhal/nyaa/util/languages"
"github.com/ewhal/nyaa/util/log"
"github.com/ewhal/nyaa/util/search"
@ -124,7 +125,7 @@ func main() {
if err != nil {
log.Fatal(err.Error())
}
err = languages.InitI18n(conf.I18n)
err = languages.InitI18n(conf.I18n, userService.NewCurrentUserRetriever())
if err != nil {
log.Fatal(err.Error())
}

Voir le fichier

@ -15,7 +15,7 @@ type LanguagesJSONResponse struct {
}
func SeeLanguagesHandler(w http.ResponseWriter, r *http.Request) {
_, Tlang := languages.GetTfuncAndLanguageFromRequest(r, "en-us")
_, Tlang := languages.GetTfuncAndLanguageFromRequest(r)
availableLanguages := languages.GetAvailableLanguages()
format := r.URL.Query().Get("format")
@ -28,7 +28,7 @@ func SeeLanguagesHandler(w http.ResponseWriter, r *http.Request) {
}
} else {
clv := ChangeLanguageVariables{NewSearchForm(), Navigation{}, Tlang.Tag, availableLanguages, GetUser(r), r.URL, mux.CurrentRoute(r)}
languages.SetTranslationFromRequest(changeLanguageTemplate, r, "en-us")
languages.SetTranslationFromRequest(changeLanguageTemplate, r)
err := changeLanguageTemplate.ExecuteTemplate(w, "index.html", clv)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)

Voir le fichier

@ -8,7 +8,7 @@ import (
)
func FaqHandler(w http.ResponseWriter, r *http.Request) {
languages.SetTranslationFromRequest(faqTemplate, r, "en-us")
languages.SetTranslationFromRequest(faqTemplate, r)
err := faqTemplate.ExecuteTemplate(w, "index.html", FaqTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)

Voir le fichier

@ -56,7 +56,7 @@ func HomeHandler(w http.ResponseWriter, r *http.Request) {
navigationTorrents := Navigation{nbTorrents, maxPerPage, pagenum, "search_page"}
languages.SetTranslationFromRequest(homeTemplate, r, "en-us")
languages.SetTranslationFromRequest(homeTemplate, r)
htv := HomeTemplateVariables{b, NewSearchForm(), navigationTorrents, GetUser(r), r.URL, mux.CurrentRoute(r)}
err = homeTemplate.ExecuteTemplate(w, "index.html", htv)

Voir le fichier

@ -106,7 +106,6 @@ func NewPanelSearchForm() SearchForm {
return form
}
func IndexModPanel(w http.ResponseWriter, r *http.Request) {
currentUser := GetUser(r)
if userPermission.HasAdmin(currentUser) {
@ -117,7 +116,7 @@ func IndexModPanel(w http.ResponseWriter, r *http.Request) {
comments, _ := commentService.GetAllComments(offset, 0, "", "")
torrentReports, _, _ := reportService.GetAllTorrentReports(offset, 0)
languages.SetTranslationFromRequest(panelIndex, r, "en-us")
languages.SetTranslationFromRequest(panelIndex, r)
htv := PanelIndexVbs{torrents, model.TorrentReportsToJSON(torrentReports), users, comments, NewPanelSearchForm(), currentUser, r.URL}
err := panelIndex.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err)
@ -150,7 +149,7 @@ func TorrentsListPanel(w http.ResponseWriter, r *http.Request) {
ShowItemsPerPage: true,
}
languages.SetTranslationFromRequest(panelTorrentList, r, "en-us")
languages.SetTranslationFromRequest(panelTorrentList, r)
htv := PanelTorrentListVbs{torrents, searchForm, Navigation{int(searchParam.Max), offset, pagenum, "mod_tlist_page"}, currentUser, r.URL}
err = panelTorrentList.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err)
@ -180,7 +179,7 @@ func TorrentReportListPanel(w http.ResponseWriter, r *http.Request) {
torrentReports, nbReports, _ := reportService.GetAllTorrentReports(offset, (pagenum-1)*offset)
reportJSON := model.TorrentReportsToJSON(torrentReports)
languages.SetTranslationFromRequest(panelTorrentReportList, r, "en-us")
languages.SetTranslationFromRequest(panelTorrentReportList, r)
htv := PanelTorrentReportListVbs{reportJSON, NewSearchForm(), Navigation{nbReports, offset, pagenum, "mod_trlist_page"}, currentUser, r.URL}
err = panelTorrentReportList.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err)
@ -207,7 +206,7 @@ func UsersListPanel(w http.ResponseWriter, r *http.Request) {
offset := 100
users, nbUsers := userService.RetrieveUsersForAdmin(offset, (pagenum-1)*offset)
languages.SetTranslationFromRequest(panelUserList, r, "en-us")
languages.SetTranslationFromRequest(panelUserList, r)
htv := PanelUserListVbs{users, NewSearchForm(), Navigation{nbUsers, offset, pagenum, "mod_ulist_page"}, currentUser, r.URL}
err = panelUserList.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err)
@ -241,7 +240,7 @@ func CommentsListPanel(w http.ResponseWriter, r *http.Request) {
}
comments, nbComments := commentService.GetAllComments(offset, (pagenum-1)*offset, conditions, values...)
languages.SetTranslationFromRequest(panelCommentList, r, "en-us")
languages.SetTranslationFromRequest(panelCommentList, r)
htv := PanelCommentListVbs{comments, NewSearchForm(), Navigation{nbComments, offset, pagenum, "mod_clist_page"}, currentUser, r.URL}
err = panelCommentList.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err)
@ -256,7 +255,7 @@ func TorrentEditModPanel(w http.ResponseWriter, r *http.Request) {
if userPermission.HasAdmin(currentUser) {
id := r.URL.Query().Get("id")
torrent, _ := torrentService.GetTorrentById(id)
languages.SetTranslationFromRequest(panelTorrentEd, r, "en-us")
languages.SetTranslationFromRequest(panelTorrentEd, r)
torrentJson := torrent.ToJSON()
uploadForm := NewUploadForm()
@ -302,7 +301,7 @@ func TorrentPostEditModPanel(w http.ResponseWriter, r *http.Request) {
infos["infos"] = append(infos["infos"], "Torrent details updated.")
}
}
languages.SetTranslationFromRequest(panelTorrentEd, r, "en-us")
languages.SetTranslationFromRequest(panelTorrentEd, r)
htv := PanelTorrentEdVbs{uploadForm, NewPanelSearchForm(), currentUser, err, infos, r.URL}
err_ := panelTorrentEd.ExecuteTemplate(w, "admin_index.html", htv)
log.CheckError(err_)
@ -364,7 +363,7 @@ func TorrentReassignModPanel(w http.ResponseWriter, r *http.Request) {
http.Error(w, "admins only", http.StatusForbidden)
return
}
languages.SetTranslationFromRequest(panelTorrentReassign, r, "en-us")
languages.SetTranslationFromRequest(panelTorrentReassign, r)
htv := PanelTorrentReassignVbs{ReassignForm{}, NewPanelSearchForm(), currentUser, form.NewErrors(), form.NewInfos(), r.URL}
err := panelTorrentReassign.ExecuteTemplate(w, "admin_index.html", htv)

Voir le fichier

@ -10,7 +10,7 @@ import (
func NotFoundHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
languages.SetTranslationFromRequest(notFoundTemplate, r, "en-us")
languages.SetTranslationFromRequest(notFoundTemplate, r)
err := notFoundTemplate.ExecuteTemplate(w, "index.html", NotFoundTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)

Voir le fichier

@ -44,7 +44,7 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
}
htv := HomeTemplateVariables{b, searchForm, navigationTorrents, GetUser(r), r.URL, mux.CurrentRoute(r)}
languages.SetTranslationFromRequest(searchTemplate, r, "en-us")
languages.SetTranslationFromRequest(searchTemplate, r)
err = searchTemplate.ExecuteTemplate(w, "index.html", htv)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)

Voir le fichier

@ -1,13 +1,15 @@
package router
import (
"github.com/ewhal/nyaa/service/user/permission"
"github.com/nicksnyder/go-i18n/i18n"
"html/template"
"log"
"math"
"net/url"
"strconv"
"github.com/ewhal/nyaa/service/user/permission"
"github.com/ewhal/nyaa/util/languages"
"github.com/nicksnyder/go-i18n/i18n"
)
var FuncMap = template.FuncMap{
@ -92,6 +94,7 @@ var FuncMap = template.FuncMap{
},
"T": i18n.IdentityTfunc,
"Ts": i18n.IdentityTfunc,
"getDefaultLanguage": languages.GetDefaultLanguage,
"getAvatar": func(hash string, size int) string {
return "https://www.gravatar.com/avatar/" + hash + "?s=" + strconv.Itoa(size)
},

Voir le fichier

@ -80,7 +80,7 @@ func UploadHandler(w http.ResponseWriter, r *http.Request) {
htv := UploadTemplateVariables{uploadForm, NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
languages.SetTranslationFromRequest(uploadTemplate, r, "en-us")
languages.SetTranslationFromRequest(uploadTemplate, r)
err := uploadTemplate.ExecuteTemplate(w, "index.html", htv)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)

Voir le fichier

@ -22,7 +22,7 @@ func UserRegisterFormHandler(w http.ResponseWriter, r *http.Request) {
b := form.RegistrationForm{}
modelHelper.BindValueForm(&b, r)
b.CaptchaID = captcha.GetID()
languages.SetTranslationFromRequest(viewRegisterTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewRegisterTemplate, r)
htv := UserRegisterTemplateVariables{b, form.NewErrors(), NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
err := viewRegisterTemplate.ExecuteTemplate(w, "index.html", htv)
if err != nil {
@ -38,7 +38,7 @@ func UserLoginFormHandler(w http.ResponseWriter, r *http.Request) {
b := form.LoginForm{}
modelHelper.BindValueForm(&b, r)
languages.SetTranslationFromRequest(viewLoginTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewLoginTemplate, r)
htv := UserLoginFormVariables{b, form.NewErrors(), NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
err := viewLoginTemplate.ExecuteTemplate(w, "index.html", htv)
@ -65,14 +65,14 @@ func UserProfileHandler(w http.ResponseWriter, r *http.Request) {
if errUser != nil {
err["errors"] = append(err["errors"], errUser.Error())
}
languages.SetTranslationFromRequest(viewUserDeleteTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewUserDeleteTemplate, r)
htv := UserVerifyTemplateVariables{err, NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
errorTmpl := viewUserDeleteTemplate.ExecuteTemplate(w, "index.html", htv)
if errorTmpl != nil {
http.Error(w, errorTmpl.Error(), http.StatusInternalServerError)
}
} else {
T := languages.SetTranslationFromRequest(viewProfileTemplate, r, "en-us")
T := languages.SetTranslationFromRequest(viewProfileTemplate, r)
if follow != nil {
infosForm["infos"] = append(infosForm["infos"], fmt.Sprintf(T("user_followed_msg"), userProfile.Username))
}
@ -87,7 +87,7 @@ func UserProfileHandler(w http.ResponseWriter, r *http.Request) {
}
}
} else {
languages.SetTranslationFromRequest(notFoundTemplate, r, "en-us")
languages.SetTranslationFromRequest(notFoundTemplate, r)
err := notFoundTemplate.ExecuteTemplate(w, "index.html", NotFoundTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@ -105,7 +105,7 @@ func UserDetailsHandler(w http.ResponseWriter, r *http.Request) {
if userPermission.CurrentOrAdmin(currentUser, userProfile.ID) {
b := form.UserForm{}
modelHelper.BindValueForm(&b, r)
languages.SetTranslationFromRequest(viewProfileEditTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewProfileEditTemplate, r)
availableLanguages := languages.GetAvailableLanguages()
htv := UserProfileEditVariables{&userProfile, b, form.NewErrors(), form.NewInfos(), availableLanguages, NewSearchForm(), Navigation{}, currentUser, r.URL, mux.CurrentRoute(r)}
err := viewProfileEditTemplate.ExecuteTemplate(w, "index.html", htv)
@ -114,12 +114,12 @@ func UserDetailsHandler(w http.ResponseWriter, r *http.Request) {
}
}
} else {
languages.SetTranslationFromRequest(notFoundTemplate, r, "en-us")
languages.SetTranslationFromRequest(notFoundTemplate, r)
err := notFoundTemplate.ExecuteTemplate(w, "index.html", NotFoundTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
}
}
// Getting View User Profile Update
@ -133,7 +133,7 @@ func UserProfileFormHandler(w http.ResponseWriter, r *http.Request) {
b := form.UserForm{}
err := form.NewErrors()
infos := form.NewInfos()
T := languages.SetTranslationFromRequest(viewProfileEditTemplate, r, "en-us")
T := languages.SetTranslationFromRequest(viewProfileEditTemplate, r)
if len(r.PostFormValue("email")) > 0 {
_, err = form.EmailValidation(r.PostFormValue("email"), err)
}
@ -173,14 +173,14 @@ func UserProfileFormHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, errorTmpl.Error(), http.StatusInternalServerError)
}
} else {
languages.SetTranslationFromRequest(notFoundTemplate, r, "en-us")
languages.SetTranslationFromRequest(notFoundTemplate, r)
err := notFoundTemplate.ExecuteTemplate(w, "index.html", NotFoundTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
} else {
languages.SetTranslationFromRequest(notFoundTemplate, r, "en-us")
languages.SetTranslationFromRequest(notFoundTemplate, r)
err := notFoundTemplate.ExecuteTemplate(w, "index.html", NotFoundTemplateVariables{Navigation{}, NewSearchForm(), GetUser(r), r.URL, mux.CurrentRoute(r)})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@ -209,7 +209,7 @@ func UserRegisterPostHandler(w http.ResponseWriter, r *http.Request) {
err["errors"] = append(err["errors"], errorUser.Error())
}
if len(err) == 0 {
languages.SetTranslationFromRequest(viewRegisterSuccessTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewRegisterSuccessTemplate, r)
u := model.User{
Email: r.PostFormValue("email"), // indicate whether user had email set
}
@ -224,7 +224,7 @@ func UserRegisterPostHandler(w http.ResponseWriter, r *http.Request) {
}
if len(err) > 0 {
b.CaptchaID = captcha.GetID()
languages.SetTranslationFromRequest(viewRegisterTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewRegisterTemplate, r)
htv := UserRegisterTemplateVariables{b, err, NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
errorTmpl := viewRegisterTemplate.ExecuteTemplate(w, "index.html", htv)
if errorTmpl != nil {
@ -241,7 +241,7 @@ func UserVerifyEmailHandler(w http.ResponseWriter, r *http.Request) {
if errEmail != nil {
err["errors"] = append(err["errors"], errEmail.Error())
}
languages.SetTranslationFromRequest(viewVerifySuccessTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewVerifySuccessTemplate, r)
htv := UserVerifyTemplateVariables{err, NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
errorTmpl := viewVerifySuccessTemplate.ExecuteTemplate(w, "index.html", htv)
if errorTmpl != nil {
@ -259,7 +259,7 @@ func UserLoginPostHandler(w http.ResponseWriter, r *http.Request) {
_, errorUser := userService.CreateUserAuthentication(w, r)
if errorUser != nil {
err["errors"] = append(err["errors"], errorUser.Error())
languages.SetTranslationFromRequest(viewLoginTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewLoginTemplate, r)
htv := UserLoginFormVariables{b, err, NewSearchForm(), Navigation{}, GetUser(r), r.URL, mux.CurrentRoute(r)}
errorTmpl := viewLoginTemplate.ExecuteTemplate(w, "index.html", htv)
if errorTmpl != nil {

Voir le fichier

@ -34,7 +34,7 @@ func ViewHandler(w http.ResponseWriter, r *http.Request) {
}
htv := ViewTemplateVariables{b, captchaID, NewSearchForm(), Navigation{}, user, r.URL, mux.CurrentRoute(r)}
languages.SetTranslationFromRequest(viewTemplate, r, "en-us")
languages.SetTranslationFromRequest(viewTemplate, r)
err = viewTemplate.ExecuteTemplate(w, "index.html", htv)
if err != nil {
log.Errorf("ViewHandler(): %s", err)

Voir le fichier

@ -17,6 +17,17 @@ import (
"golang.org/x/crypto/bcrypt"
)
func NewCurrentUserRetriever() *CurrentUserRetriever {
return &CurrentUserRetriever{}
}
type CurrentUserRetriever struct{}
func (*CurrentUserRetriever) RetrieveCurrentUser(r *http.Request) (model.User, error) {
user, _, err := RetrieveCurrentUser(r)
return user, err
}
// SuggestUsername suggest user's name if user's name already occupied.
func SuggestUsername(username string) string {
var count int
@ -104,7 +115,7 @@ func CreateUser(w http.ResponseWriter, r *http.Request) (int, error) {
if err != nil {
return http.StatusInternalServerError, err
}
if (registrationForm.Email != "") {
if registrationForm.Email != "" {
SendVerificationToUser(user, registrationForm.Email)
}
status, err = RegisterHandler(w, r)
@ -185,7 +196,7 @@ func UpdateUser(w http.ResponseWriter, form *formStruct.UserForm, currentUser *m
form.Status = user.Status
form.Username = user.Username
}
if (form.Email != user.Email) {
if form.Email != user.Email {
// send verification to new email and keep old
SendVerificationToUser(user, form.Email)
form.Email = user.Email
@ -202,7 +213,7 @@ func DeleteUser(w http.ResponseWriter, currentUser *model.User, id string) (int,
if db.ORM.First(&user, id).RecordNotFound() {
return http.StatusNotFound, errors.New("user not found")
}
if (user.ID == 0) {
if user.ID == 0 {
return http.StatusInternalServerError, errors.New("You can't delete that!")
}
if db.ORM.Delete(&user).Error != nil {

Voir le fichier

@ -11,16 +11,16 @@ import (
"github.com/ewhal/nyaa/db"
"github.com/ewhal/nyaa/model"
"github.com/ewhal/nyaa/util/email"
"github.com/ewhal/nyaa/util/languages"
"github.com/ewhal/nyaa/util/timeHelper"
"github.com/gorilla/securecookie"
"github.com/nicksnyder/go-i18n/i18n"
)
var verificationHandler = securecookie.New(config.EmailTokenHashKey, nil)
// SendEmailVerfication sends an email verification token via email.
func SendEmailVerification(to string, token string, locale string) error {
T, err := i18n.Tfunc(locale)
func SendEmailVerification(to string, token string) error {
T, err := languages.GetDefaultTfunc()
if err != nil {
return err
}
@ -41,7 +41,7 @@ func SendVerificationToUser(user model.User, newEmail string) (int, error) {
if err != nil {
return http.StatusInternalServerError, err
}
err = SendEmailVerification(newEmail, encoded, "en-us")
err = SendEmailVerification(newEmail, encoded)
if err != nil {
return http.StatusInternalServerError, err
}

Voir le fichier

@ -29,7 +29,7 @@
<select id="language" name="language" class="form-control">
{{ $userLanguage := .Language }}
{{ range $tag, $translatedName := $.Languages }}
<option value="{{ $tag }}" {{ if or (eq $userLanguage $tag) (and (eq $userLanguage "") (eq $tag "en-us")) }}selected{{end}}>{{ $translatedName }} {{if eq $tag "en-us"}}({{ T "default" }}){{end}}</option>
<option value="{{ $tag }}" {{ if or (eq $userLanguage $tag) (and (eq $userLanguage "") (eq $tag getDefaultLanguage)) }}selected{{end}}>{{ $translatedName }} {{if eq $tag getDefaultLanguage}}({{ T "default" }}){{end}}</option>
{{ end }}
</select>
</div>

Voir le fichier

@ -1,6 +1,7 @@
package languages
import (
"errors"
"fmt"
"html/template"
"net/http"
@ -8,13 +9,26 @@ import (
"path/filepath"
"github.com/ewhal/nyaa/config"
"github.com/ewhal/nyaa/service/user"
"github.com/ewhal/nyaa/model"
"github.com/nicksnyder/go-i18n/i18n"
"github.com/nicksnyder/go-i18n/i18n/language"
)
// this interface is required to prevent a cyclic import between the languages and userService package.
type UserRetriever interface {
RetrieveCurrentUser(r *http.Request) (model.User, error)
}
var (
defaultLanguage string = config.DefaultI18nConfig.DefaultLanguage
userRetriever UserRetriever = nil
)
// Initialize the languages translation
func InitI18n(conf config.I18nConfig) error {
func InitI18n(conf config.I18nConfig, retriever UserRetriever) error {
defaultLanguage = conf.DefaultLanguage
userRetriever = retriever
defaultFilepath := path.Join(conf.TranslationsDirectory, conf.DefaultLanguage+".all.json")
err := i18n.LoadTranslationFile(defaultFilepath)
if err != nil {
@ -26,16 +40,20 @@ func InitI18n(conf config.I18nConfig) error {
return fmt.Errorf("failed to get translation files: %v", err)
}
for _, path := range paths {
err := i18n.LoadTranslationFile(path)
for _, file := range paths {
err := i18n.LoadTranslationFile(file)
if err != nil {
return fmt.Errorf("failed to load translation file '%s': %v", path, err)
return fmt.Errorf("failed to load translation file '%s': %v", file, err)
}
}
return nil
}
func GetDefaultLanguage() string {
return defaultLanguage
}
// When go-i18n finds a language with >0 translations, it uses it as the Tfunc
// However, if said language has a missing translation, it won't fallback to the "main" language
func TfuncAndLanguageWithFallback(language string, languages ...string) (i18n.TranslateFunc, *language.Language, error) {
@ -89,9 +107,15 @@ func setTranslation(tmpl *template.Template, T i18n.TranslateFunc) {
})
}
func GetTfuncAndLanguageFromRequest(r *http.Request, defaultLanguage string) (T i18n.TranslateFunc, Tlang *language.Language) {
func GetDefaultTfunc() (i18n.TranslateFunc, error) {
return i18n.Tfunc(defaultLanguage)
}
func GetTfuncAndLanguageFromRequest(r *http.Request) (T i18n.TranslateFunc, Tlang *language.Language) {
defaultLanguage := GetDefaultLanguage()
userLanguage := ""
user, _, err := userService.RetrieveCurrentUser(r)
user, err := getCurrentUser(r)
if err == nil {
userLanguage = user.Language
}
@ -108,9 +132,17 @@ func GetTfuncAndLanguageFromRequest(r *http.Request, defaultLanguage string) (T
return
}
func SetTranslationFromRequest(tmpl *template.Template, r *http.Request, defaultLanguage string) i18n.TranslateFunc {
func SetTranslationFromRequest(tmpl *template.Template, r *http.Request) i18n.TranslateFunc {
r.Header.Add("Vary", "Accept-Encoding")
T, _ := GetTfuncAndLanguageFromRequest(r, defaultLanguage)
T, _ := GetTfuncAndLanguageFromRequest(r)
setTranslation(tmpl, T)
return T
}
func getCurrentUser(r *http.Request) (model.User, error) {
if userRetriever == nil {
return model.User{}, errors.New("failed to get current user: no user retriever set")
}
return userRetriever.RetrieveCurrentUser(r)
}

Voir le fichier

@ -10,8 +10,9 @@ import (
func TestInitI18n(t *testing.T) {
conf := config.DefaultI18nConfig
conf.TranslationsDirectory = path.Join("..", "..", conf.TranslationsDirectory)
var retriever UserRetriever = nil // not required during initialization
err := InitI18n(conf)
err := InitI18n(conf, retriever)
if err != nil {
t.Errorf("failed to initialize language translations: %v", err)
}