// ConfigureQorResource configure qor resource for qor admin func (i18n *I18n) ConfigureQorResource(res resource.Resourcer) { if res, ok := res.(*admin.Resource); ok { i18n.Resource = res res.UseTheme("i18n") res.GetAdmin().I18n = i18n res.SearchAttrs("value") // generate search handler for i18n var getPrimaryLocale = func(context *admin.Context) string { if locale := context.Request.Form.Get("primary_locale"); locale != "" { return locale } if availableLocales := getAvailableLocales(context.Request, context.CurrentUser); len(availableLocales) > 0 { return availableLocales[0] } return "" } var getEditingLocale = func(context *admin.Context) string { if locale := context.Request.Form.Get("to_locale"); locale != "" { return locale } return getLocaleFromContext(context.Context) } type matchedTranslation struct { Key string PrimaryLocale string PrimaryValue string EditingLocale string EditingValue string } res.GetAdmin().RegisterFuncMap("i18n_available_translations", func(context *admin.Context) (results []matchedTranslation) { var ( translationsMap = i18n.LoadTranslations() matchedTranslations = map[string]matchedTranslation{} keys = []string{} keyword = strings.ToLower(context.Request.URL.Query().Get("keyword")) primaryLocale = getPrimaryLocale(context) editingLocale = getEditingLocale(context) ) var filterTranslations = func(translations map[string]*Translation, isPrimary bool) { if translations != nil { for key, translation := range translations { if (keyword == "") || (strings.Index(strings.ToLower(translation.Key), keyword) != -1 || strings.Index(strings.ToLower(translation.Value), keyword) != -1) { if _, ok := matchedTranslations[key]; !ok { var t = matchedTranslation{ Key: key, PrimaryLocale: primaryLocale, EditingLocale: editingLocale, EditingValue: translation.Value, } if localeTranslations, ok := translationsMap[primaryLocale]; ok { if v, ok := localeTranslations[key]; ok { t.PrimaryValue = v.Value } } matchedTranslations[key] = t keys = append(keys, key) } } } } } filterTranslations(translationsMap[getEditingLocale(context)], false) if primaryLocale != editingLocale { filterTranslations(translationsMap[getPrimaryLocale(context)], true) } sort.Strings(keys) pagination := context.Searcher.Pagination pagination.Total = len(keys) pagination.PerPage = 25 pagination.CurrentPage, _ = strconv.Atoi(context.Request.URL.Query().Get("page")) if pagination.CurrentPage == 0 { pagination.CurrentPage = 1 } if pagination.CurrentPage > 0 { pagination.Pages = pagination.Total / pagination.PerPage } context.Searcher.Pagination = pagination var paginationKeys []string if pagination.CurrentPage == -1 { paginationKeys = keys } else { lastIndex := pagination.CurrentPage * pagination.PerPage if pagination.Total < lastIndex { lastIndex = pagination.Total } startIndex := (pagination.CurrentPage - 1) * pagination.PerPage if lastIndex >= startIndex { paginationKeys = keys[startIndex:lastIndex] } } for _, key := range paginationKeys { results = append(results, matchedTranslations[key]) } return results }) res.GetAdmin().RegisterFuncMap("i18n_primary_locale", getPrimaryLocale) res.GetAdmin().RegisterFuncMap("i18n_editing_locale", getEditingLocale) res.GetAdmin().RegisterFuncMap("i18n_viewable_locales", func(context admin.Context) []string { return getAvailableLocales(context.Request, context.CurrentUser) }) res.GetAdmin().RegisterFuncMap("i18n_editable_locales", func(context admin.Context) []string { return getEditableLocales(context.Request, context.CurrentUser) }) controller := i18nController{i18n} router := res.GetAdmin().GetRouter() router.Get(res.ToParam(), controller.Index) router.Post(res.ToParam(), controller.Update) router.Put(res.ToParam(), controller.Update) res.GetAdmin().RegisterViewPath("github.com/qor/i18n/views") } }
func (i18n *I18n) ConfigureQorResource(res resource.Resourcer) { if res, ok := res.(*admin.Resource); ok { res.UseTheme("i18n") res.GetAdmin().I18n = i18n res.SearchAttrs("value") // generate search handler for i18n res.GetAdmin().RegisterFuncMap("lt", func(locale, key string, withDefault bool) string { if translations := i18n.Translations[locale]; translations != nil { if t := translations[key]; t != nil && t.Value != "" { return t.Value } } if withDefault { if translations := i18n.Translations[Default]; translations != nil { if t := translations[key]; t != nil { return t.Value } } } return "" }) res.GetAdmin().RegisterFuncMap("i18n_available_keys", func(context *admin.Context) (keys []string) { translations := i18n.Translations[Default] if translations == nil { for _, values := range i18n.Translations { translations = values break } } keyword := context.Request.URL.Query().Get("keyword") for key, translation := range translations { if (keyword == "") || (strings.Index(strings.ToLower(translation.Key), strings.ToLower(keyword)) != -1 || strings.Index(strings.ToLower(translation.Value), keyword) != -1) { keys = append(keys, key) } } sort.Strings(keys) pagination := context.Searcher.Pagination pagination.Total = len(keys) pagination.PrePage = 25 pagination.CurrentPage, _ = strconv.Atoi(context.Request.URL.Query().Get("page")) if pagination.CurrentPage == 0 { pagination.CurrentPage = 1 } if pagination.CurrentPage > 0 { pagination.Pages = pagination.Total / pagination.PrePage } context.Searcher.Pagination = pagination if pagination.CurrentPage == -1 { return keys } lastIndex := pagination.CurrentPage * pagination.PrePage if pagination.Total < lastIndex { lastIndex = pagination.Total } return keys[(pagination.CurrentPage-1)*pagination.PrePage : lastIndex] }) res.GetAdmin().RegisterFuncMap("i18n_primary_locale", func(context admin.Context) string { if locale := context.Request.Form.Get("primary_locale"); locale != "" { return locale } if availableLocales := getAvailableLocales(context.Request, context.CurrentUser); len(availableLocales) > 0 { return availableLocales[0] } return "" }) res.GetAdmin().RegisterFuncMap("i18n_editing_locale", func(context admin.Context) string { if locale := context.Request.Form.Get("to_locale"); locale != "" { return locale } return getLocaleFromContext(context.Context) }) res.GetAdmin().RegisterFuncMap("i18n_viewable_locales", func(context admin.Context) []string { return getAvailableLocales(context.Request, context.CurrentUser) }) res.GetAdmin().RegisterFuncMap("i18n_editable_locales", func(context admin.Context) []string { return getEditableLocales(context.Request, context.CurrentUser) }) controller := i18nController{i18n} router := res.GetAdmin().GetRouter() router.Get(res.ToParam(), controller.Index) router.Post(res.ToParam(), controller.Update) router.Put(res.ToParam(), controller.Update) for _, gopath := range strings.Split(os.Getenv("GOPATH"), ":") { admin.RegisterViewPath(path.Join(gopath, "src/github.com/qor/qor/i18n/views")) } } }