From 0265eea7bf889e7b8102bd9774bc02debcc04bc8 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sun, 19 Jul 2020 18:58:05 +0530 Subject: [PATCH 1/5] - added French translations --- README.md | 7 ++++--- src/i18n/index.js | 16 ++++++++++------ src/i18n/locales/index.js | 2 ++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ccd3e969..a832f746 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,11 @@ For those of you familiar with the Crowdin Platform, you could do that too and j ##### Languages Currently Supported - English -- Kannada (ಕನ್ನಡ) -- Spanish (Español) (by [@jrgonzalezrios](https://github.com/jrgonzalezrios)) -- Portuguese (Brazilian) (by [Felipe CG](https://github.com/felcg)) - Finnish (Suomalainen) (by Ari Pikkarainen) +- French (Français) (by [MeisterLLD](https://github.com/MeisterLLD)) +- Kannada (ಕನ್ನಡ) +- Portuguese (Brazilian) (by [Felipe CG](https://github.com/felcg)) +- Spanish (Español) (by [@jrgonzalezrios](https://github.com/jrgonzalezrios)) ### Building from Source diff --git a/src/i18n/index.js b/src/i18n/index.js index 0a24620c..721dbded 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -8,20 +8,24 @@ const languages = [ name: 'English (US)', }, { - code: 'kn', - name: 'Kannada (ಕನ್ನಡ)', + code: 'fi', + name: 'Finnish (Suomalainen)', }, { - code: 'es', - name: 'Spanish (Español)', + code: 'fr', + name: 'French (Français)', + }, + { + code: 'kn', + name: 'Kannada (ಕನ್ನಡ)', }, { code: 'ptBr', name: 'Portuguese (Brazilian)', }, { - code: 'fi', - name: 'Finnish (Suomalainen)', + code: 'es', + name: 'Spanish (Español)', }, ]; diff --git a/src/i18n/locales/index.js b/src/i18n/locales/index.js index 9e669fcd..77402afc 100644 --- a/src/i18n/locales/index.js +++ b/src/i18n/locales/index.js @@ -3,6 +3,7 @@ import kn from './kn.json'; import es from './es.json'; import ptBr from './pt-br.json'; import fi from './fi.json'; +import fr from './fr.json'; export default { en: { translation: en }, @@ -10,4 +11,5 @@ export default { es: { translation: es }, ptBr: { translation: ptBr }, fi: { translation: fi }, + fr: { translation: fr }, }; From 6a8775e31b4b51d1486f92d16155922ec82d6d72 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sun, 19 Jul 2020 19:02:53 +0530 Subject: [PATCH 2/5] update dependencies --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0fc6529f..5cc2a0b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6704,9 +6704,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz", - "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", + "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -6717,9 +6717,9 @@ "doctrine": "^3.0.0", "enquirer": "^2.3.5", "eslint-scope": "^5.1.0", - "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.2.0", - "espree": "^7.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -6733,7 +6733,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.14", + "lodash": "^4.17.19", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -6809,14 +6809,14 @@ } }, "espree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", - "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", "dev": true, "requires": { - "acorn": "^7.2.0", + "acorn": "^7.3.1", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.2.0" + "eslint-visitor-keys": "^1.3.0" } }, "glob-parent": { diff --git a/package.json b/package.json index 2c2653b8..a8e9ad5e 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ }, "devDependencies": { "autoprefixer": "^9.8.5", - "eslint": "^7.4.0", + "eslint": "^7.5.0", "eslint-config-airbnb": "^18.2.0", "eslint-config-prettier": "^6.11.0", "eslint-loader": "^4.0.2", From 9930cee309fcec6ecf23869e8eaed7ab4e0450b1 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sun, 19 Jul 2020 20:33:11 +0530 Subject: [PATCH 3/5] - update layout to work for responsive screen sizes --- src/components/builder/center/Artboard.js | 14 +++++++-- .../builder/center/Artboard.module.css | 17 ++--------- .../builder/left/LeftSidebar.module.css | 1 - .../builder/right/RightSidebar.module.css | 1 - src/pages/app/builder.module.css | 30 +++++-------------- 5 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/components/builder/center/Artboard.js b/src/components/builder/center/Artboard.js index 7a5f4c70..6651fcb5 100644 --- a/src/components/builder/center/Artboard.js +++ b/src/components/builder/center/Artboard.js @@ -1,4 +1,4 @@ -import React, { memo } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { Helmet } from 'react-helmet'; import { useTranslation } from 'react-i18next'; import { useSelector } from '../../../contexts/ResumeContext'; @@ -13,9 +13,14 @@ import styles from './Artboard.module.css'; const Artboard = () => { const state = useSelector(); const { t } = useTranslation(); + const [width, setWidth] = useState(0); const { id, name, metadata } = state; const { template } = metadata; + useEffect(() => { + setWidth(typeof window !== `undefined` && window && window.innerWidth); + }, [typeof window !== `undefined` && window && window.innerWidth]); + return ( <> @@ -25,7 +30,12 @@ const Artboard = () => { -
+
{template === 'onyx' && } {template === 'pikachu' && } {template === 'gengar' && } diff --git a/src/components/builder/center/Artboard.module.css b/src/components/builder/center/Artboard.module.css index 045ab997..5ad63bf9 100644 --- a/src/components/builder/center/Artboard.module.css +++ b/src/components/builder/center/Artboard.module.css @@ -1,22 +1,9 @@ @media screen { .container { - width: 210mm; - height: 297mm; - zoom: 0.5; + width: 794px; + min-height: 1122px; overflow: scroll; box-shadow: var(--shadow); @apply my-16 bg-white rounded; } } - -@media screen and (min-width: 1366px) { - .container { - zoom: 0.65; - } -} - -@media screen and (min-width: 1440px) { - .container { - zoom: 0.8; - } -} \ No newline at end of file diff --git a/src/components/builder/left/LeftSidebar.module.css b/src/components/builder/left/LeftSidebar.module.css index 65c96f6d..cc4dbcbe 100644 --- a/src/components/builder/left/LeftSidebar.module.css +++ b/src/components/builder/left/LeftSidebar.module.css @@ -1,6 +1,5 @@ .container { z-index: 10; - box-shadow: var(--left-shadow); @apply w-full h-screen overflow-scroll p-8; @apply grid gap-8; } \ No newline at end of file diff --git a/src/components/builder/right/RightSidebar.module.css b/src/components/builder/right/RightSidebar.module.css index de68bb23..7f0ccf8c 100644 --- a/src/components/builder/right/RightSidebar.module.css +++ b/src/components/builder/right/RightSidebar.module.css @@ -1,6 +1,5 @@ .container { z-index: 10; - box-shadow: var(--right-shadow); @apply w-full h-screen overflow-scroll p-8; @apply grid gap-8; } diff --git a/src/pages/app/builder.module.css b/src/pages/app/builder.module.css index c53f47c0..c475f80e 100644 --- a/src/pages/app/builder.module.css +++ b/src/pages/app/builder.module.css @@ -1,33 +1,19 @@ .container { - @apply w-screen h-screen grid grid-cols-10; + @apply relative h-screen w-screen overflow-hidden flex items-start justify-center; } .left { - @apply col-span-3; + width: calc(100vw / 4); + box-shadow: var(--left-shadow); + @apply bg-primary-50 absolute top-0 bottom-0 left-0 z-10; } .center { - @apply col-span-4 h-screen overflow-scroll bg-primary-100 grid justify-center items-center; + @apply relative z-0 h-screen overflow-scroll; } .right { - @apply col-span-3; + width: calc(100vw / 4); + box-shadow: var(--right-shadow); + @apply bg-primary-50 absolute top-0 bottom-0 right-0 z-10; } - -@media screen and (min-width: 1440px) { - .container { - @apply grid-cols-11; - } - - .left { - @apply col-span-3; - } - - .center { - @apply col-span-5; - } - - .right { - @apply col-span-3; - } -} \ No newline at end of file From 5e4dc8c4bd1fda15111aed8bf44d2c1264b3ed9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Avc=C4=B1?= Date: Sun, 19 Jul 2020 19:04:50 +0300 Subject: [PATCH 4/5] Added Turkish language support --- src/i18n/locales/tr.json | 249 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 src/i18n/locales/tr.json diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json new file mode 100644 index 00000000..2215f597 --- /dev/null +++ b/src/i18n/locales/tr.json @@ -0,0 +1,249 @@ +{ + "shared": { + "appName": "Reactive Resume", + "shortDescription": "Ücretsiz ve açık kaynak CV oluşturucu.", + "forms": { + "name": "Ad", + "title": "Başlık", + "subtitle": "Alt Başlık", + "required": "Gerekli", + "website": "Web Sitesi", + "date": "Tarih", + "position": "Pozisyon", + "startDate": "Başlangıç Tarihi", + "endDate": "Bitiş Tarihi", + "address": "Adres", + "phone": "Telefon Numarası", + "email": "Email Adresi", + "summary": "Özet", + "markdown": "Bu yazı alanı <1>markdown destekliyor.", + "validation": { + "min": "Lütfen en az {{number}} karakter giriniz.", + "dateRange": "Bitiş Tarihi, Başlangıç Tarihi'nden sonra olmalıdır.", + "email": "Geçerli bir email adresi olmak zorundadır.", + "required": "Zorunlu alan.", + "url": "Geçerli bir URL olmalıdır." + } + }, + "buttons": { + "add": "Ekle", + "edit": "Düzenle", + "cancel": "İptal", + "delete": "Sil", + "loading": "Yükleniyor...", + "confirmation": "Emin misiniz?", + "login": "Giriş", + "logout": "Çıkış" + } + }, + "landing": { + "hero": { + "goToApp": "Uygulamaya Git" + } + }, + "dashboard": { + "title": "Panel", + "createResume": "CV Oluştur", + "editResume": "CV Düzenle", + "lastUpdated": "Son Güncelleme {{timestamp}}", + "toasts": { + "deleted": "{{name}} başarılı bir şekilde silindi" + }, + "buttons": { + "duplicate": "Çoğalt", + "rename": "Yeniden Adlandır" + }, + "helpText": "En baştan yeni bir CV oluşturuyor olacaksınız, ama öncelikle CV'nize bir isim verin. Bu isim başvurmak istediğiniz pozisyonla ilgili olabilir, veya bir arkadaşınız için CV oluşturuyorsanız, Ali'nin CV'si diyebilirsiniz." + }, + "builder": { + "toasts": { + "formErrors": "Formu göndermeden önce bütün gerekli alanları doldurmanız gerekebilir.", + "doesNotExist": "Aradığınız CV artık mevcut değil... Ya da hiç olmadı?", + "loadDemoData": "Nereden başlayacağınızı bilmiyor musunuz? Demo veri yüklemeyi deneyin ve Reactive Resume'nin sunduklarına bakın." + }, + "sections": { + "heading": "Başlık", + "profile": "Profil", + "social": "Sosyal Ağ", + "objective": "Amaç", + "work": "İş Tecrübesi", + "education": "Eğitim", + "project": "Proje", + "projects": "Projeler", + "award": "Ödül", + "awards": "Ödüller", + "certification": "Sertifika", + "certifications": "Sertifikalar", + "skill": "Yetenek", + "skills": "Yetenekler", + "hobby": "Hobi", + "hobbies": "Hobiler", + "language": "Dil", + "languages": "Diller", + "reference": "Referans", + "references": "Referanslar", + "templates": "Şablonlar", + "layout": "Düzen", + "colors": "Renkler", + "fonts": "Fontlar", + "actions": "Eylemler", + "settings": "Ayarlar", + "about": "Hakkında" + }, + "profile": { + "photograph": "Fotoğraf", + "firstName": "Ad", + "lastName": "Soyad", + "address": { + "line1": "Adres Satırı 1", + "line2": "Adres Satırı 2", + "city": "Şehir", + "pincode": "Posta Kodu" + } + }, + "social": { + "network": "Ağ", + "username": "Kullanıcı Adı", + "url": "URL" + }, + "work": { + "company": "Şirket" + }, + "education": { + "institution": "Kurum", + "field": "Alan", + "degree": "Diploma Türü", + "gpa": "GPA" + }, + "awards": { + "awarder": "Ödülü Veren" + }, + "certifications": { + "issuer": "Sertifika veren" + }, + "skills": { + "level": "Düzey" + }, + "languages": { + "fluency": "Akıcılık" + }, + "layout": { + "block": "Alan", + "reset": "Düzeni Sıfırla", + "text": "Bu şablon {{count}} alanı destekliyor." + }, + "colors": { + "primary": "Ana Renk", + "text": "Yazı Rengi", + "background": "Arkaplan Rengi" + }, + "actions": { + "import": { + "heading": "CV'nizi İçeri Aktarın", + "text": "Bilgilerinizi JSON Resume ya da LinkedIn gibi çeşitli kaynaklardan içeri aktararak CV'nizdeki verilerin çoğunu otomatik olarak doldurabilirsiniz.", + "button": "İçeri Aktar" + }, + "export": { + "heading": "CV'nizi Dışarı Aktarın", + "text": "CV'nizi işverenlerle paylaşmak üzere PDF olarak, ya da başka bir bilgisayarda bu uygulamada kullanmak üzere JSON olarak dışarı aktarın.", + "button": "Dışarı Aktar" + }, + "share": { + "heading": "CV'nizi Paylaşın", + "text": "Aşağıdaki linki paylaşmayı seçtiğiniz takdirde açıkça ulaşılabilir olacaktır ve görüntüleyenler CV'nizin en son versiyonuna her hangi bir zamanda ulaşabilecektir." + }, + "loadDemoData": { + "text": "Yeni boş bir sayfa ile ne yapacağınızı bilemiyor musunuz? Bir CV'nin nasıl görünmesi gerektiğini görmek için demo veri yükleyin ve sonrasında düzenlemeye başlayın.", + "button": "Demo Veri Yükle" + }, + "resetEverything": { + "text": "Çok fazla hata yaptığınızı mı düşünüyorsunuz? Endişelenmeyin, her şeyi tek bir tık ile temizleyebilirsiniz, fakat yedeklemeniz yoksa dikkatli olun.", + "button": "Her Şeyi Sıfırla" + } + }, + "settings": { + "theme": "Tema", + "language": "Dil", + "translate": "Kendi dilinizde çeviri sağlayarak katkıda bulunmak isterseniz, <1>lütfen bu linki ziyaret edin.", + "dangerZone": { + "heading": "Tehlike Bölgesi", + "text": "Eğer hesabınızı ve tüm CV'lerinizi silmek istiyorsanız sadece bir buton uzağınızda. Bu geri döndürülemez bir işlem olduğundan, lütfen dikkatli olun.", + "button": "Hesabı Sil" + } + }, + "about": { + "donate": { + "heading": "Reactive Resume'ye Bağış Yap", + "text": "Elimden geleni yapmaya çalışıyorum, fakat uygulamayı yararlı bulduysanız, ya da ilk işleri için bu uygulamaya ihtiyaç duyan diğerlerinden daha iyi bir durumdaysanız, <1>lütfen uygulamayı hayatta tutmak için 5$ gibi ufak bir meblağ bağışlamayı gözden geçirin :)", + "button": "Bana kahve ısmarlayın!" + }, + "bugFeature": { + "heading": "Bug? Özellik İsteği?", + "text": "CV oluşturma sürecinizi aksatan bir şey mi var? Sinir bozucu bir bug mı buldunuz? Aşağıdaki eylemleri kullanarak GitHub Issues kısmında bundan bahsedin.", + "button": "Sorun Bildir" + }, + "appreciate": { + "heading": "Reactive Resume'yi Sevdiniz Mi?", + "text": "Bu uygulamanın insanlara nasıl yardımcı olduğu hakkında hikayeler duymaktan sıkılmıyorum, ya da sadece Reactive Resume'nin ne kadar etkileyici bir uygulama olduğunu bana söylemek istiyorsanız, haberim olsun. Bana web sitemden ulaşabilirsiniz." + }, + "sourceCode": { + "heading": "Kaynak Kodu", + "text": "Projeyi kaynağından mı çalıştırmak istiyorsunuz? Bu projenin açık kaynak gelişimine katkı yapmak isteyen bir geliştirici misiniz? Aşağıdaki butona tıklayın", + "button": "GitHub Repo" + }, + "footer": "<1>Amruth Pillai tarafından sevgi ile yapıldı." + }, + "tooltips": { + "uploadPhotograph": "Fotoğraf Yükle", + "backToDashboard": "Panele Dön" + }, + "emptyList": "Bu liste boş." + }, + "modals": { + "auth": { + "whoAreYou": "Siz kimsiniz?", + "welcome": "Hoşgeldin, {{name}}!", + "loggedOutText": "Reactive Resume'nin kimliğinizi doğrulaması ve size sadece sizin bilgilerini gösterebilmesi için kim olduğunuzu bilmesi gerekiyor. Giriş yaptığınızda CV'nizi oluşturmaya, yeni yetenekler eklemek üzere düzenlemeye ya da onu dünya ile paylaşmaya başlayabilirsiniz!", + "loggedInText": "Harika. Artık kimliğinizi doğruladığınıza göre, asıl burada olma sebebinize gelebiliriz. CV'nizi oluşturmaya başlamak için Uygulamaya Git butonuna tıklayın!", + "buttons": { + "google": "Google ile Giriş Yap", + "anonymous": "Anonim Olarak Giriş Yap" + } + }, + "import": { + "button": "Dosya Seç", + "reactiveResume": { + "heading": "Reactive Resume'den İçeri Aktar", + "text": "Reactive Resume'nin, sunduğu tüm kişiselleştirilebilir kabiliyetlerden en iyi şekilde faydalanabilmek için kendi şema formatı vardır. Eğer bu uygulama ile yapılmış bir CV'nizin yedeğini içeri aktarmak isterseniz, aşağıdaki butona tıklayarak dosyayı yükleyin." + }, + "jsonResume": { + "heading": "JSON Resume'den İçeri Aktar", + "text": "JSON Resume bir CV şema yapısı açık standartıdır. Eğer siz de CV'si bu formatta hazır olan birçok kişiden biriyseniz, Reactive Resume ile işe koyulmak için tek yapmanız gereken bir tıklamadır." + }, + "linkedIn": { + "heading": "LinkedIn'den İçeri Aktar", + "text": "Reactive Resume'den dışarı aktarılmış bir JSON dosyasını içeri aktarmak için aşağıdaki butona tıklayarak uygun dosyayı seçebilirsiniz." + } + }, + "export": { + "printDialog": { + "heading": "Tarayıcının Yazdır Penceresini Kullan", + "text": "Hızlı bir çözüm arayanların tarayıcılarından daha fazlasına ihtiyacı yok. Tek yapmanız gereken Ctrl/Cmd + P klavye kısayolu ile tarayıcınızda Yazdır penceresini açmak ve anında CV'nizi yazdırmak.", + "button": "CV Yazdır" + }, + "downloadPDF": { + "heading": "PDF İndir", + "text": "Bu seçenekler, tek bir sayfa olarak CV'nizin eksiksiz bir versiyonunu yazdırmanıza olanak sağlar. Fazla içeriği olanlar için mükemmel. Alternatif olarak, bir tık ile CV'nizin çok sayfalı bir versiyonunu da indirebilirsiniz.", + "buttons": { + "single": "Tek Sayfa CV", + "multi": "Çok Sayfalı CV" + } + }, + "jsonFormat": { + "heading": "JSON Formatında Dışarı Aktar", + "text": "Verilerinizi JSON formatında dışarı aktararak saklayabilir, dilediğiniz zaman yine Reactive Resume'de içeri aktararak kolayca düzenleme yapabilir, ya da yeni CV oluşturabilirsiniz.", + "button": "JSON Dışa Aktar" + } + } + } +} From fe645e7d4c50e987d880fea6fb664b30d1c2abce Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Mon, 20 Jul 2020 07:43:56 +0530 Subject: [PATCH 5/5] - make dates follow internationalization standard --- gatsby-config.js | 2 +- src/components/dashboard/ResumePreview.js | 10 +++-- src/i18n/locales/index.js | 8 ++-- src/templates/blocks/Awards/AwardsA.js | 39 +++++++++------- .../blocks/Certifications/CertificationsA.js | 39 +++++++++------- src/templates/blocks/Projects/ProjectsA.js | 45 +++++++++++-------- src/utils/index.js | 19 +++++--- 7 files changed, 97 insertions(+), 65 deletions(-) diff --git a/gatsby-config.js b/gatsby-config.js index dcf8873f..37b34d19 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -5,7 +5,7 @@ module.exports = { title: 'Reactive Resume', siteUrl: 'https://rxresu.me', description: 'A free and open source resume builder.', - version: '2.0.1', + version: '2.0.2', }, plugins: [ 'gatsby-plugin-react-helmet', diff --git a/src/components/dashboard/ResumePreview.js b/src/components/dashboard/ResumePreview.js index e651e140..bb47bb23 100644 --- a/src/components/dashboard/ResumePreview.js +++ b/src/components/dashboard/ResumePreview.js @@ -1,16 +1,16 @@ import { Menu, MenuItem } from '@material-ui/core'; import { navigate } from 'gatsby'; -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import React, { useContext, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { MdMoreHoriz, MdOpenInNew } from 'react-icons/md'; import { toast } from 'react-toastify'; -import { useTranslation } from 'react-i18next'; import DatabaseContext from '../../contexts/DatabaseContext'; import ModalContext from '../../contexts/ModalContext'; import styles from './ResumePreview.module.css'; const ResumePreview = ({ resume }) => { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const [anchorEl, setAnchorEl] = useState(null); const { emitter, events } = useContext(ModalContext); const { duplicateResume, deleteResume } = useContext(DatabaseContext); @@ -84,7 +84,9 @@ const ResumePreview = ({ resume }) => { {resume.updatedAt && ( {t('dashboard.lastUpdated', { - timestamp: moment(resume.updatedAt).fromNow(), + timestamp: moment(resume.updatedAt) + .locale(i18n.language.substr(0, 2)) + .fromNow(), })} )} diff --git a/src/i18n/locales/index.js b/src/i18n/locales/index.js index 77402afc..65e3588d 100644 --- a/src/i18n/locales/index.js +++ b/src/i18n/locales/index.js @@ -1,15 +1,15 @@ import en from './en.json'; -import kn from './kn.json'; import es from './es.json'; -import ptBr from './pt-br.json'; import fi from './fi.json'; import fr from './fr.json'; +import kn from './kn.json'; +import ptBr from './pt-br.json'; export default { en: { translation: en }, - kn: { translation: kn }, es: { translation: es }, - ptBr: { translation: ptBr }, fi: { translation: fi }, fr: { translation: fr }, + kn: { translation: kn }, + ptBr: { translation: ptBr }, }; diff --git a/src/templates/blocks/Awards/AwardsA.js b/src/templates/blocks/Awards/AwardsA.js index 4ea2c96e..2e54824f 100644 --- a/src/templates/blocks/Awards/AwardsA.js +++ b/src/templates/blocks/Awards/AwardsA.js @@ -1,27 +1,34 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import React, { memo, useContext } from 'react'; +import { useTranslation } from 'react-i18next'; import ReactMarkdown from 'react-markdown'; import PageContext from '../../../contexts/PageContext'; import { safetyCheck } from '../../../utils'; -const AwardItem = (x) => ( -
-
-
-
{x.title}
- {x.awarder} +const AwardItem = (x) => { + const { i18n } = useTranslation(); + + return ( +
+
+
+
{x.title}
+ {x.awarder} +
+ {x.date && ( +
+ {moment(x.date) + .locale(i18n.language.substr(0, 2)) + .format('MMMM YYYY')} +
+ )}
- {x.date && ( -
- {moment(x.date).format('MMMM YYYY')} -
+ {x.summary && ( + )}
- {x.summary && ( - - )} -
-); + ); +}; const AwardsA = () => { const { data, heading: Heading } = useContext(PageContext); diff --git a/src/templates/blocks/Certifications/CertificationsA.js b/src/templates/blocks/Certifications/CertificationsA.js index 08d9d2f2..52bcd2d9 100644 --- a/src/templates/blocks/Certifications/CertificationsA.js +++ b/src/templates/blocks/Certifications/CertificationsA.js @@ -1,27 +1,34 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import React, { memo, useContext } from 'react'; +import { useTranslation } from 'react-i18next'; import ReactMarkdown from 'react-markdown'; import PageContext from '../../../contexts/PageContext'; import { safetyCheck } from '../../../utils'; -const CertificationItem = (x) => ( -
-
-
-
{x.title}
- {x.issuer} +const CertificationItem = (x) => { + const { i18n } = useTranslation(); + + return ( +
+
+
+
{x.title}
+ {x.issuer} +
+ {x.date && ( +
+ {moment(x.date) + .locale(i18n.language.substr(0, 2)) + .format('MMMM YYYY')} +
+ )}
- {x.date && ( -
- {moment(x.date).format('MMMM YYYY')} -
+ {x.summary && ( + )}
- {x.summary && ( - - )} -
-); + ); +}; const CertificationsA = () => { const { data, heading: Heading } = useContext(PageContext); diff --git a/src/templates/blocks/Projects/ProjectsA.js b/src/templates/blocks/Projects/ProjectsA.js index f8a196a2..b92ff558 100644 --- a/src/templates/blocks/Projects/ProjectsA.js +++ b/src/templates/blocks/Projects/ProjectsA.js @@ -1,31 +1,38 @@ -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import React, { memo, useContext } from 'react'; +import { useTranslation } from 'react-i18next'; import ReactMarkdown from 'react-markdown'; import PageContext from '../../../contexts/PageContext'; import { safetyCheck } from '../../../utils'; -const ProjectItem = (x) => ( -
-
-
-
{x.title}
- {x.link && ( - - {x.link} - +const ProjectItem = (x) => { + const { i18n } = useTranslation(); + + return ( +
+
+
+
{x.title}
+ {x.link && ( + + {x.link} + + )} +
+ {x.date && ( +
+ {moment(x.date) + .locale(i18n.language.substr(0, 2)) + .format('MMMM YYYY')} +
)}
- {x.date && ( -
- {moment(x.date).format('MMMM YYYY')} -
+ {x.summary && ( + )}
- {x.summary && ( - - )} -
-); + ); +}; const ProjectsA = () => { const { data, heading: Heading } = useContext(PageContext); diff --git a/src/utils/index.js b/src/utils/index.js index 82e6d2e3..963a657c 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,5 +1,5 @@ import { get, isEmpty } from 'lodash'; -import moment from 'moment'; +import moment from 'moment/min/moment-with-locales'; import { useTranslation } from 'react-i18next'; export const getModalText = (isEditMode, type) => { @@ -22,10 +22,19 @@ export const isFileImage = (file) => { return file && acceptedImageTypes.includes(file.type); }; -export const formatDateRange = ({ startDate, endDate }) => - `${moment(startDate).format('MMMM Y')} — ${ - moment(endDate).isValid() ? moment(endDate).format('MMMM Y') : 'Present' - }`; +export const formatDateRange = ({ startDate, endDate }) => { + const { i18n } = useTranslation(); + + const start = `${moment(startDate) + .locale(i18n.language.substr(0, 2)) + .format('MMMM Y')}`; + + const end = moment(endDate).isValid() + ? `${moment(endDate).locale(i18n.language.substr(0, 2)).format('MMMM Y')}` + : 'Present'; + + return `${start} - ${end}`; +}; export const getFieldProps = (formik, schema, name) => ({ touched: get(formik, `touched.${name}`, false),