diff --git a/android/app/build.gradle b/android/app/build.gradle index bb6cfa91..627dc8ae 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.moimob.drinkable" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 11801 - versionName "1.18.1" + versionCode 11901 + versionName "1.19.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/fastlane/metadata/android/en-US/changelogs/11900.txt b/fastlane/metadata/android/en-US/changelogs/11900.txt new file mode 100644 index 00000000..46058ad6 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/11900.txt @@ -0,0 +1,3 @@ +• Added more cocktails 🍸 +• Added Russian language +• Added Polish language \ No newline at end of file diff --git a/src/data/cocktail-data.ts b/src/data/cocktail-data.ts index c0849ea7..818f118a 100644 --- a/src/data/cocktail-data.ts +++ b/src/data/cocktail-data.ts @@ -1713,5 +1713,43 @@ const cocktails: Cocktail[] = [ { amount: '10', ingredientId: '3', unit: Unit.ML }, { amount: '0.5', ingredientId: '99', unit: '' } ] + }, + { + id: '121', + imageSrc: 'images/absolut_limousine.jpg', + isImagePortrait: false, + name: 'Absolut limousine', + category: DrinkCategory.Cocktail, + instructions: 'Fill Absolut into a glass. Add Lime juice. Add Ice and lime wedges.', + ingredientGroups: [ + { amount: '30', ingredientId: '51', unit: Unit.ML }, + { amount: '15', ingredientId: '2', unit: Unit.ML }, + { amount: '', ingredientId: '7', unit: '' } + ] + }, + { + id: '122', + imageSrc: 'images/zizi_coin-coin.jpg', + isImagePortrait: false, + name: 'Zizi Coin-coin', + category: DrinkCategory.Cocktail, + instructions: + 'Pour Cointreau on ice, add fresh lemon (or lime) juice, stir gently, and finally add slices of lemon/lime in glass', + ingredientGroups: [ + { amount: '50', ingredientId: '92', unit: Unit.ML }, + { amount: '20', ingredientId: '10', unit: Unit.ML } + ] + }, + { + id: '123', + imageSrc: 'images/cream_soda.jpg', + isImagePortrait: false, + name: 'Cream Soda', + category: DrinkCategory.Cocktail, + instructions: 'Pour 1oz of Spiced Rum into a highball glass with ice. Fill with Ginger Ale.', + ingredientGroups: [ + { amount: '40', ingredientId: '21', unit: Unit.ML }, + { amount: '', ingredientId: '24', unit: '' } + ] } ]; diff --git a/src/locales/sv/translation.json b/src/locales/sv/translation.json index 6c409041..e64fef9f 100644 --- a/src/locales/sv/translation.json +++ b/src/locales/sv/translation.json @@ -95,4 +95,4 @@ "or": "eller", "show-mocktails": "Visa Mocktails", "all-ingredients": "Alla ingredienser" -} \ No newline at end of file +} diff --git a/src/modules/settings/general-settings/general-settings.html b/src/modules/settings/general-settings/general-settings.html index fbaf819b..afea503f 100644 --- a/src/modules/settings/general-settings/general-settings.html +++ b/src/modules/settings/general-settings/general-settings.html @@ -44,62 +44,68 @@ -
- - Checkmark - +
+ - -

-
+ viewBox="0 0 512 512"> + Checkmark + + +

+ + + (${translationStatus.basic}%) +

+
-
- - Checkmark - + - - - Close - + Checkmark + + + - -

+ viewBox="0 0 512 512"> + Close + + +

+ + + (${translationStatus.ingredients}%) +

+
diff --git a/src/modules/settings/general-settings/general-settings.ts b/src/modules/settings/general-settings/general-settings.ts index 1f3174f6..3b615f53 100644 --- a/src/modules/settings/general-settings/general-settings.ts +++ b/src/modules/settings/general-settings/general-settings.ts @@ -7,6 +7,7 @@ import { I18N } from 'aurelia-i18n'; import { IngredientService } from 'services/ingredient-service'; import { getLanguages } from 'data/languages'; import { CocktailService } from 'services/cocktail-service'; +import { TranslationStatus } from './translation-status'; @inject(ThemeService, LocalStorageService, I18N, IngredientService, CocktailService) export class GeneralSettings { @@ -24,13 +25,42 @@ export class GeneralSettings { public messuarementSystems = [{ value: MessuarementSystem.Imperial }, { value: MessuarementSystem.Metric }]; - public translationStatus = { + public translationStatus: TranslationStatus = { basic: undefined, - ingredients: undefined + ingredients: undefined, + isDefaultLanguage: true }; private _settings: SettingEntity; + private ignoreKeys: string[] = [ + 'now', + 'second_ago', + 'second_ago_other', + 'second_in', + 'second_in_other', + 'minute_ago', + 'minute_ago_other', + 'minute_in', + 'minute_in_other', + 'hour_ago', + 'hour_ago_other', + 'hour_in', + 'hour_in_other', + 'day_ago', + 'day_ago_other', + 'day_in', + 'day_in_other', + 'month_ago', + 'month_ago_other', + 'month_in', + 'month_in_other', + 'year_ago', + 'year_ago_other', + 'year_in', + 'year_in_other' + ]; + constructor( private _themeService: ThemeService, private _localStorageService: LocalStorageService, @@ -87,17 +117,34 @@ export class GeneralSettings { } private setTranslationStatus(locale: string) { + let enTranslationKeys = Object.keys(this._i18n.i18next.store.data['en']?.translation).filter( + x => !this.ignoreKeys.includes(x) + ).length; + + let enIngredientKeys = Object.keys(this._i18n.i18next.store.data['en']?.ingredients).length; + if (locale === undefined || locale === 'en') { this.translationStatus = { basic: undefined, - ingredients: undefined + ingredients: undefined, + isDefaultLanguage: true }; return; } + let translationKeys = Object.keys(this._i18n.i18next.store.data[locale].translation).filter( + x => !this.ignoreKeys.includes(x) + ).length; + + let ingredientKeys = + this._i18n.i18next.store.data[locale]?.ingredients !== undefined + ? Object.keys(this._i18n.i18next.store.data[locale]?.ingredients)?.length + : 0; + this.translationStatus = { - basic: true, - ingredients: this._i18n.i18next.store.data[locale]?.ingredients !== undefined + basic: Math.floor((translationKeys / enTranslationKeys) * 100), + ingredients: Math.floor((ingredientKeys / enIngredientKeys) * 100), + isDefaultLanguage: false }; } diff --git a/src/modules/settings/general-settings/translation-status.ts b/src/modules/settings/general-settings/translation-status.ts new file mode 100644 index 00000000..964bc39b --- /dev/null +++ b/src/modules/settings/general-settings/translation-status.ts @@ -0,0 +1,5 @@ +export class TranslationStatus { + public basic: number | undefined; + public ingredients: number | undefined; + public isDefaultLanguage: boolean; +} diff --git a/static/images/absolut_limousine.jpg b/static/images/absolut_limousine.jpg new file mode 100644 index 00000000..46bca095 Binary files /dev/null and b/static/images/absolut_limousine.jpg differ diff --git a/static/images/cream_soda.jpg b/static/images/cream_soda.jpg new file mode 100644 index 00000000..3c88c8f3 Binary files /dev/null and b/static/images/cream_soda.jpg differ diff --git a/static/images/zizi_coin-coin.jpg b/static/images/zizi_coin-coin.jpg new file mode 100644 index 00000000..162ec2d2 Binary files /dev/null and b/static/images/zizi_coin-coin.jpg differ diff --git a/tests/locales/locales.test.ts b/tests/locales/locales.test.ts new file mode 100644 index 00000000..02ee75e2 --- /dev/null +++ b/tests/locales/locales.test.ts @@ -0,0 +1,25 @@ +import ca from '../../src/locales/ca/translation.json'; +import de from '../../src/locales/de/translation.json'; +import en from '../../src/locales/en/translation.json'; +import es from '../../src/locales/es/translation.json'; +import fr from '../../src/locales/fr/translation.json'; +import it from '../../src/locales/it/translation.json'; +import nl from '../../src/locales/nl/translation.json'; +import pl from '../../src/locales/pl/translation.json'; +import ru from '../../src/locales/ru/translation.json'; +import sv from '../../src/locales/sv/translation.json'; + +describe('Locales Test', () => { + test('No empty values', () => { + expect(Object.values(ca).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(de).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(en).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(es).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(fr).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(it).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(nl).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(pl).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(ru).filter(x => x.toString().trim() === '').length).toEqual(0); + expect(Object.values(sv).filter(x => x.toString().trim() === '').length).toEqual(0); + }); +});