From 6c63d3a6dd2e34b6af3e885597594e7d40d7f292 Mon Sep 17 00:00:00 2001 From: viktorstrate Date: Sat, 17 Apr 2021 12:23:02 +0200 Subject: [PATCH] Integrate italian translation - Add before save checks on user language, to make sure the value is valid --- api/graphql/generated.go | 1 + api/graphql/models/generated.go | 4 +++- api/graphql/models/user.go | 24 +++++++++++++++++++ api/graphql/schema.graphql | 1 + ui/__generated__/globalTypes.ts | 1 + ui/extractedTranslations/fr/translation.json | 4 ++-- ui/src/Pages/SettingsPage/UserPreferences.tsx | 10 ++++++-- ui/src/localization.ts | 10 ++++++-- 8 files changed, 48 insertions(+), 7 deletions(-) diff --git a/api/graphql/generated.go b/api/graphql/generated.go index 8b76f9cd..fd596063 100644 --- a/api/graphql/generated.go +++ b/api/graphql/generated.go @@ -1844,6 +1844,7 @@ type User { enum LanguageTranslation { English, French, + Italian, Swedish, Danish, } diff --git a/api/graphql/models/generated.go b/api/graphql/models/generated.go index 5ae3b38b..e60f7cc6 100644 --- a/api/graphql/models/generated.go +++ b/api/graphql/models/generated.go @@ -73,6 +73,7 @@ type LanguageTranslation string const ( LanguageTranslationEnglish LanguageTranslation = "English" LanguageTranslationFrench LanguageTranslation = "French" + LanguageTranslationItalian LanguageTranslation = "Italian" LanguageTranslationSwedish LanguageTranslation = "Swedish" LanguageTranslationDanish LanguageTranslation = "Danish" ) @@ -80,13 +81,14 @@ const ( var AllLanguageTranslation = []LanguageTranslation{ LanguageTranslationEnglish, LanguageTranslationFrench, + LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish, } func (e LanguageTranslation) IsValid() bool { switch e { - case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationSwedish, LanguageTranslationDanish: + case LanguageTranslationEnglish, LanguageTranslationFrench, LanguageTranslationItalian, LanguageTranslationSwedish, LanguageTranslationDanish: return true } return false diff --git a/api/graphql/models/user.go b/api/graphql/models/user.go index 66dbb388..244221b4 100644 --- a/api/graphql/models/user.go +++ b/api/graphql/models/user.go @@ -43,6 +43,30 @@ type UserPreferences struct { Language *LanguageTranslation } +func (u *UserPreferences) BeforeSave(tx *gorm.DB) error { + + if u.Language != nil && *u.Language == "" { + u.Language = nil + } + + if u.Language != nil { + lang_str := string(*u.Language) + found_match := false + for _, lang := range AllLanguageTranslation { + if string(lang) == lang_str { + found_match = true + break + } + } + + if !found_match { + return errors.New("invalid language value") + } + } + + return nil +} + var ErrorInvalidUserCredentials = errors.New("invalid credentials") func AuthorizeUser(db *gorm.DB, username string, password string) (*User, error) { diff --git a/api/graphql/schema.graphql b/api/graphql/schema.graphql index f75badbf..224a2aa5 100644 --- a/api/graphql/schema.graphql +++ b/api/graphql/schema.graphql @@ -224,6 +224,7 @@ type User { enum LanguageTranslation { English, French, + Italian, Swedish, Danish, } diff --git a/ui/__generated__/globalTypes.ts b/ui/__generated__/globalTypes.ts index 62b98c73..f071a22c 100644 --- a/ui/__generated__/globalTypes.ts +++ b/ui/__generated__/globalTypes.ts @@ -11,6 +11,7 @@ export enum LanguageTranslation { Danish = 'Danish', English = 'English', French = 'French', + Italian = 'Italian', Swedish = 'Swedish', } diff --git a/ui/extractedTranslations/fr/translation.json b/ui/extractedTranslations/fr/translation.json index 305974d3..5a533d20 100644 --- a/ui/extractedTranslations/fr/translation.json +++ b/ui/extractedTranslations/fr/translation.json @@ -189,8 +189,8 @@ "title": "Télécharger" }, "media": { - "exif": { - "exposure_program": { + "exif": { + "exposure_program": { "action_program": "Action program", "aperture_priority": "Priorité d'ouverture", "bulb": "Bulb", diff --git a/ui/src/Pages/SettingsPage/UserPreferences.tsx b/ui/src/Pages/SettingsPage/UserPreferences.tsx index 83b1af94..c5291ae8 100644 --- a/ui/src/Pages/SettingsPage/UserPreferences.tsx +++ b/ui/src/Pages/SettingsPage/UserPreferences.tsx @@ -1,6 +1,6 @@ import { useMutation, useQuery } from '@apollo/client' import gql from 'graphql-tag' -import React from 'react' +import React, { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Dropdown } from 'semantic-ui-react' import styled from 'styled-components' @@ -21,6 +21,7 @@ const languagePreferences = [ { key: 2, text: 'Français', flag: 'fr', value: LanguageTranslation.French }, { key: 3, text: 'Svenska', flag: 'se', value: LanguageTranslation.Swedish }, { key: 4, text: 'Dansk', flag: 'dk', value: LanguageTranslation.Danish }, + { key: 5, text: 'Italiano', flag: 'it', value: LanguageTranslation.Italian }, ] const CHANGE_USER_PREFERENCES = gql` @@ -55,6 +56,11 @@ const UserPreferences = () => { changeUserPreferencesVariables >(CHANGE_USER_PREFERENCES) + const sortedLanguagePrefs = useMemo( + () => languagePreferences.sort((a, b) => a.text.localeCompare(b.text)), + [] + ) + if (error) { return
{error.message}
} @@ -85,7 +91,7 @@ const UserPreferences = () => { 'Select language' )} clearable - options={languagePreferences} + options={sortedLanguagePrefs} onChange={(event, { value: language }) => { changePrefs({ variables: { diff --git a/ui/src/localization.ts b/ui/src/localization.ts index 33f9e73b..c635bba4 100644 --- a/ui/src/localization.ts +++ b/ui/src/localization.ts @@ -5,7 +5,7 @@ import i18n from 'i18next' import { initReactI18next, TFunction } from 'react-i18next' import { LanguageTranslation } from '../__generated__/globalTypes' import { authToken } from './helpers/authentication' -import { exhaustiveCheck } from './helpers/utils' +import { exhaustiveCheck, isNil } from './helpers/utils' export type TranslationFn = TFunction<'translation'> @@ -52,7 +52,7 @@ export const loadTranslations = () => { useEffect(() => { const language = data?.myUserPreferences.language - if (language == null) { + if (isNil(language)) { i18n.changeLanguage('en') return } @@ -82,6 +82,12 @@ export const loadTranslations = () => { i18n.changeLanguage('sv') }) return + case LanguageTranslation.Italian: + import('../extractedTranslations/it/translation.json').then(swedish => { + i18n.addResourceBundle('it', 'translation', swedish) + i18n.changeLanguage('it') + }) + return } exhaustiveCheck(language)