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 @@
-
-
+
+
+
+ (${translationStatus.basic}%)
+
+
-
-
-
- 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);
+ });
+});