From 90009cf5c66d75cf58f386eda8aa876c6999a4ca Mon Sep 17 00:00:00 2001 From: Talha Keskin <72507373+raymenstereo@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:10:20 +0100 Subject: [PATCH 01/27] =?UTF-8?q?Added=20T=C3=BCrkce/turkish=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/i18n/languages.php | 1 + includes/i18n/tr.php | 194 ++++++++++++++++++++++++++++++++++++ scripts/i18n/tr.js | 37 +++++++ 3 files changed, 232 insertions(+) create mode 100644 includes/i18n/tr.php create mode 100644 scripts/i18n/tr.js diff --git a/includes/i18n/languages.php b/includes/i18n/languages.php index 06cea9d8b..e9e5faa1e 100644 --- a/includes/i18n/languages.php +++ b/includes/i18n/languages.php @@ -10,6 +10,7 @@ "jp" => "日本語", "pt" => "Português", "zh_cn" => "简体中文", + "tr" => "Türkçe", ] ?> diff --git a/includes/i18n/tr.php b/includes/i18n/tr.php new file mode 100644 index 000000000..c478d9b0d --- /dev/null +++ b/includes/i18n/tr.php @@ -0,0 +1,194 @@ + "Giriş yapabilmeniz için önce bir hesap oluşturmanız gerekiyor", + 'username' => "Kullanıcı Adı", + 'password' => "Şifre", + "email" => "E-posta", + "confirm_password" => "Şifreyi Onayla", + "main_currency" => "Ana Para Birimi", + "language" => "Dil", + "passwords_dont_match" => "Şifreler eşleşmiyor", + "registration_failed" => "Kayıt başarısız, lütfen tekrar deneyin.", + "register" => "Kayıt Ol", + // Login Page + 'please_login' => "Lütfen giriş yapın", + 'stay_logged_in' => "Oturumu açık tut (30 gün)", + 'login' => "Giriş Yap", + 'login_failed' => "Giriş bilgileri hatalı", + // Header + 'subscriptions' => "Abonelikler", + 'stats' => "İstatistikler", + 'settings' => "Ayarlar", + 'about' => "Hakkında", + 'logout' => "Çıkış Yap", + // Subscriptions page + "subscription" => "Abonelik", + "no_subscriptions_yet" => "Henüz herhangi bir aboneliğiniz yok", + "add_first_subscription" => "İlk aboneliği ekle", + 'new_subscription' => "Yeni Abonelik", + 'sort' => "Sırala", + 'name' => "İsim", + 'last_added' => "Son Eklenen", + 'price' => "Fiyat", + 'next_payment' => "Sonraki Ödeme", + 'member' => "Üye", + 'category' => "Kategori", + 'payment_method' => "Ödeme Yöntemi", + "Daily" => "Günlük", + "Weekly" => "Haftalık", + "Monthly" => "Aylık", + "Yearly" => "Yıllık", + "days" => "günler", + "weeks" => "haftalar", + "months" => "aylar", + "years" => "yıllar", + "external_url" => "Harici URL'yi Ziyaret Et", + "empty_page" => "Boş Sayfa", + // Subscription form + "add_subscription" => "Abonelik ekle", + "edit_subscription" => "Aboneliği düzenle", + "subscription_name" => "Abonelik adı", + "logo_preview" => "Logo Önizlemesi", + "search_logo" => "Logoyu webde ara", + "web_search" => "Web araması", + "currency" => "Para Birimi", + "billing_cycle" => "Faturalandırma Döngüsü", + "frequency" => "Frekans", + "cycle" => "Döngü", + "next_payment" => "Sonraki Ödeme", + "payment_method" => "Ödeme Yöntemi", + "no_category" => "Kategori yok", + "paid_by" => "Ödeyen", + "url" => "URL", + "notes" => "Notlar", + "enable_notifications" => "Bu abonelik için bildirimleri etkinleştir", + "delete" => "Sil", + "cancel" => "İptal", + "upload_logo" => "Logo Yükle", + // Statistics page + 'general_statistics' => "Genel İstatistikler", + 'active_subscriptions' => "Aktif Abonelikler", + 'monthly_cost' => "Aylık Maliyet", + 'yearly_cost' => "Yıllık Maliyet", + 'average_monthly' => "Ortalama Aylık Abonelik Maliyeti", + 'most_expensive' => "En Pahalı Abonelik Maliyeti", + 'amount_due' => "Bu ay ödenecek miktar", + 'split_views' => "Bölünmüş Görünümler", + 'category_split' => "Kategori Bölümü", + 'household_split' => "Hane Bölümü", + // About page + 'about_and_credits' => "Hakkında ve Teşekkürler", + 'license' => "Lisans", + 'issues_and_requests' => "Sorunlar ve İstekler", + 'the_author' => "Yazar", + 'icons' => "İkonlar", + 'payment_icons' => "Ödeme İkonları", + // Settings page + 'user_details' => "Kullanıcı Detayları", + "household" => "Hane", + "save_member" => "Üyeyi Kaydet", + "delete_member" => "Üyeyi Sil", + "cant_delete_member" => "Ana üyeyi silemezsiniz", + "cant_delete_member_in_use" => "Abonelikte kullanılan üyeyi silemezsiniz", + "notifications" => "Bildirimler", + "enable_email_notifications" => "E-posta bildirimlerini etkinleştir", + "notify_me" => "Beni bilgilendir", + "day_before" => "bir gün önce", + "days_before" => "günler önce", + "smtp_address" => "SMTP Adresi", + "port" => "Port", + "smtp_username" => "SMTP Kullanıcı Adı", + "smtp_password" => "SMTP Şifresi", + "from_email" => "Gönderen e-posta (İsteğe bağlı)", + "smtp_info" => "SMTP Şifresi düz metin olarak iletilir ve saklanır. Güvenlik için, lütfen bunun için özel bir hesap oluşturun.", + "categories" => "Kategoriler", + "save_category" => "Kategoriyi Kaydet", + "delete_category" => "Kategoriyi Sil", + "cant_delete_category_in_use" => "Abonelikte kullanılan kategoriyi silemezsiniz", + "currencies" => "Para Birimleri", + "save_currency" => "Para birimini kaydet", + "delete_currency" => "Para birimini sil", + "cant_delete_main_currency" => "Ana para birimini silemezsiniz", + "cant_delete_currency_in_use" => "Abonelikte kullanılan para birimini silemezsiniz", + "exchange_update" => "Döviz kurları son güncelleme tarihi", + "currency_info" => "Desteklenen para birimlerini ve doğru para birimi kodlarını burada bulun", + "currency_performance" => "Performansı artırmak için sadece kullandığınız para birimlerini tutun.", + "fixer_api_key" => "Fixer API Anahtarı", + "api_key" => "API Anahtarı", + "fixer_info" => "Birden fazla para birimi kullanıyorsanız ve aboneliklerde doğru istatistikler ve sıralama istiyorsanız, Fixer'dan ÜCRETSİZ bir API Anahtarı gereklidir.", + "get_key" => "Anahtarınızı şuradan alın", + "display_settings" => "Görüntüleme Ayarları", + "switch_theme" => "Açık / Koyu Temayı Değiştir", + "calculate_monthly_price" => "Tüm aboneliklerin aylık fiyatını hesaplayın ve gösterin", + "convert_prices" => "Fiyatları her zaman ana para birimimde dönüştürün ve gösterin (daha yavaş)", + "experimental_settings" => "Deneysel Ayarlar", + "remove_background" => "Görsel aramadan logoların arka planını kaldırmayı deneyin (deneysel)", + "experimental_info" => "Deneysel ayarlar muhtemelen mükemmel çalışmayacak.", + "payment_methods" => "Ödeme Yöntemleri", + "payment_methods_info" => "Bir ödeme yöntemini devre dışı bırakmak / etkinleştirmek için tıklayın.", + "cant_delete_payment_method_in_use" => "Kullanımda olan ödeme yöntemini devre dışı bırakamazsınız", + "disable" => "Devre Dışı Bırak", + "enable" => "Etkinleştir", + "test" => "Test Et", + "add" => "Ekle", + "save" => "Kaydet", + // Toast + "success" => "Başarılı", + // Endpoint responses + "session_expired" => "Oturumunuz sona erdi. Lütfen tekrar giriş yapın", + "fields_missing" => "Bazı alanlar eksik", + "fill_all_fields" => "Lütfen tüm alanları doldurun", + "fill_mandatory_fields" => "Lütfen zorunlu alanları doldurun", + "error" => "Hata", + // Category + "failed_add_category" => "Kategori eklenemedi", + "failed_edit_category" => "Kategori düzenlenemedi", + "category_in_use" => "Kategori aboneliklerde kullanımda olduğu için kaldırılamaz", + "failed_remove_category" => "Kategori kaldırılamadı", + "category_saved" => "Kategori kaydedildi", + "category_removed" => "Kategori kaldırıldı", + // Currency + "currency_saved" => "kaydedildi.", + "error_adding_currency" => "Para birimi girişi eklenirken hata oluştu.", + "failed_to_store_currency" => "Para birimi Veritabanına kaydedilemedi.", + "currency_in_use" => "Para birimi aboneliklerde kullanımda olduğu için silinemez.", + "currency_is_main" => "Para birimi ana para birimi olarak ayarlandığı için silinemez.", + "failed_to_remove_currency" => "Para birimi Veritabanından kaldırılamadı.", + "failed_to_store_api_key" => "API Anahtarı Veritabanına kaydedilemedi.", + "invalid_api_key" => "Geçersiz API Anahtarı.", + "api_key_saved" => "API anahtarı başarıyla kaydedildi", + "currency_removed" => "Para birimi kaldırıldı", + // Household + "failed_add_household" => "Hane üyesi eklenemedi", + "failed_edit_household" => "Hane üyesi düzenlenemedi", + "failed_remove_household" => "Hane üyesi kaldırılamadı", + "household_in_use" => "Hane üyesi aboneliklerde kullanımda olduğu için kaldırılamaz", + "member_saved" => "Üye kaydedildi", + "member_removed" => "Üye kaldırıldı", + // Notifications + "error_saving_notifications" => "Bildirim verileri kaydedilirken hata oluştu.", + "wallos_notification" => "Wallos Bildirimi", + "test_notification" => "Bu bir test bildirimidir. Bunu görüyorsanız, yapılandırma doğrudur.", + "email_error" => "E-posta gönderilirken hata oluştu", + "notification_sent_successfuly" => "Bildirim başarıyla gönderildi", + "notifications_settings_saved" => "Bildirim ayarları başarıyla kaydedildi.", + // Payments + "payment_in_use" => "Kullanımda olan ödeme yöntemi devre dışı bırakılamaz", + "failed_update_payment" => "Ödeme yöntemi veritabanında güncellenemedi", + "enabled" => "etkinleştirildi", + "disabled" => "devre dışı bırakıldı", + // Subscription + "error_fetching_image" => "Görüntü alınırken hata oluştu", + "subscription_updated_successfuly" => "Abonelik başarıyla güncellendi", + "subscription_added_successfuly" => "Abonelik başarıyla eklendi", + "error_deleting_subscription" => "Abonelik silinirken hata oluştu.", + "invalid_request_method" => "Geçersiz istek metodu.", + // User + "error_updating_user_data" => "Kullanıcı verileri güncellenirken hata oluştu.", + "user_details_saved" => "Kullanıcı detayları kaydedildi", +]; + + +?> diff --git a/scripts/i18n/tr.js b/scripts/i18n/tr.js new file mode 100644 index 000000000..7fd8042aa --- /dev/null +++ b/scripts/i18n/tr.js @@ -0,0 +1,37 @@ +let i18n = { + // Dashboard + error_reloading_subscription: "Abonelik yeniden yüklenirken hata oluştu:", + error_fetching_image_results: "Görüntü sonuçları alınırken hata oluştu:", + subscription_deleted: "Abonelik silindi", + error_deleting_subscription: "Abonelik silinirken hata oluştu", + failed_to_load_subscription: "Abonelik yüklenemedi", + edit_subscription: "Aboneliği Düzenle", + add_subscription: "Abonelik Ekle", + // Ayarlar + network_response_error: "Ağ yanıtı kabul edilmedi", + failed_add_member: "Üye eklenemedi", + member: "Üye", + save_member: "Üyeyi Kaydet", + delete_member: "Üyeyi Sil", + failed_remove_member: "Üye silinmedi", + failed_save_member: "Üye kaydedilemedi", + failed_add_category: "Kategori eklenemedi", + category: "Kategori", + save_category: "Kategoriyi Kaydet", + delete_category: "Kategoriyi Sil", + failed_remove_category: "Kategori silinmedi", + currency: "Para Birimi", + currency_code: "Para Birimi Kodu", + save_currency: "Para Birimini Kaydet", + delete_currency: "Para Birimini Sil", + failed_remove_currency: "Para birimi kaldırılamadı", + failed_save_currency: "Para birimi kaydedilemedi", + cant_disable_payment_in_use: "Kullanımdaki ödemeyi devre dışı bırakamazsınız", + failed_save_payment_method: "Ödeme yöntemi kaydedilemedi", + unknown_error: "Bilinmeyen hata, lütfen tekrar deneyin.", + error_saving_notification_data: "Bildirim verisi kaydedilirken hata oluştu", + error_sending_notification: "Bildirim gönderilirken hata oluştu" +} + + + From 878eedf1d6231fa9e64c56b6e219fde608491f01 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Mon, 12 Feb 2024 18:00:30 +0100 Subject: [PATCH 02/27] Reorder languages --- includes/i18n/languages.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/includes/i18n/languages.php b/includes/i18n/languages.php index e9e5faa1e..d0ae35c5b 100644 --- a/includes/i18n/languages.php +++ b/includes/i18n/languages.php @@ -2,15 +2,17 @@ // File Name => Language Name $languages = [ + // English first "en" => "English", + // Remaining sorted alphabetically by language code "de" => "Deutsch", "es" => "Español", "el" => "Ελληνικά", "fr" => "Français", "jp" => "日本語", "pt" => "Português", - "zh_cn" => "简体中文", "tr" => "Türkçe", + "zh_cn" => "简体中文", ] ?> From fc56cf69ef22a07978022265b2e8344dc293eb14 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Mon, 12 Feb 2024 18:34:24 +0100 Subject: [PATCH 03/27] Fix: Currency not preselected on registration --- scripts/registration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/registration.js b/scripts/registration.js index 645560e86..3c7545bad 100644 --- a/scripts/registration.js +++ b/scripts/registration.js @@ -25,7 +25,7 @@ function storeFormFields() { function restoreFormFieldValue(fieldId) { var fieldElement = document.getElementById(fieldId); - if (fieldElement) { + if (localStorage.getItem(fieldId)) { fieldElement.value = localStorage.getItem(fieldId) || ''; } } From f02accd377947c95cbba074c097be1994b806e3c Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Mon, 12 Feb 2024 18:35:31 +0100 Subject: [PATCH 04/27] Remove 'cycle' when screen is too narrow --- styles/styles.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/styles/styles.css b/styles/styles.css index 7f4be1abd..c319ccfac 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -310,6 +310,12 @@ main > .contain { } } +@media (max-width: 375px) { + .subscription-main > .cycle { + display: none; + } +} + .subscription.is-open .subscription-secondary { display: flex; } From c9135e1dc830b83498c6f073cf78bcd08c785806 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Mon, 12 Feb 2024 23:49:13 +0100 Subject: [PATCH 05/27] Bump version --- includes/version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/version.php b/includes/version.php index ff1c5ae32..8aa218c0f 100644 --- a/includes/version.php +++ b/includes/version.php @@ -1,3 +1,3 @@ \ No newline at end of file From 884a8e569339ddbcb89af4634c0c845b053affbb Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Tue, 13 Feb 2024 09:44:25 +0100 Subject: [PATCH 06/27] Fix: Language sort order --- includes/i18n/languages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/i18n/languages.php b/includes/i18n/languages.php index d0ae35c5b..95ff52831 100644 --- a/includes/i18n/languages.php +++ b/includes/i18n/languages.php @@ -6,8 +6,8 @@ "en" => "English", // Remaining sorted alphabetically by language code "de" => "Deutsch", - "es" => "Español", "el" => "Ελληνικά", + "es" => "Español", "fr" => "Français", "jp" => "日本語", "pt" => "Português", From f2ed357f6021e78d1e244335040be1976eaa3360 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 14 Feb 2024 01:05:48 +0100 Subject: [PATCH 07/27] Add export subscriptions to JSON button --- endpoints/subscriptions/export.php | 41 ++++++++++++++++++++++++++++++ includes/i18n/de.php | 2 ++ includes/i18n/el.php | 2 ++ includes/i18n/en.php | 2 ++ includes/i18n/es.php | 2 ++ includes/i18n/fr.php | 2 ++ includes/i18n/jp.php | 2 ++ includes/i18n/pt.php | 2 ++ includes/i18n/tr.php | 2 ++ includes/i18n/zh_cn.php | 2 ++ includes/version.php | 2 +- scripts/settings.js | 4 +++ settings.php | 9 +++++++ 13 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 endpoints/subscriptions/export.php diff --git a/endpoints/subscriptions/export.php b/endpoints/subscriptions/export.php new file mode 100644 index 000000000..c43275aaf --- /dev/null +++ b/endpoints/subscriptions/export.php @@ -0,0 +1,41 @@ +query($query); +if ($result) { + $subscriptions = array(); + while ($row = $result->fetchArray(SQLITE3_ASSOC)) { + // Map foreign keys to their corresponding values + $row['currency'] = $currencies[$row['currency_id']]; + $row['payment_method'] = $payment_methods[$row['payment_method_id']]; + $row['payer_user'] = $members[$row['payer_user_id']]; + $row['category'] = $categories[$row['category_id']]; + $row['cycle'] = $cycles[$row['cycle']]; + $row['frequency'] = $frequencies[$row['frequency']]; + + $subscriptions[] = $row; + } + + // Output JSON + $json = json_encode($subscriptions, JSON_PRETTY_PRINT); + + // Set headers for file download + header('Content-Type: application/json'); + header('Content-Disposition: attachment; filename="subscriptions.json"'); + header('Pragma: no-cache'); + header('Expires: 0'); + + // Output JSON for download + echo $json; +} else { + echo json_encode(array('error' => 'Failed to fetch subscriptions.')); +} + +?> \ No newline at end of file diff --git a/includes/i18n/de.php b/includes/i18n/de.php index e527308ff..d0f7e7150 100644 --- a/includes/i18n/de.php +++ b/includes/i18n/de.php @@ -134,6 +134,8 @@ "test" => "Test", "add" => "Hinzufügen", "save" => "Speichern", + "export_subscriptions" => "Abonnements exportieren", + "export_to_json" => "Nach JSON exportieren", // Toast "success" => "Erfolgreich", // Endpoint responses diff --git a/includes/i18n/el.php b/includes/i18n/el.php index 2bdb565ab..a956ca31c 100644 --- a/includes/i18n/el.php +++ b/includes/i18n/el.php @@ -134,6 +134,8 @@ "test" => "Δοκιμή", "add" => "Προσθήκη", "save" => "Αποθήκευση", + "export_subscriptions" => "Εξαγωγή συνδρομών", + "export_to_json" => "Εξαγωγή σε JSON", // Toast "success" => "Επιτυχία", // Endpoint responses diff --git a/includes/i18n/en.php b/includes/i18n/en.php index 42fbf47f9..29deea186 100644 --- a/includes/i18n/en.php +++ b/includes/i18n/en.php @@ -134,6 +134,8 @@ "test" => "Test", "add" => "Add", "save" => "Save", + "export_subscriptions" => "Export Subscriptions", + "export_to_json" => "Export to JSON", // Toast "success" => "Success", // Endpoint responses diff --git a/includes/i18n/es.php b/includes/i18n/es.php index a580600a8..aa889d447 100644 --- a/includes/i18n/es.php +++ b/includes/i18n/es.php @@ -134,6 +134,8 @@ "test" => "Probar", "add" => "Agregar", "save" => "Guardar", + "export_subscriptions" => "Exportar suscripciones", + "export_to_json" => "Exportar a JSON", // Toast "success" => "Éxito", // Endpoint responses diff --git a/includes/i18n/fr.php b/includes/i18n/fr.php index 3b4bfe091..efe84aad2 100644 --- a/includes/i18n/fr.php +++ b/includes/i18n/fr.php @@ -134,6 +134,8 @@ "test" => "Test", "add" => "Ajouter", "save" => "Enregistrer", + "export_subscriptions" => "Exporter les abonnements", + "export_to_json" => "Exporter en JSON", // Toast "success" => "Succès", // Réponses de l'API diff --git a/includes/i18n/jp.php b/includes/i18n/jp.php index e1c6de89f..a305ebfdc 100644 --- a/includes/i18n/jp.php +++ b/includes/i18n/jp.php @@ -134,6 +134,8 @@ "test" => "テスト", "add" => "追加", "save" => "保存", + "export_subscriptions" => "購読をエクスポート", + "export_to_json" => "JSONにエクスポート", // Toast "success" => "成功", // Endpoint responses diff --git a/includes/i18n/pt.php b/includes/i18n/pt.php index 1069fe959..c34b3e02d 100644 --- a/includes/i18n/pt.php +++ b/includes/i18n/pt.php @@ -134,6 +134,8 @@ "test" => "Testar", "add" => "Adicionar", "save" => "Guardar", + "export_subscriptions" => "Exportar Subscrições", + "export_to_json" => "Exportar para JSON", // Toast "success" => "Sucesso", // Endpoint responses diff --git a/includes/i18n/tr.php b/includes/i18n/tr.php index c478d9b0d..018ad1dfc 100644 --- a/includes/i18n/tr.php +++ b/includes/i18n/tr.php @@ -134,6 +134,8 @@ "test" => "Test Et", "add" => "Ekle", "save" => "Kaydet", + "export_subscriptions" => "Abonelikleri Dışa Aktar", + "export_to_json" => "JSON'a dışa aktar", // Toast "success" => "Başarılı", // Endpoint responses diff --git a/includes/i18n/zh_cn.php b/includes/i18n/zh_cn.php index 6a81c2bb7..3495f7bc7 100644 --- a/includes/i18n/zh_cn.php +++ b/includes/i18n/zh_cn.php @@ -141,6 +141,8 @@ "test" => "测试", "add" => "添加", "save" => "保存", + "export_subscriptions" => "导出订阅", + "export_to_json" => "导出为 JSON", // Toast "success" => "成功", diff --git a/includes/version.php b/includes/version.php index 8aa218c0f..f464c964c 100644 --- a/includes/version.php +++ b/includes/version.php @@ -1,3 +1,3 @@ \ No newline at end of file diff --git a/scripts/settings.js b/scripts/settings.js index 3e92fbd75..c0bc29109 100644 --- a/scripts/settings.js +++ b/scripts/settings.js @@ -608,4 +608,8 @@ function setRemoveBackgroundCookie() { const removeBackgroundCheckbox = document.querySelector("#removebackground"); const value = removeBackgroundCheckbox.checked; document.cookie = `removeBackground=${value}; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/`; +} + +function exportToJson() { + window.location.href = "endpoints/subscriptions/export.php"; } \ No newline at end of file diff --git a/settings.php b/settings.php index e286b1bf3..a8b1ed8cd 100644 --- a/settings.php +++ b/settings.php @@ -526,6 +526,15 @@ + + From 323679e7716ca5ffda93526b165230a217f24e58 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 14 Feb 2024 16:54:16 +0100 Subject: [PATCH 08/27] Automatically run migration script when loading the registration page. --- .gitignore | 1 + scripts/registration.js | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index 7506f36fd..9143a9f13 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ !/images/uploads/logos/wallos.png .DS_Store .idea/ +.vscode/ diff --git a/scripts/registration.js b/scripts/registration.js index 3c7545bad..5bd231a42 100644 --- a/scripts/registration.js +++ b/scripts/registration.js @@ -52,7 +52,18 @@ function changeLanguage(selectedLanguage) { location.reload(); } +function runDatabaseMigration() { + let url = "endpoints/db/migrate.php"; + fetch(url) + .then(response => { + if (!response.ok) { + throw new Error(translate('network_response_error')); + } + }); +} + window.onload = function () { restoreFormFields(); removeFromStorage(); + runDatabaseMigration(); }; \ No newline at end of file From f53f2535d0ce72258c9c23262f8b2f013a9da5b1 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 14 Feb 2024 18:00:03 +0100 Subject: [PATCH 09/27] Show notes to subscriptions list on the dashboard --- endpoints/subscriptions/get.php | 1 + images/siteicons/notes.png | Bin 0 -> 846 bytes includes/list_subscriptions.php | 12 ++++++++++++ includes/version.php | 2 +- index.php | 1 + styles/styles.css | 19 +++++++++++++++++-- 6 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 images/siteicons/notes.png diff --git a/endpoints/subscriptions/get.php b/endpoints/subscriptions/get.php index 96d710d11..660d97368 100644 --- a/endpoints/subscriptions/get.php +++ b/endpoints/subscriptions/get.php @@ -55,6 +55,7 @@ $print[$id]['payer_user_id'] = $subscription['payer_user_id']; $print[$id]['price'] = floatval($subscription['price']); $print[$id]['url'] = $subscription['url']; + $print[$id]['notes'] = $subscription['notes']; if (isset($_COOKIE['convertCurrency']) && $_COOKIE['convertCurrency'] === 'true' && $currencyId != $mainCurrencyId) { $print[$id]['price'] = getPriceConverted($print[$id]['price'], $currencyId, $db); diff --git a/images/siteicons/notes.png b/images/siteicons/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb5cd8bc696aa51699cb2cff599d8009191dfb8 GIT binary patch literal 846 zcmV-U1F`&xP)G-drw-0e2$cXtCO*@ zEYTn&H4&|TTpWG@X^U62

+NG7(!ch{hpH;KR$Go($iC_Fct8s_9zrYMUJ~r;6lgK(c1$F$Q&yx zYwFkaUn<#fsrQ^dGICj`0Z-w7m$@45EbCh4Oe+TVOsEJRL$V!5P5d=aC*FIAkv5 zRjr9fFfoIiqhz44Y&5b#=0aZ8@+iULaxxj%TOgt-goR{slU~1BgR(MutDgda4yZg{ z)s_*(EKCzH8`wnZMA-7|`Fl#G{z4tn)pdsM-Mt3I<5le;Mluv^?SbG77)ZzR`O8n* z*-1kYwYRrYf8Tj1d%UVGf*Ht-J@*jN4BYt)n*rZYW+0CayT%c>)&#xr<<_T zS5kz zlWKq=+e*l{2_iT!z+ju0MJ3o>XW>4a0iXY{#Sr;vv7WFqu!VFM;Rm*1pcC0_Aia#I zV~~Cz3Io#wOa?Nl>_)B~`3+2 + +

+ + <?= translate('notes', $i18n) ?> + + +
+ \ No newline at end of file diff --git a/index.php b/index.php index 860c8bbeb..b7b13ebc4 100644 --- a/index.php +++ b/index.php @@ -88,6 +88,7 @@ $print[$id]['payer_user_id'] = $subscription['payer_user_id']; $print[$id]['price'] = floatval($subscription['price']); $print[$id]['url'] = $subscription['url']; + $print[$id]['notes'] = $subscription['notes']; if (isset($_COOKIE['convertCurrency']) && $_COOKIE['convertCurrency'] === 'true' && $currencyId != $mainCurrencyId) { $print[$id]['price'] = getPriceConverted($print[$id]['price'], $currencyId, $db); diff --git a/styles/styles.css b/styles/styles.css index c319ccfac..dec69b703 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -218,6 +218,13 @@ main > .contain { overflow: hidden; } +.subscription-notes { + display: none; + flex-direction: row; + padding: 6px 5px; + overflow: hidden; +} + .subscription-main > span, .subscription-secondary > span { display: flex; @@ -294,6 +301,12 @@ main > .contain { cursor: pointer; } +.subscription-notes > span { + display: flex; + align-items: center; + font-size: 14px; +} + @media (max-width: 768px) { .subscription-main > .name { display: none; @@ -316,11 +329,13 @@ main > .contain { } } -.subscription.is-open .subscription-secondary { +.subscription.is-open .subscription-secondary, +.subscription.is-open .subscription-notes { display: flex; } -.subscription-secondary img { +.subscription-secondary img, +.subscription-notes img { height: 20px; margin-right: 10px; } From 5d213de8b5fe46bf9c0dddf78b4a03f3700c6b61 Mon Sep 17 00:00:00 2001 From: Simon Nyssen Date: Thu, 15 Feb 2024 21:04:13 +0000 Subject: [PATCH 10/27] Add build & release pipeline for versioned images (#107) * build: add release & build pipeline * build: add variable for project type * build: [TO_REVERT] configure for pushing images to ghcr.io * build: target both x86 and arm platforms for Docker images * build: fix multi-platform builds * Revert "build: [TO_REVERT] configure for pushing images to ghcr.io" This reverts commit 070162aa8c74c519612f30cb6b3038bc98fd86ad. * build: fix image name * build: fix permission issue with release please by only running it on commits on the main branch --- .github/workflows/build-images.yml | 76 --------------------------- .github/workflows/build-release.yaml | 77 ++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 76 deletions(-) delete mode 100644 .github/workflows/build-images.yml create mode 100644 .github/workflows/build-release.yaml diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml deleted file mode 100644 index da1f80ada..000000000 --- a/.github/workflows/build-images.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Build images - -on: -# schedule: -# - cron: '0 0 * * *' # Midnight every day - workflow_dispatch: - inputs: - build_type: - description: Build Type - required: true - default: edge - type: choice - options: - - edge - - dev - - stable - -jobs: - build: - name: Build image - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - with: - platforms: amd64,arm64,arm - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - - name: Create the tag - id: image_tag - run: | - choice="${{ inputs.build_type }}" - out="" - - # if the workflow is running on a branch, let the tag be the branch name - if [[ $GITHUB_REF == "refs/heads/"* ]] ; then - echo "TAG=${GITHUB_REF#'refs/heads/'}" >> $GITHUB_OUTPUT - exit 0 - fi - - tag="${GITHUB_REF#'refs/tags/'}" - case $choice in - edge) - out="TAG=$tag-edge" - ;; - dev) - out="TAG=$tag-dev" - ;; - stable) - out="TAG=$tag-stable,${{ vars.DOCKERHUB_TAG }}:latest" - ;; - esac - echo $out >> $GITHUB_OUTPUT - - - name: Build and publish image - uses: docker/build-push-action@v5 - with: - context: . - push: true - tags: ${{ vars.DOCKERHUB_TAG }}:${{ steps.image_tag.outputs.TAG }} - platforms: linux/amd64,linux/arm64,linux/arm/v7 - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.github/workflows/build-release.yaml b/.github/workflows/build-release.yaml new file mode 100644 index 000000000..e5f237a37 --- /dev/null +++ b/.github/workflows/build-release.yaml @@ -0,0 +1,77 @@ +name: Build & Release +on: + push: + branches: + - "*" + pull_request: + branches: + - main +permissions: + contents: write + pull-requests: write + packages: write +env: + # login to docker hub with provided secrets + REGISTRY: docker.io + REGISTRY_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + IMAGE_NAME: bellamy/wallos + # For release-please, see available types at https://github.com/google-github-actions/release-please-action/tree/v4/?tab=readme-ov-file#release-types-supported + PROJECT_TYPE: simple +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - id: rp + if: github.event_name != 'pull_request' && github.ref_name == 'main' + uses: google-github-actions/release-please-action@v4 + with: + release-type: ${{ env.PROJECT_TYPE }} + - name: Log into registry ${{ env.REGISTRY }} + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ env.REGISTRY_USERNAME }} + password: ${{ env.REGISTRY_PASSWORD }} + - name: Prepare tags for Docker meta + id: tags + env: + # When release please is skipped, these values will be empty + is_release: ${{ steps.rp.outputs.release_created }} + version: v${{ steps.rp.outputs.major }}.${{ steps.rp.outputs.minor }}.${{ steps.rp.outputs.patch }} + run: | + tags="" + if [[ "$is_release" = 'true' ]]; then + tags="type=semver,pattern={{version}},value=$version + type=semver,pattern={{major}},value=$version + type=semver,pattern={{major}}.{{minor}},value=$version" + else + tags="type=ref,event=branch + type=ref,event=pr" + fi + { + echo 'tags<> "$GITHUB_OUTPUT" + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: ${{ steps.tags.outputs.tags }} + # necessary for multi-platform images + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + # necessary for multi-platform images + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: linux/amd64,linux/arm64,linux/arm/v7 From 92337efa90d486c0f95e607d39646c8ec57dbac2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 22:27:54 +0100 Subject: [PATCH 11/27] chore(main): release 1.0.0 (#117) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..ef235077f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +## 1.0.0 (2024-02-15) + + +### Features + +* add workflow for building and publishing docker images ([970c96a](https://github.com/ellite/Wallos/commit/970c96a8c904809544c944071986be2a684daf50)) +* specify image stability type when triggering build ([5b22cfd](https://github.com/ellite/Wallos/commit/5b22cfd87a94a865f53b282964961862bbea1861)) + + +### Bug Fixes + +* Currency not preselected on registration ([fc56cf6](https://github.com/ellite/Wallos/commit/fc56cf69ef22a07978022265b2e8344dc293eb14)) +* Language sort order ([884a8e5](https://github.com/ellite/Wallos/commit/884a8e569339ddbcb89af4634c0c845b053affbb)) From dd02eca3306c05b60dc9c226254e4defbc4e844b Mon Sep 17 00:00:00 2001 From: ChingRu Date: Fri, 16 Feb 2024 06:27:44 +0800 Subject: [PATCH 12/27] =?UTF-8?q?[i18n]=20Add=20Traditional=20Chinese=20?= =?UTF-8?q?=E7=B9=81=E9=AB=94=E4=B8=AD=E6=96=87=20(zh=5Ftw).=20(#116)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: add traditional Chinese translation --- includes/i18n/jp.php | 6 +- includes/i18n/languages.php | 1 + includes/i18n/zh_cn.php | 4 +- includes/i18n/zh_tw.php | 212 ++++++++++++++++++++++++++++++++++++ scripts/i18n/zh_tw.js | 34 ++++++ 5 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 includes/i18n/zh_tw.php create mode 100644 scripts/i18n/zh_tw.js diff --git a/includes/i18n/jp.php b/includes/i18n/jp.php index a305ebfdc..3e6870529 100644 --- a/includes/i18n/jp.php +++ b/includes/i18n/jp.php @@ -53,7 +53,7 @@ "logo_preview" => "ロゴのプレビュー", "search_logo" => "ウェブ上でロゴを検索する", "web_search" => "ウェブ検索", - "currency" => "通過", + "currency" => "通貨", "billing_cycle" => "請求サイクル", "frequency" => "頻度", "cycle" => "サイクル", @@ -107,7 +107,7 @@ "save_category" => "カテゴリを保存", "delete_category" => "カテゴリを削除", "cant_delete_category_in_use" => "定期購入で使用中のカテゴリは削除できません", - "currencies" => "通過", + "currencies" => "通貨", "save_currency" => "通貨を保存", "delete_currency" => "通貨を削除", "cant_delete_main_currency" => "メイン通貨は削除できません", @@ -157,7 +157,7 @@ "failed_to_store_currency" => "データベースに通貨を保存できませんでした", "currency_in_use" => "定期購入で使用中の通貨は削除できません", "currency_is_main" => "メイン通貨に設定中の通貨は削除できません", - "failed_to_remove_currency" => "データベースから通過を削除できませんでした", + "failed_to_remove_currency" => "データベースから通貨を削除できませんでした", "failed_to_store_api_key" => "データベースにAPIキーを保存できませんでした", "invalid_api_key" => "無効なAPIキーです", "api_key_saved" => "APIキーの保存に成功", diff --git a/includes/i18n/languages.php b/includes/i18n/languages.php index 95ff52831..4a8abc1d2 100644 --- a/includes/i18n/languages.php +++ b/includes/i18n/languages.php @@ -13,6 +13,7 @@ "pt" => "Português", "tr" => "Türkçe", "zh_cn" => "简体中文", + "zh_tw" => "繁體中文", ] ?> diff --git a/includes/i18n/zh_cn.php b/includes/i18n/zh_cn.php index 3495f7bc7..611a3f3ca 100644 --- a/includes/i18n/zh_cn.php +++ b/includes/i18n/zh_cn.php @@ -207,4 +207,6 @@ "error_updating_user_data" => "更新用户数据时出错。", "user_details_saved" => "用户详细信息已保存", -]; \ No newline at end of file +]; + +?> \ No newline at end of file diff --git a/includes/i18n/zh_tw.php b/includes/i18n/zh_tw.php new file mode 100644 index 000000000..3c2b79be3 --- /dev/null +++ b/includes/i18n/zh_tw.php @@ -0,0 +1,212 @@ + "請先建立帳號再登錄", + 'username' => "使用者名稱", + 'password' => "密碼", + "email" => "電子信箱", + "confirm_password" => "確認密碼", + "main_currency" => "主要貨幣單位", + "language" => "語言", + "passwords_dont_match" => "密碼不一致", + "registration_failed" => "註冊失敗,請再試一次。", + "register" => "註冊", + + // 登錄頁面 + 'please_login' => "請先登錄", + 'stay_logged_in' => "保持登錄 30 天", + 'login' => "登錄", + 'login_failed' => "登錄資訊錯誤", + + // 頁眉 + 'subscriptions' => "訂閱", + 'stats' => "統計", + 'settings' => "設定", + 'about' => "關於", + 'logout' => "登出", + + // 訂閱頁面 + "subscription" => "訂閱", + "no_subscriptions_yet" => "目前還沒有任何訂閱", + "add_first_subscription" => "新增第一個訂閱", + 'new_subscription' => "新訂閱", + 'sort' => "排序", + 'name' => "名稱", + 'last_added' => "建立時間", + 'price' => "價格", + 'next_payment' => "下次付款時間", + 'member' => "成員", + 'category' => "分類", + 'payment_method' => "付款方式", + "Daily" => "每日", + "Weekly" => "每週", + "Monthly" => "每月", + "Yearly" => "每年", + "days" => "天", + "weeks" => "週", + "months" => "月", + "years" => "年", + "external_url" => "查看外部連結", + "empty_page" => "空白頁面", + + // 訂閱表單 + "add_subscription" => "新增訂閱", + "edit_subscription" => "編輯訂閱", + "subscription_name" => "訂閱名稱", + "logo_preview" => "圖標預覽", + "search_logo" => "在網路上搜尋圖標", + "web_search" => "網頁搜尋", + "currency" => "貨幣", + "billing_cycle" => "帳單週期", + "frequency" => "頻率", + "cycle" => "週期", + "next_payment" => "下次付款", + "payment_method" => "付款方式", + "no_category" => "無分類", + "paid_by" => "付款人", + "url" => "連結", + "notes" => "備註", + "enable_notifications" => "為該訂閱開啟通知", + "delete" => "刪除", + "cancel" => "取消", + "upload_logo" => "上傳圖標", + + // 統計頁面 + 'general_statistics' => "整體統計", + 'active_subscriptions' => "訂閱中", + 'monthly_cost' => "每月費用", + 'yearly_cost' => "每年費用", + 'average_monthly' => "平均每月訂閱費用", + 'most_expensive' => "最高的訂閱費用", + 'amount_due' => "本月應付金額", + 'split_views' => "分割表示", + 'category_split' => "類別表示", + 'household_split' => "家庭表示", + + // 關於頁面 + 'about_and_credits' => "關於和致謝", + 'license' => "授權許可", + 'issues_and_requests' => "問題回饋與功能請求", + 'the_author' => "作者", + 'icons' => "圖標", + 'payment_icons' => "付款圖標", + + // 設定頁面 + 'user_details' => "用戶詳情", + "household" => "家庭", + "save_member" => "保存成員", + "delete_member" => "刪除成員", + "cant_delete_member" => "無法刪除主要成員", + "cant_delete_member_in_use" => "無法刪除擁有訂閱的成員", + "notifications" => "通知", + "enable_email_notifications" => "啟用電子信箱通知", + "notify_me" => "通知提前時間", + "day_before" => "天", + "days_before" => "天", + "smtp_address" => "SMTP 信箱地址", + "port" => "連接埠", + "smtp_username" => "SMTP 使用者名稱", + "smtp_password" => "SMTP 密碼", + "from_email" => "寄件人信箱(可選)", + "smtp_info" => "SMTP 密碼將以明文傳輸和儲存。為了安全起見,建議專門為 Wallos 建立一個帳戶。", + "categories" => "分類", + "save_category" => "保存分類", + "delete_category" => "刪除分類", + "cant_delete_category_in_use" => "無法刪除正在訂閱中的分類", + "currencies" => "貨幣", + "save_currency" => "保存貨幣", + "delete_currency" => "刪除貨幣", + "cant_delete_main_currency" => "無法刪除主要貨幣", + "cant_delete_currency_in_use" => "無法刪除正在使用中的貨幣", + "exchange_update" => "匯率最後更新於", + "currency_info" => "如要查詢支援的貨幣與相對應的貨幣代碼,請前往", + "currency_performance" => "為提高性能,建議您只保留常用的貨幣。", + "fixer_api_key" => "Fixer API 密鑰", + "api_key" => "API 密鑰", + "fixer_info" => "如果您使用多種貨幣單位,且希望統計資訊和訂閱排序更加精確,則需要 Fixer API 密鑰來查詢匯率(可免費申請)。", + "get_key" => "申請密鑰", + "display_settings" => "顯示設定", + "switch_theme" => "切換淺色/深色主題", + "calculate_monthly_price" => "計算並顯示所有訂閱的每月價格", + "convert_prices" => "始終按照我的主要貨幣單位轉換和顯示價格(較慢)", + "experimental_settings" => "實驗性設定", + "remove_background" => "嘗試從圖片搜尋中移除圖標的背景顏色(實驗性)", + "experimental_info" => "實驗性設定,可能存在問題。", + "payment_methods" => "付款方式", + "payment_methods_info" => "點擊付款方式以停用/啟用。", + "cant_delete_payment_method_in_use" => "無法停用正在使用的付款方式", + "disable" => "停用", + "enable" => "啟用", + "test" => "測試", + "add" => "新增", + "save" => "保存", + "export_subscriptions" => "導出訂閱", + "export_to_json" => "導出為 JSON 檔案", + + // Toast + "success" => "成功", + + // Endpoint responses + "session_expired" => "目前的工作階段已經過期,請重新登錄", + "fields_missing" => "部分欄位未填寫", + "fill_all_fields" => "請填寫所有欄位", + "fill_mandatory_fields" => "請填寫所有必填欄位", + "error" => "錯誤", + + // Category + "failed_add_category" => "新增分類失敗", + "failed_edit_category" => "編輯分類失敗", + "category_in_use" => "分類正在被訂閱使用中,無法移除", + "failed_remove_category" => "移除分類失敗", + "category_saved" => "分類已保存", + "category_removed" => "分類已移除", + + // Currency + "currency_saved" => "已保存。", + "error_adding_currency" => "新增貨幣時發生錯誤。", + "failed_to_store_currency" => "儲存貨幣到資料庫失敗。", + "currency_in_use" => "貨幣正在被訂閱使用中,無法刪除。", + "currency_is_main" => "貨幣已被設定為主貨幣,無法刪除。", + "failed_to_remove_currency" => "從資料庫中刪除貨幣失敗。", + "failed_to_store_api_key" => "儲存 API 密鑰到資料庫失敗。", + "invalid_api_key" => "API 密鑰無效。", + "api_key_saved" => "API 密鑰已成功保存", + "currency_removed" => "貨幣已移除", + + // Household + "failed_add_household" => "新增家庭成員失敗", + "failed_edit_household" => "編輯家庭成員失敗", + "failed_remove_household" => "移除家庭成員失敗", + "household_in_use" => "此成員有相關的訂閱,無法移除", + "member_saved" => "成員已保存", + "member_removed" => "成員已移除", + + // Notifications + "error_saving_notifications" => "保存通知資料時發生錯誤。", + "wallos_notification" => "Wallos 通知", + "test_notification" => "這是一條測試用的通知。如果您看到此消息,說明 Wallos 通知信箱功能設定正確。", + "email_error" => "發送到電子信箱時發生錯誤", + "notification_sent_successfuly" => "通知已成功發送", + "notifications_settings_saved" => "通知設定已成功保存。", + + // Payments + "payment_in_use" => "無法停用正在使用的付款方式", + "failed_update_payment" => "更新資料庫中的付款方式失敗", + "enabled" => "已啟用", + "disabled" => "已停用", + + // Subscription + "error_fetching_image" => "讀取圖片時發生錯誤", + "subscription_updated_successfuly" => "訂閱已成功更新", + "subscription_added_successfuly" => "訂閱已成功新增", + "error_deleting_subscription" => "刪除訂閱時發生錯誤。", + "invalid_request_method" => "請求方法無效。", + + // User + "error_updating_user_data" => "更新用戶資料時發生錯誤。", + "user_details_saved" => "用戶詳細訊息已保存", + +]; + +?> \ No newline at end of file diff --git a/scripts/i18n/zh_tw.js b/scripts/i18n/zh_tw.js new file mode 100644 index 000000000..ed8488ed3 --- /dev/null +++ b/scripts/i18n/zh_tw.js @@ -0,0 +1,34 @@ +let i18n = { + // Dashboard + 'error_reloading_subscription': '重新讀取訂閱時發生錯誤:', + 'error_fetching_image_results': '抓取圖片時發生錯誤:', + 'subscription_deleted': '訂閱已刪除', + 'error_deleting_subscription': "刪除訂閱時發生錯誤", + 'failed_to_load_subscription': "讀取訂閱失敗", + 'edit_subscription': "編輯訂閱", + 'add_subscription': "新增訂閱", + // Settings + 'network_response_error': "網路無回應", + 'failed_add_member': '新增成員失敗', + 'member': '成員', + 'save_member': '保存成員', + 'delete_member': '刪除成員', + 'failed_remove_member': '移除成員失敗', + 'failed_save_member': '保存成員失敗', + 'failed_add_category': '新增類別失敗', + 'category': '類別', + 'save_category': '保存類別', + 'delete_category': '刪除類別', + 'failed_remove_category': '移除類別失敗', + 'currency': '貨幣', + 'currency_code': '貨幣代碼', + 'save_currency': '保存貨幣', + 'delete_currency': '刪除貨幣', + 'failed_remove_currency': '移除貨幣失敗', + 'failed_save_currency': '保存貨幣失敗', + 'cant_disable_payment_in_use': '無法停用正在使用中的支付方式', + 'failed_save_payment_method': '保存支付方式失敗', + 'unknown_error': '發生未知的錯誤,請再試一次。', + 'error_saving_notification_data': '保存通知資料時發生錯誤', + 'error_sending_notification': '發送通知時發生錯誤', +}; From 03b175d1759b863ce085d87c45cc9b69807783b1 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Sat, 17 Feb 2024 10:33:37 +0100 Subject: [PATCH 13/27] GitHub actions (#118) * chore: change tags to build * docs: remove not needed arm instructions --- .github/workflows/build-release.yaml | 7 +++---- README.md | 10 ---------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-release.yaml b/.github/workflows/build-release.yaml index e5f237a37..2e5b7d311 100644 --- a/.github/workflows/build-release.yaml +++ b/.github/workflows/build-release.yaml @@ -15,7 +15,7 @@ env: REGISTRY: docker.io REGISTRY_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - IMAGE_NAME: bellamy/wallos + IMAGE_NAME: ${{ vars.DOCKERHUB_TAG }} # For release-please, see available types at https://github.com/google-github-actions/release-please-action/tree/v4/?tab=readme-ov-file#release-types-supported PROJECT_TYPE: simple jobs: @@ -44,11 +44,10 @@ jobs: tags="" if [[ "$is_release" = 'true' ]]; then tags="type=semver,pattern={{version}},value=$version - type=semver,pattern={{major}},value=$version - type=semver,pattern={{major}}.{{minor}},value=$version" + type=ref,event=branch,value=main" else tags="type=ref,event=branch - type=ref,event=pr" + type=ref,event=pr" fi { echo 'tags< Date: Sun, 18 Feb 2024 15:18:04 +0100 Subject: [PATCH 14/27] fix: show translated no category when sorting by category (#122) * fix: show translated no category when sorting by category * chore: allow caching of docker building images --- .github/workflows/build-release.yaml | 2 ++ includes/list_subscriptions.php | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-release.yaml b/.github/workflows/build-release.yaml index 2e5b7d311..86af6d0fc 100644 --- a/.github/workflows/build-release.yaml +++ b/.github/workflows/build-release.yaml @@ -74,3 +74,5 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} platforms: linux/amd64,linux/arm64,linux/arm/v7 + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/includes/list_subscriptions.php b/includes/list_subscriptions.php index 8b12de30f..3a7aed1b1 100644 --- a/includes/list_subscriptions.php +++ b/includes/list_subscriptions.php @@ -70,7 +70,13 @@ function printSubscriptions($subscriptions, $sort, $categories, $members, $i18n) if ($sort == "category_id" && $subscription['category_id'] != $currentCategory) { ?>
- +
Date: Sun, 18 Feb 2024 15:19:47 +0100 Subject: [PATCH 15/27] chore(main): release 1.0.1 (#123) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef235077f..42ba2e657 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.0.1](https://github.com/ellite/Wallos/compare/v1.0.0...v1.0.1) (2024-02-18) + + +### Bug Fixes + +* show translated no category when sorting by category ([#122](https://github.com/ellite/Wallos/issues/122)) ([330c061](https://github.com/ellite/Wallos/commit/330c061b74ad1580173f3d3bc7b14048492e22d2)) + ## 1.0.0 (2024-02-15) From 6200fa5e87d3f60853c3d8b95f5d676e39b378f4 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Sun, 18 Feb 2024 16:26:54 +0100 Subject: [PATCH 16/27] feat: new statistics per payment method (#124) * feat: new statistics per payment method * fix: fix typo on english language file * fix: use translation text for deleting subscriptions --- includes/i18n/de.php | 1 + includes/i18n/el.php | 1 + includes/i18n/en.php | 3 ++- includes/i18n/es.php | 1 + includes/i18n/fr.php | 1 + includes/i18n/jp.php | 1 + includes/i18n/pt.php | 1 + includes/i18n/tr.php | 1 + includes/i18n/zh_cn.php | 1 + includes/i18n/zh_tw.php | 1 + scripts/dashboard.js | 2 +- scripts/i18n/de.js | 1 + scripts/i18n/el.js | 1 + scripts/i18n/en.js | 1 + scripts/i18n/es.js | 1 + scripts/i18n/fr.js | 1 + scripts/i18n/jp.js | 1 + scripts/i18n/pt.js | 1 + scripts/i18n/tr.js | 1 + scripts/i18n/zh_cn.js | 1 + scripts/i18n/zh_tw.js | 1 + scripts/stats.js | 8 +++++++- stats.php | 39 ++++++++++++++++++++++++++++++++++++++- 23 files changed, 67 insertions(+), 4 deletions(-) diff --git a/includes/i18n/de.php b/includes/i18n/de.php index d0f7e7150..7322836bb 100644 --- a/includes/i18n/de.php +++ b/includes/i18n/de.php @@ -78,6 +78,7 @@ 'split_views' => "Aufgeteilte Ansichten", 'category_split' => "Kategorien", 'household_split' => "Haushalt", + 'payment_method_split' => "Zahlungsmethode", // About page 'about_and_credits' => "Informationen und Danksagungen", 'license' => "Lizenz", diff --git a/includes/i18n/el.php b/includes/i18n/el.php index a956ca31c..f87082b3f 100644 --- a/includes/i18n/el.php +++ b/includes/i18n/el.php @@ -78,6 +78,7 @@ 'split_views' => "Διαχωρισμένες προβολές", 'category_split' => "Διαχωρισμός κατηγορίας", 'household_split' => "Διαχωρισμός νοικοκυριού", + 'payment_method_split' => "Διαχωρισμός τρόπου πληρωμής", // About page 'about_and_credits' => "Σχετικά και Credits", 'license' => "License", diff --git a/includes/i18n/en.php b/includes/i18n/en.php index 29deea186..5371fe149 100644 --- a/includes/i18n/en.php +++ b/includes/i18n/en.php @@ -44,7 +44,7 @@ "weeks" => "weeks", "months" => "months", "years" => "years", - "external_url" => "Visit Externarl URL", + "external_url" => "Visit External URL", "empty_page" => "Empty Page", // Subscription form "add_subscription" => "Add subscription", @@ -78,6 +78,7 @@ 'split_views' => "Split Views", 'category_split' => "Category Split", 'household_split' => "Household Split", + 'payment_method_split' => "Payment Method Split", // About page 'about_and_credits' => "About and Credits", 'license' => "License", diff --git a/includes/i18n/es.php b/includes/i18n/es.php index aa889d447..81630fc3e 100644 --- a/includes/i18n/es.php +++ b/includes/i18n/es.php @@ -78,6 +78,7 @@ 'split_views' => "Vistas Divididas", 'category_split' => "División por Categoría", 'household_split' => "División por Hogar", + 'payment_method_split' => "División por Método de Pago", // About page 'about_and_credits' => "Acerca de y Créditos", 'license' => "Licencia", diff --git a/includes/i18n/fr.php b/includes/i18n/fr.php index efe84aad2..c237a0719 100644 --- a/includes/i18n/fr.php +++ b/includes/i18n/fr.php @@ -78,6 +78,7 @@ 'split_views' => "Vues partagées", 'category_split' => "Répartition par catégorie", 'household_split' => "Répartition du ménage", + 'payment_method_split' => "Répartition par méthode de paiement", // Page À propos 'about_and_credits' => "À propos et crédits", 'license' => "Licence", diff --git a/includes/i18n/jp.php b/includes/i18n/jp.php index 3e6870529..da1ac483e 100644 --- a/includes/i18n/jp.php +++ b/includes/i18n/jp.php @@ -78,6 +78,7 @@ 'split_views' => "分割表示", 'category_split' => "カテゴリ別", 'household_split' => "世帯別", + 'payment_method_split' => "支払い方法別", // About page 'about_and_credits' => "概要とクレジット", 'license' => "License", diff --git a/includes/i18n/pt.php b/includes/i18n/pt.php index c34b3e02d..7297c8b33 100644 --- a/includes/i18n/pt.php +++ b/includes/i18n/pt.php @@ -78,6 +78,7 @@ 'split_views' => "Vistas Divididas", 'category_split' => "Por Categoria", 'household_split' => "Por Membro", + 'payment_method_split' => "Por Método de Pagamento", // About page 'about_and_credits' => "Sobre e Créditos", 'license' => "Licença", diff --git a/includes/i18n/tr.php b/includes/i18n/tr.php index 018ad1dfc..1053b7622 100644 --- a/includes/i18n/tr.php +++ b/includes/i18n/tr.php @@ -78,6 +78,7 @@ 'split_views' => "Bölünmüş Görünümler", 'category_split' => "Kategori Bölümü", 'household_split' => "Hane Bölümü", + 'payment_method_split' => "Ödeme Yöntemi Bölümü", // About page 'about_and_credits' => "Hakkında ve Teşekkürler", 'license' => "Lisans", diff --git a/includes/i18n/zh_cn.php b/includes/i18n/zh_cn.php index 611a3f3ca..ade6f2a82 100644 --- a/includes/i18n/zh_cn.php +++ b/includes/i18n/zh_cn.php @@ -83,6 +83,7 @@ 'split_views' => "拆分视图", 'category_split' => "分类视图", 'household_split' => "家庭视图", + 'payment_method_split' => "支付方式视图", // 关于页面 'about_and_credits' => "关于和鸣谢", diff --git a/includes/i18n/zh_tw.php b/includes/i18n/zh_tw.php index 3c2b79be3..c17d08086 100644 --- a/includes/i18n/zh_tw.php +++ b/includes/i18n/zh_tw.php @@ -83,6 +83,7 @@ 'split_views' => "分割表示", 'category_split' => "類別表示", 'household_split' => "家庭表示", + 'payment_method_split' => "付款方式表示", // 關於頁面 'about_and_credits' => "關於和致謝", diff --git a/scripts/dashboard.js b/scripts/dashboard.js index d56626f72..cf08b083f 100644 --- a/scripts/dashboard.js +++ b/scripts/dashboard.js @@ -145,7 +145,7 @@ function handleFileSelect(event) { } function deleteSubscription(id) { - if (confirm("Are you sure you want to delete this subscription?")) { + if (confirm(translate('confirm_delete_subscription'))) { fetch(`endpoints/subscription/delete.php?id=${id}`, { method: 'DELETE', }) diff --git a/scripts/i18n/de.js b/scripts/i18n/de.js index c696605d7..e9616f715 100644 --- a/scripts/i18n/de.js +++ b/scripts/i18n/de.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Fehler beim Laden des Abonnements", edit_subscription: "Abonnement bearbeiten", add_subscription: "Abonnement hinzufügen", + confirm_delete_subscription: "Sind Sie sicher, dass Sie dieses Abonnement löschen möchten?", // Settings network_response_error: "Netzwerkfehler", failed_add_member: "Hinzufügen von Mitglied fehlgeschlagen", diff --git a/scripts/i18n/el.js b/scripts/i18n/el.js index 1a7461d9b..b6e119652 100644 --- a/scripts/i18n/el.js +++ b/scripts/i18n/el.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Απέτυχε η φόρτωση της συνδρομής", edit_subscription: "Επεξεργασία συνδρομής", add_subscription: "Προσθήκη συνδρομής", + confirm_delete_subscription: "Είστε σίγουρος ότι θέλετε να διαγράψετε αυτή τη συνδρομή;", // Settings network_response_error: "Η ανταπόκριση του δικτύου δεν ήταν εντάξει", failed_add_member: "Αποτυχία προσθήκης μέλους", diff --git a/scripts/i18n/en.js b/scripts/i18n/en.js index aac61c9b3..d84bdfb58 100644 --- a/scripts/i18n/en.js +++ b/scripts/i18n/en.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Failed to load subscription", edit_subscription: "Edit subscription", add_subscription: "Add subscription", + confirm_delete_subscription: "Are you sure you want to delete this subscription?", // Settings network_response_error: "Network response was not ok", failed_add_member: "Failed to add member", diff --git a/scripts/i18n/es.js b/scripts/i18n/es.js index a2eb63926..d1dc3e398 100644 --- a/scripts/i18n/es.js +++ b/scripts/i18n/es.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Error al cargar la suscripción", edit_subscription: "Editar suscripción", add_subscription: "Añadir suscripción", + confirm_delete_subscription: "¿Estás seguro de que quieres eliminar esta suscripción?", // Settings network_response_error: "Error en la respuesta de la red", failed_add_member: "Error al añadir miembro", diff --git a/scripts/i18n/fr.js b/scripts/i18n/fr.js index cadc6ce6c..fb1406c58 100644 --- a/scripts/i18n/fr.js +++ b/scripts/i18n/fr.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Impossible de charger l'abonnement", edit_subscription: "Modifier l'abonnement", add_subscription: "Ajouter un abonnement", + confirm_delete_subscription: "Êtes-vous sûr de vouloir supprimer cet abonnement ?", // Paramètres network_response_error: "La réponse du réseau n'était pas correcte", failed_add_member: "Échec de l'ajout du membre", diff --git a/scripts/i18n/jp.js b/scripts/i18n/jp.js index 47fae7269..bb0d14d07 100644 --- a/scripts/i18n/jp.js +++ b/scripts/i18n/jp.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "定期購入の読み込みに失敗しました", edit_subscription: "定期購入の編集", add_subscription: "定期購入の追加", + confirm_delete_subscription: "この定期購入を削除してもよろしいですか?", // Settings network_response_error: "ネットワークの応答異常", failed_add_member: "世帯員の追加に失敗", diff --git a/scripts/i18n/pt.js b/scripts/i18n/pt.js index 4e4f337a9..ca2ae51cd 100644 --- a/scripts/i18n/pt.js +++ b/scripts/i18n/pt.js @@ -7,6 +7,7 @@ let i18n = { 'failed_to_load_subscription': 'Falha ao carregar a subscrição', 'edit_subscription': 'Editar subscrição', 'add_subscription': 'Adicionar subscrição', + 'confirm_delete_subscription': 'Tem a certeza de que deseja eliminar esta subscrição?', // Settings 'network_response_error': 'Erro de resposta de rede', 'failed_add_member': 'Falha ao adicionar membro', diff --git a/scripts/i18n/tr.js b/scripts/i18n/tr.js index 7fd8042aa..98140c204 100644 --- a/scripts/i18n/tr.js +++ b/scripts/i18n/tr.js @@ -7,6 +7,7 @@ let i18n = { failed_to_load_subscription: "Abonelik yüklenemedi", edit_subscription: "Aboneliği Düzenle", add_subscription: "Abonelik Ekle", + confirm_delete_subscription: "Bu aboneliği silmek istediğinizden emin misiniz?", // Ayarlar network_response_error: "Ağ yanıtı kabul edilmedi", failed_add_member: "Üye eklenemedi", diff --git a/scripts/i18n/zh_cn.js b/scripts/i18n/zh_cn.js index 9658d5c38..b0bdcea51 100644 --- a/scripts/i18n/zh_cn.js +++ b/scripts/i18n/zh_cn.js @@ -7,6 +7,7 @@ let i18n = { 'failed_to_load_subscription': "加载订阅失败", 'edit_subscription': "编辑订阅", 'add_subscription': "添加订阅", + 'confirm_delete_subscription': "您确定要删除此订阅吗?", // Settings 'network_response_error': "网络响应不正常", 'failed_add_member': '添加成员失败', diff --git a/scripts/i18n/zh_tw.js b/scripts/i18n/zh_tw.js index ed8488ed3..aae672427 100644 --- a/scripts/i18n/zh_tw.js +++ b/scripts/i18n/zh_tw.js @@ -7,6 +7,7 @@ let i18n = { 'failed_to_load_subscription': "讀取訂閱失敗", 'edit_subscription': "編輯訂閱", 'add_subscription': "新增訂閱", + 'confirm_delete_subscription': "您確定要刪除此訂閱嗎?", // Settings 'network_response_error': "網路無回應", 'failed_add_member': '新增成員失敗', diff --git a/scripts/stats.js b/scripts/stats.js index 98bbc628f..d67db3097 100644 --- a/scripts/stats.js +++ b/scripts/stats.js @@ -8,7 +8,13 @@ function loadGraph(container, dataPoints, currency, run) { datasets: [{ data: dataPoints.map(point => point.y), }], - labels: dataPoints.map(point => `${point.label} (${new Intl.NumberFormat(navigator.language, { style: 'currency', currency }).format(point.y)})`), + labels: dataPoints.map(point => { + if (currency) { + return `${point.label} (${new Intl.NumberFormat(navigator.language, { style: 'currency', currency }).format(point.y)})`; + } else { + return `${point.label} (${new Intl.NumberFormat(navigator.language).format(point.y)})`; + } + }), }, options: { animation: { diff --git a/stats.php b/stats.php index 7ab1262d3..2c6f67af7 100644 --- a/stats.php +++ b/stats.php @@ -60,6 +60,17 @@ function getPriceConverted($price, $currency, $database) { $categoryCost[$categoryId]['name'] = $row['name']; } +// Get payment methods +$categories = array(); +$query = "SELECT * FROM payment_methods WHERE enabled = 1"; +$result = $db->query($query); +while ($row = $result->fetchArray(SQLITE3_ASSOC)) { + $paymentMethodId = $row['id']; + $paymentMethodCount[$paymentMethodId] = $row; + $paymentMethodCount[$paymentMethodId]['count'] = 0; + $paymentMethodCount[$paymentMethodId]['name'] = $row['name']; +} + // Get code of main currency to display on statistics $query = "SELECT c.code FROM currencies c @@ -84,7 +95,7 @@ function getPriceConverted($price, $currency, $database) { $amountDueThisMonth = 0; $totalCostPerMonth = 0; -$query = "SELECT name, price, frequency, cycle, currency_id, next_payment, payer_user_id, category_id FROM subscriptions"; +$query = "SELECT name, price, frequency, cycle, currency_id, next_payment, payer_user_id, category_id, payment_method_id FROM subscriptions"; $result = $db->query($query); if ($result) { while ($row = $result->fetchArray(SQLITE3_ASSOC)) { @@ -100,11 +111,13 @@ function getPriceConverted($price, $currency, $database) { $next_payment = $subscription['next_payment']; $payerId = $subscription['payer_user_id']; $categoryId = $subscription['category_id']; + $paymentMethodId = $subscription['payment_method_id']; $originalSubscriptionPrice = getPriceConverted($price, $currency, $db); $price = getPricePerMonth($cycle, $frequency, $originalSubscriptionPrice); $totalCostPerMonth += $price; $memberCost[$payerId]['cost'] += $price; $categoryCost[$categoryId]['cost'] += $price; + $paymentMethodCount[$paymentMethodId]['count'] += 1; if ($price > $mostExpensiveSubscription) { $mostExpensiveSubscription = $price; } @@ -207,6 +220,18 @@ function getPriceConverted($price, $currency, $database) { $showMemberCostGraph = count($memberDataPoints) > 1; + $paymentMethodDataPoints = []; + foreach ($paymentMethodCount as $paymentMethod) { + if ($paymentMethod['count'] != 0) { + $paymentMethodDataPoints[] = [ + "label" => $paymentMethod['name'], + "y" => $paymentMethod["count"], + ]; + } + } + + $showPaymentMethodCountGraph = count($paymentMethodDataPoints) > 1; + if ($showMemberCostGraph) { ?>
@@ -231,6 +256,17 @@ function getPriceConverted($price, $currency, $database) { +
+
+ +
+ +
+
@@ -242,6 +278,7 @@ function getPriceConverted($price, $currency, $database) { window.onload = function() { loadGraph("categorySplitChart", , "", ); loadGraph("memberSplitChart", , "", ); + loadGraph("paymentMethidSplitChart", , "", ); } Date: Sun, 18 Feb 2024 16:30:26 +0100 Subject: [PATCH 17/27] chore(main): release 1.1.0 (#125) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42ba2e657..f4b30899a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.1.0](https://github.com/ellite/Wallos/compare/v1.0.1...v1.1.0) (2024-02-18) + + +### Features + +* new statistics per payment method ([#124](https://github.com/ellite/Wallos/issues/124)) ([6200fa5](https://github.com/ellite/Wallos/commit/6200fa5e87d3f60853c3d8b95f5d676e39b378f4)) + ## [1.0.1](https://github.com/ellite/Wallos/compare/v1.0.0...v1.0.1) (2024-02-18) From e2af9afc32bfc248f594336c50d44ad6f36f197e Mon Sep 17 00:00:00 2001 From: Jadeiin <92222981+Jadeiin@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:24:15 +0800 Subject: [PATCH 18/27] feat: enable deployment in subdirectory --- endpoints/user/save_user.php | 6 ++++-- images/icon/site.webmanifest | 2 +- includes/header.php | 4 ++-- login.php | 8 ++++---- logout.php | 4 ++-- scripts/dashboard.js | 4 ++-- scripts/registration.js | 4 ++-- scripts/settings.js | 14 +++++++------- 8 files changed, 24 insertions(+), 22 deletions(-) diff --git a/endpoints/user/save_user.php b/endpoints/user/save_user.php index 07c63f1fc..94a47bfb7 100644 --- a/endpoints/user/save_user.php +++ b/endpoints/user/save_user.php @@ -125,7 +125,9 @@ function update_exchange_rate($db) { if ($result) { $cookieExpire = time() + (30 * 24 * 60 * 60); $oldLanguage = isset($_COOKIE['language']) ? $_COOKIE['language'] : "en"; - setcookie('language', $language, $cookieExpire, '/'); + $root = str_replace('/endpoints/user', '', dirname($_SERVER['PHP_SELF'])); + $root = $root == '' ? '/' : $root; + setcookie('language', $language, $cookieExpire, $root); if ($username != $oldUsername) { $_SESSION['username'] = $username; if (isset($_COOKIE['wallos_login'])) { @@ -166,4 +168,4 @@ function update_exchange_rate($db) { echo json_encode($response); exit(); } -?> \ No newline at end of file +?> diff --git a/images/icon/site.webmanifest b/images/icon/site.webmanifest index 3087a360a..0b5a830c4 100644 --- a/images/icon/site.webmanifest +++ b/images/icon/site.webmanifest @@ -1 +1 @@ -{"name":"","short_name":"","icons":[{"src":"/images/icon/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/images/icon/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file +{"name":"","short_name":"","icons":[{"src":"android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} diff --git a/includes/header.php b/includes/header.php index 4218b42a0..0a9f7e5ea 100644 --- a/includes/header.php +++ b/includes/header.php @@ -47,7 +47,7 @@
@@ -58,7 +58,7 @@