├── src ├── lang │ ├── .gitkeep │ ├── tr │ │ ├── units.php │ │ └── months.php │ ├── ja │ │ ├── units.php │ │ └── months.php │ ├── fa │ │ ├── units.php │ │ └── months.php │ ├── bn │ │ ├── units.php │ │ └── months.php │ ├── af │ │ ├── units.php │ │ └── months.php │ ├── da │ │ ├── units.php │ │ └── months.php │ ├── sv │ │ ├── units.php │ │ └── months.php │ ├── en │ │ ├── units.php │ │ └── months.php │ ├── es │ │ ├── units.php │ │ └── months.php │ ├── it │ │ ├── units.php │ │ └── months.php │ ├── pt │ │ └── units.php │ ├── bg │ │ ├── units.php │ │ └── months.php │ ├── de │ │ ├── units.php │ │ └── months.php │ ├── fr │ │ ├── units.php │ │ └── months.php │ ├── el │ │ ├── units.php │ │ └── months.php │ ├── ro │ │ ├── units.php │ │ └── months.php │ ├── nl │ │ ├── units.php │ │ └── months.php │ ├── ru │ │ ├── units.php │ │ └── months.php │ ├── uk │ │ ├── units.php │ │ └── months.php │ ├── sk │ │ ├── months.php │ │ └── units.php │ └── ar │ │ ├── months.php │ │ └── units.php └── Laravelrus │ └── LocalizedCarbon │ ├── DiffFormatters │ ├── DiffFormatterInterface.php │ ├── FaDiffFotmatter.php │ ├── AfDiffFormatter.php │ ├── ElDiffFormatter.php │ ├── EnDiffFormatter.php │ ├── TrDiffFormatter.php │ ├── NlDiffFormatter.php │ ├── JaDiffFormatter.php │ ├── EsDiffFormatter.php │ ├── ArDiffFormatter.php │ ├── SvDiffFormatter.php │ ├── FrDiffFormatter.php │ ├── BgDiffFormatter.php │ ├── PtDiffFormatter.php │ ├── RuDiffFormatter.php │ ├── ItDiffFormatter.php │ ├── SkDiffFormatter.php │ ├── UkDiffFormatter.php │ ├── RoDiffFormatter.php │ ├── DeDiffFormatter.php │ └── BnDiffFormatter.php │ ├── DiffFactoryFacade.php │ ├── LocalizedCarbonServiceProvider.php │ ├── Models │ └── Eloquent.php │ ├── Traits │ └── LocalizedEloquentTrait.php │ ├── DiffFormatterFactory.php │ └── LocalizedCarbon.php ├── tests ├── .gitkeep └── RoLocalizedCarbonTest.php ├── .gitignore ├── .travis.yml ├── phpunit.xml ├── composer.json ├── docs └── README-ru.md └── README.md /src/lang/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | /vendor 3 | composer.phar 4 | composer.lock 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /src/lang/tr/units.php: -------------------------------------------------------------------------------- 1 | "saniye", 4 | "minute" => "dakika", 5 | "hour" => "saat", 6 | "day" => "gün", 7 | "week" => "hafta", 8 | "month" => "ay", 9 | "year" => "yıl", 10 | ); 11 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/DiffFormatterInterface.php: -------------------------------------------------------------------------------- 1 | "秒", 5 | "minute" => "分", 6 | "hour" => "時間", 7 | "day" => "日", 8 | "week" => "週間|", 9 | "month" => "ヶ月", 10 | "year" => "年", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/fa/units.php: -------------------------------------------------------------------------------- 1 | "ثانیه", 4 | "minute" => "دقیقه", 5 | "hour" => "ساعت", 6 | "day" => "روز", 7 | "week" => "هفته", 8 | "month" => "ماه", 9 | "year" => "سال", 10 | ); 11 | -------------------------------------------------------------------------------- /src/lang/bn/units.php: -------------------------------------------------------------------------------- 1 | "সেকেন্ড", 4 | "minute" => "মিনিট", 5 | "hour" => "ঘন্টা", 6 | "day" => "দিন ", 7 | "week" => "সপ্তাহ", 8 | "month" => "মাস", 9 | "year" => "বছর", 10 | ]; 11 | -------------------------------------------------------------------------------- /src/lang/af/units.php: -------------------------------------------------------------------------------- 1 | "sekonde|sekondes", 4 | "minute" => "minuut|minute", 5 | "hour" => "uur|ure", 6 | "day" => "dag|dae", 7 | "week" => "week|weke", 8 | "month" => "maand|maande", 9 | "year" => "jaar|jare", 10 | ); 11 | -------------------------------------------------------------------------------- /src/lang/da/units.php: -------------------------------------------------------------------------------- 1 | "sekund|sekunder", 5 | "minute" => "minut|minutter", 6 | "hour" => "time|timer", 7 | "day" => "dag|dage", 8 | "week" => "uge|uger", 9 | "month" => "måned|måneder", 10 | "year" => "år|år", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/sv/units.php: -------------------------------------------------------------------------------- 1 | "sekund|sekunder", 5 | "minute" => "minut|minuter", 6 | "hour" => "timme|timmar", 7 | "day" => "dag|dagar", 8 | "week" => "vecka|veckor", 9 | "month" => "månad|månader", 10 | "year" => "år", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/en/units.php: -------------------------------------------------------------------------------- 1 | "second|seconds", 5 | "minute" => "minute|minutes", 6 | "hour" => "hour|hours", 7 | "day" => "day|days", 8 | "week" => "week|weeks", 9 | "month" => "month|months", 10 | "year" => "year|years", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/es/units.php: -------------------------------------------------------------------------------- 1 | "segundo|segundos", 5 | "minute" => "minuto|minutos", 6 | "hour" => "hora|horas", 7 | "day" => "día|días", 8 | "week" => "semana|semanas", 9 | "month" => "mes|meses", 10 | "year" => "año|años", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/it/units.php: -------------------------------------------------------------------------------- 1 | "secondo|secondi", 4 | "minute" => "minuto|minuti", 5 | "hour" => "ora|ore", 6 | "day" => "giorno|giorni", 7 | "week" => "settimana|settimane", 8 | "month" => "mese|mesi", 9 | "year" => "anno|anni", 10 | ); 11 | -------------------------------------------------------------------------------- /src/lang/pt/units.php: -------------------------------------------------------------------------------- 1 | "segundo|segundos", 5 | "minute" => "minuto|minutos", 6 | "hour" => "hora|horas", 7 | "day" => "dia|dias", 8 | "week" => "semana|semanas", 9 | "month" => "mês|meses", 10 | "year" => "ano|anos", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/bg/units.php: -------------------------------------------------------------------------------- 1 | "секунда|секунди", 5 | "minute" => "минута|минути", 6 | "hour" => "час|часа", 7 | "day" => "ден|дни", 8 | "week" => "седмица|седмици", 9 | "month" => "месец|месеца", 10 | "year" => "година|години", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/de/units.php: -------------------------------------------------------------------------------- 1 | "Sekunde|Sekunden", 5 | "minute" => "Minute|Minuten", 6 | "hour" => "Stunde|Stunden", 7 | "day" => "Tag|Tage", 8 | "week" => "Woche|Wochen", 9 | "month" => "Monat|Monate", 10 | "year" => "Jahr|Jahre", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/fr/units.php: -------------------------------------------------------------------------------- 1 | "seconde|secondes", 5 | "minute" => "minute|minutes", 6 | "hour" => "heure|heures", 7 | "day" => "jour|jours", 8 | "week" => "semaine|semaines", 9 | "month" => "mois|mois", 10 | "year" => "an|ans", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/el/units.php: -------------------------------------------------------------------------------- 1 | "δευτερόλεπτο|δευτερόλεπτα", 4 | "minute" => "λεπτά|λεπτό", 5 | "hour" => "ώρα|ώρες", 6 | "day" => "ημέρα|ημέρες", 7 | "week" => "εβδομάδα|εβδομάδες", 8 | "month" => "μήνας|μήνες", 9 | "year" => "χρόνος|χρόνια", 10 | ); 11 | -------------------------------------------------------------------------------- /src/lang/ro/units.php: -------------------------------------------------------------------------------- 1 | "secundă|secunde|secunde", 5 | "minute" => "minut|minute|minute", 6 | "hour" => "oră|ore|ore", 7 | "day" => "zi|zile|zile", 8 | "week" => "săptămână|săptămâni|săptămâni", 9 | "month" => "lună|luni|luni", 10 | "year" => "an|ani|ani", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/nl/units.php: -------------------------------------------------------------------------------- 1 | "seconde|seconden|seconden", 5 | "minute" => "minuut|minuten|minuten", 6 | "hour" => "uur|uur|uur", 7 | "day" => "dag|dagen|dagen", 8 | "week" => "week|weken|weken", 9 | "month" => "maand|maanden|maanden", 10 | "year" => "jaar|jaren|jaren", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/ru/units.php: -------------------------------------------------------------------------------- 1 | "секунду|секунды|секунд", 5 | "minute" => "минуту|минуты|минут", 6 | "hour" => "час|часа|часов", 7 | "day" => "день|дня|дней", 8 | "week" => "неделю|недели|недель", 9 | "month" => "месяц|месяца|месяцев", 10 | "year" => "год|года|лет", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/uk/units.php: -------------------------------------------------------------------------------- 1 | "секунду|секунди|секунд", 5 | "minute" => "хвилину|хвилини|хвилин", 6 | "hour" => "годину|години|годин", 7 | "day" => "день|дні|днів", 8 | "week" => "тиждень|тижня|тижнів", 9 | "month" => "місяць|місяця|місяців", 10 | "year" => "рік|роки|років", 11 | ); 12 | -------------------------------------------------------------------------------- /src/lang/ja/months.php: -------------------------------------------------------------------------------- 1 | "1月", 5 | "february" => "2月", 6 | "march" => "3月", 7 | "april" => "4月", 8 | "may" => "5月", 9 | "june" => "6月", 10 | "july" => "7月", 11 | "august" => "8月", 12 | "september" => "9月", 13 | "october" => "10月", 14 | "november" => "11月", 15 | "december" => "12月", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/fa/months.php: -------------------------------------------------------------------------------- 1 | "ژانویه", 4 | "february" => "فوریه", 5 | "march" => "مارچ", 6 | "april" => "آپریل", 7 | "may" => "می", 8 | "june" => "جون", 9 | "july" => "جولای", 10 | "august" => "آگوست", 11 | "september" => "سپتامبر", 12 | "october" => "اکتبر", 13 | "november" => "نوامبر", 14 | "december" => "دسامبر", 15 | ); 16 | -------------------------------------------------------------------------------- /src/lang/tr/months.php: -------------------------------------------------------------------------------- 1 | "Ocak", 5 | "february" => "Şubat", 6 | "march" => "Mart", 7 | "april" => "Nisan", 8 | "may" => "Mayıs", 9 | "june" => "Haziran", 10 | "july" => "Temmuz", 11 | "august" => "Ağustos", 12 | "september" => "Eylül", 13 | "october" => "Ekim", 14 | "november" => "Kasım", 15 | "december" => "Aralık", 16 | ); 17 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFactoryFacade.php: -------------------------------------------------------------------------------- 1 | "Януари", 5 | "february" => "Февруари", 6 | "march" => "Март", 7 | "april" => "Април", 8 | "may" => "Май", 9 | "june" => "Юни", 10 | "july" => "Юли", 11 | "august" => "Август", 12 | "september" => "Септември", 13 | "october" => "Октомври", 14 | "november" => "Ноември", 15 | "december" => "Декември", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/da/months.php: -------------------------------------------------------------------------------- 1 | "Januar", 5 | "february" => "Febryar", 6 | "march" => "Marts", 7 | "april" => "April", 8 | "may" => "Maj", 9 | "june" => "Juni", 10 | "july" => "Juli", 11 | "august" => "August", 12 | "september" => "September", 13 | "october" => "Oktober", 14 | "november" => "November", 15 | "december" => "December", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/de/months.php: -------------------------------------------------------------------------------- 1 | "Januar", 5 | "february" => "Februar", 6 | "march" => "März", 7 | "april" => "April", 8 | "may" => "Mai", 9 | "june" => "Juni", 10 | "july" => "Juli", 11 | "august" => "August", 12 | "september" => "September", 13 | "october" => "Oktober", 14 | "november" => "November", 15 | "december" => "Dezember", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/fr/months.php: -------------------------------------------------------------------------------- 1 | 'Janvier', 4 | 'february' => 'Février', 5 | 'march' => 'Mars', 6 | 'april' => 'Avril', 7 | 'may' => 'Mai', 8 | 'june' => 'Juin', 9 | 'july' => 'Juillet', 10 | 'august' => 'Août', 11 | 'september' => 'Septembre', 12 | 'october' => 'Octobre', 13 | 'november' => 'Novembre', 14 | 'december' => 'Décembre' 15 | ); 16 | ?> 17 | -------------------------------------------------------------------------------- /src/lang/bn/months.php: -------------------------------------------------------------------------------- 1 | "জানুয়ারি", 5 | "february" => "ফেব্রুয়ারী", 6 | "march" => "মার্চ", 7 | "april" => "এপ্রিল", 8 | "may" => "মে", 9 | "june" => "জুন", 10 | "july" => "জুলাই", 11 | "august" => "আগস্ট", 12 | "september" => "সেপ্টেম্বর ", 13 | "october" => "অক্টোবর", 14 | "november" => "নভেম্বর", 15 | "december" => "ডিসেম্বর", 16 | ]; -------------------------------------------------------------------------------- /src/lang/it/months.php: -------------------------------------------------------------------------------- 1 | "Gennaio", 4 | "february" => "Febbraio", 5 | "march" => "Marzo", 6 | "april" => "Aprile", 7 | "may" => "Maggio", 8 | "june" => "Giugno", 9 | "july" => "Luglio", 10 | "august" => "Agosto", 11 | "september" => "Settembre", 12 | "october" => "Ottobre", 13 | "november" => "Novembre", 14 | "december" => "Dicembre", 15 | ); 16 | -------------------------------------------------------------------------------- /src/lang/nl/months.php: -------------------------------------------------------------------------------- 1 | "januari", 5 | "february" => "februari", 6 | "march" => "maart", 7 | "april" => "april", 8 | "may" => "mei", 9 | "june" => "juni", 10 | "july" => "juli", 11 | "august" => "augustus", 12 | "september" => "september", 13 | "october" => "oktober", 14 | "november" => "november", 15 | "december" => "december", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/af/months.php: -------------------------------------------------------------------------------- 1 | "Januarie", 4 | "februarie" => "Februarie", 5 | "maart" => "Maart", 6 | "april" => "April", 7 | "mei" => "Mei", 8 | "junie" => "Junie", 9 | "julie" => "Julie", 10 | "augustus" => "Augustus", 11 | "september" => "September", 12 | "oktober" => "Oktober", 13 | "november" => "November", 14 | "december" => "December", 15 | ); 16 | -------------------------------------------------------------------------------- /src/lang/ru/months.php: -------------------------------------------------------------------------------- 1 | "января", 5 | "february" => "февраля", 6 | "march" => "марта", 7 | "april" => "апреля", 8 | "may" => "мая", 9 | "june" => "июня", 10 | "july" => "июля", 11 | "august" => "августа", 12 | "september" => "сентября", 13 | "october" => "октября", 14 | "november" => "ноября", 15 | "december" => "декабря", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/sk/months.php: -------------------------------------------------------------------------------- 1 | "január", 5 | "february" => "február", 6 | "march" => "marec", 7 | "april" => "apríl", 8 | "may" => "máj", 9 | "june" => "jún", 10 | "july" => "júl", 11 | "august" => "august", 12 | "september" => "september", 13 | "october" => "október", 14 | "november" => "november", 15 | "december" => "december", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/en/months.php: -------------------------------------------------------------------------------- 1 | "January", 5 | "february" => "February", 6 | "march" => "March", 7 | "april" => "April", 8 | "may" => "May", 9 | "june" => "June", 10 | "july" => "July", 11 | "august" => "August", 12 | "september" => "September", 13 | "october" => "October", 14 | "november" => "November", 15 | "december" => "December", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/es/months.php: -------------------------------------------------------------------------------- 1 | "Enero", 5 | "february" => "Febrero", 6 | "march" => "Marzo", 7 | "april" => "Abril", 8 | "may" => "Mayo", 9 | "june" => "Junio", 10 | "july" => "Julio", 11 | "august" => "Agosto", 12 | "september" => "Septiembre", 13 | "october" => "Octubre", 14 | "november" => "Noviembre", 15 | "december" => "Diciembre", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/sv/months.php: -------------------------------------------------------------------------------- 1 | "Januari", 5 | "february" => "Februari", 6 | "march" => "Mars", 7 | "april" => "April", 8 | "may" => "Maj", 9 | "june" => "Juni", 10 | "july" => "Juli", 11 | "august" => "Augusti", 12 | "september" => "September", 13 | "october" => "Oktober", 14 | "november" => "November", 15 | "december" => "December", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/uk/months.php: -------------------------------------------------------------------------------- 1 | "січня", 5 | "february" => "лютого", 6 | "march" => "березня", 7 | "april" => "квітня", 8 | "may" => "травня", 9 | "june" => "червня", 10 | "july" => "липня", 11 | "august" => "серпня", 12 | "september" => "вересня", 13 | "october" => "жовтня", 14 | "november" => "листопада", 15 | "december" => "грудня", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/el/months.php: -------------------------------------------------------------------------------- 1 | "Ιανουάριος", 4 | "february" => "Φεβρουάριος", 5 | "march" => "Μάρτιος", 6 | "april" => "Απρίλιος", 7 | "may" => "Μάιος", 8 | "june" => "Ιούνιος", 9 | "july" => "Ιούλιος", 10 | "august" => "Αύγουστος", 11 | "september" => "Σεπτέμβριος", 12 | "october" => "Οκτώβριος", 13 | "november" => "Νοέμβριος", 14 | "december" => "Δεκέμβριος", 15 | ); 16 | -------------------------------------------------------------------------------- /src/lang/ro/months.php: -------------------------------------------------------------------------------- 1 | "Ianuarie", 5 | "february" => "Februarie", 6 | "march" => "Martie", 7 | "april" => "Aprilie", 8 | "may" => "Mai", 9 | "june" => "Iunie", 10 | "july" => "Iulie", 11 | "august" => "August", 12 | "september" => "Septembrie", 13 | "october" => "Octombrie", 14 | "november" => "Noiembrie", 15 | "december" => "Decembrie", 16 | ); 17 | -------------------------------------------------------------------------------- /src/lang/ar/months.php: -------------------------------------------------------------------------------- 1 | https://github.com/chadidi 3 | return array( 4 | "january" => "يناير", 5 | "february" => "فبراير", 6 | "march" => "مارس", 7 | "april" => "أبريل", 8 | "may" => "مايو", 9 | "june" => "يونيو", 10 | "july" => "يوليو", 11 | "august" => "أغسطس", 12 | "september" => "سبتمبر", 13 | "october" => "أكتوبر", 14 | "november" => "نوفمبر", 15 | "december" => "ديسمبر", 16 | ); 17 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/FaDiffFotmatter.php: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | ./tests/ 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/ArDiffFormatter.php: -------------------------------------------------------------------------------- 1 | "sekundou|[2,Inf]sekundami", 5 | "minute" => "minútou|[2,Inf]minútami", 6 | "hour" => "hodinou|[2,Inf]hodinami", 7 | "day" => "dňom|[2,Inf]dňami", 8 | "week" => "týždňom|[2,Inf]týždňami", 9 | "month" => "mesiacom|[2,Inf]mesiacmi", 10 | "year" => "rokom|[2,Inf]rokmi", 11 | 12 | "_second" => "sekundu|sekundy|sekúnd", 13 | "_minute" => "minútu|minúty|minút", 14 | "_hour" => "hodinu|hodiny|hodín", 15 | "_day" => "deň|dni|dní", 16 | "_week" => "týždeň|týždne|týždňov", 17 | "_month" => "mesiac|mesiace|mesiacov", 18 | "_year" => "rok|roky|rokov", 19 | ); 20 | -------------------------------------------------------------------------------- /src/lang/ar/units.php: -------------------------------------------------------------------------------- 1 | https://github.com/chadidi 3 | return array( 4 | "second" => "[0,1] ثَانِيَة|{2} ثَانِيَتَيْن|[3,10]:count ثَوَان|[11,Inf]:count ثَانِيَة", 5 | "minute" => "[0,1] دَقِيقَة|{2} دَقِيقَتَيْن|[3,10]:count دَقَائِق|[11,Inf]:count دَقِيقَة", 6 | "hour" => "[0,1] سَاعَة|{2} سَاعَتَيْن|[3,10]:count سَاعَات|[11,Inf]:count سَاعَة", 7 | "day" => "[0,1] يَوْم|{2} يَوْمَيْن|[3,10]:count أَيَّام|[11,Inf] يَوْم", 8 | "week" => "[0,1] أُسْبُوع|{2} أُسْبُوعَيْن|[3,10]:count أَسَابِيع|[11,Inf]:count أُسْبُوع", 9 | "month" => "[0,1] شَهْرَ|{2} شَهْرَيْن|[3,10]:count أَشْهُر|[11,Inf]:count شَهْرَ", 10 | "year" => "[0,1] سَنَة|{2} سَنَتَيْن|[3,10]:count سَنَوَات|[11,Inf]:count سَنَة", 11 | ); 12 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/RuDiffFormatter.php: -------------------------------------------------------------------------------- 1 | =5.3.0", 14 | "illuminate/support": ">=5.5.0", 15 | "nesbot/carbon": "^1.24" 16 | }, 17 | "autoload": { 18 | "psr-0": { 19 | "Laravelrus\\LocalizedCarbon\\": "src/" 20 | } 21 | }, 22 | "extra": { 23 | "laravel": { 24 | "providers": [ 25 | "Laravelrus\\LocalizedCarbon\\LocalizedCarbonServiceProvider" 26 | ], 27 | "aliases": { 28 | "LocalizedCarbon": "Laravelrus\\LocalizedCarbon\\LocalizedCarbon", 29 | "DiffFormatter": "Laravelrus\\LocalizedCarbon\\DiffFactoryFacade" 30 | } 31 | } 32 | }, 33 | "minimum-stability": "stable" 34 | } 35 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/ItDiffFormatter.php: -------------------------------------------------------------------------------- 1 | app->singleton('difffactory', function() { 22 | return new DiffFormatterFactory(); 23 | }); 24 | } 25 | 26 | /** 27 | * Bootstrap the application events. 28 | * 29 | * @return void 30 | */ 31 | public function boot() 32 | { 33 | $this->loadTranslationsFrom(__DIR__.'/../../lang', 'localized-carbon'); 34 | 35 | $this->publishes([ 36 | __DIR__.'/../../lang' => base_path('resources/lang'), 37 | ]); 38 | } 39 | 40 | /** 41 | * Get the services provided by the provider. 42 | * 43 | * @return array 44 | */ 45 | public function provides() 46 | { 47 | return array('difffactory'); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/SkDiffFormatter.php: -------------------------------------------------------------------------------- 1 | 1 ? $delta . ' ' : '') . $unitStr; 18 | } 19 | } else { 20 | if ($unit == 'second' && $delta < 10) { 21 | $txt = 'pred chvíľou'; 22 | } else if ($unit == 'day' && $delta == 1) { 23 | $txt = 'včera'; 24 | } else { 25 | $txt = 'pred ' . ($delta > 1 ? $delta . ' ' : '') . $unitStr; 26 | } 27 | } 28 | } else { 29 | $txt = ($delta > 1 ? $delta . ' ' : '') . $unitStr; 30 | $txt .= ($isFuture) ? ' potom' : ' predtým'; 31 | } 32 | return $txt; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/UkDiffFormatter.php: -------------------------------------------------------------------------------- 1 | startOfDay(); 30 | } 31 | 32 | // Finally, we will just assume this date is in the format used by default on 33 | // the database connection and use that format to create the Carbon object 34 | // that is returned back out to the developers after we convert it here. 35 | elseif ( ! $value instanceof \DateTime) 36 | { 37 | $format = $this->getDateFormat(); 38 | 39 | return LocalizedCarbon::createFromFormat($format, $value); 40 | } 41 | 42 | return LocalizedCarbon::instance($value); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatters/DeDiffFormatter.php: -------------------------------------------------------------------------------- 1 | translateNumber($delta) . ' ' . $unit; 8 | 9 | if ($isNow) { 10 | $txt .= ($isFuture) ? ' এখন থেকে' : ' আগে'; 11 | return $txt; 12 | } 13 | 14 | $txt .= ($isFuture) ? ' ' : ' আগে'; 15 | return $txt; 16 | } 17 | 18 | public static function translateNumber($number) { 19 | if(is_numeric($number)) { 20 | $arrNumber = str_split($number); 21 | } 22 | else { 23 | return $number; 24 | } 25 | $transNumber = []; 26 | foreach($arrNumber as $number) { 27 | switch($number) { 28 | case '.': 29 | array_push($transNumber, '. '); 30 | break; 31 | case 0: 32 | array_push($transNumber, '০'); 33 | break; 34 | case 1: 35 | array_push($transNumber, '১'); 36 | break; 37 | case 2: 38 | array_push($transNumber, '২'); 39 | break; 40 | case 3: 41 | array_push($transNumber, '৩'); 42 | break; 43 | case 4: 44 | array_push($transNumber, '৪'); 45 | break; 46 | case 5: 47 | array_push($transNumber, '৫'); 48 | break; 49 | case 6: 50 | array_push($transNumber, '৬'); 51 | break; 52 | case 7: 53 | array_push($transNumber, '৭'); 54 | break; 55 | case 8: 56 | array_push($transNumber, '৮'); 57 | break; 58 | case 9: 59 | array_push($transNumber, '৯'); 60 | break; 61 | default: 62 | $number; 63 | break; 64 | } 65 | } 66 | return implode('', $transNumber); 67 | } 68 | } -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/Traits/LocalizedEloquentTrait.php: -------------------------------------------------------------------------------- 1 | startOfDay(); 42 | } 43 | 44 | // Finally, we will just assume this date is in the format used by default on 45 | // the database connection and use that format to create the Carbon object 46 | // that is returned back out to the developers after we convert it here. 47 | return LocalizedCarbon::createFromFormat($this->getDateFormat(), $value); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/DiffFormatterFactory.php: -------------------------------------------------------------------------------- 1 | formatters[$language] = $formatter; 12 | } 13 | 14 | public function alias($alias, $language) { 15 | $language = strtolower($language); 16 | $this->aliases[$alias] = $language; 17 | } 18 | 19 | public function get($language) { 20 | $language = strtolower($language); 21 | 22 | if (isset($this->aliases[$language])) { 23 | $language = $this->aliases[$language]; 24 | } 25 | 26 | if (isset($this->formatters[$language])) { 27 | $formatter = $this->formatters[$language]; 28 | 29 | if (is_string($formatter)) { 30 | $formatter = \App::make($formatter); 31 | } 32 | } else { 33 | $formatterClass = $this->getFormatterClassName($language); 34 | try { 35 | $formatter = \App::make($formatterClass); 36 | } catch (\Exception $e) { 37 | // In case desired formatter could not be loaded 38 | // load a formatter for application's fallback locale 39 | $language = $this->getFallbackLanguage(); 40 | $formatterClass = $this->getFormatterClassName($language); 41 | $formatter = \App::make($formatterClass); 42 | } 43 | } 44 | 45 | if (!$formatter instanceof \Closure && !$formatter instanceof DiffFormatterInterface) { 46 | throw new \Exception('Formatter for language ' . $language . ' should implement DiffFormatterInterface or must be a Closure.'); 47 | } 48 | 49 | // Remember instance for further use 50 | $this->extend($language, $formatter); 51 | 52 | return $formatter; 53 | } 54 | 55 | protected function getFormatterClassName($language) { 56 | $name = ucfirst(strtolower($language)); 57 | $name = 'Laravelrus\\LocalizedCarbon\\DiffFormatters\\' . $name . 'DiffFormatter'; 58 | 59 | return $name; 60 | } 61 | 62 | protected function getFallbackLanguage() { 63 | return \Config::get('app.fallback_locale'); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /tests/RoLocalizedCarbonTest.php: -------------------------------------------------------------------------------- 1 | subSecond(1); 16 | $this->assertEquals('acum o secundă', LocalizedCarbon::instance($oneSecondAgo)->diffForHumans()); 17 | 18 | $inOneSecond = Carbon::now()->addSecond(1); 19 | $this->assertEquals('peste o secundă', LocalizedCarbon::instance($inOneSecond)->diffForHumans()); 20 | 21 | $fiveSeconsAgo = Carbon::now()->subSecond(5); 22 | $this->assertEquals('acum 5 secunde', LocalizedCarbon::instance($fiveSeconsAgo)->diffForHumans()); 23 | 24 | $inFiveSeconds = Carbon::now()->addSecond(5); 25 | $this->assertEquals('peste 5 secunde', LocalizedCarbon::instance($inFiveSeconds)->diffForHumans()); 26 | 27 | $moreSeconsAgo = Carbon::now()->subSecond(59); 28 | $this->assertEquals('acum 59 secunde', LocalizedCarbon::instance($moreSeconsAgo)->diffForHumans()); 29 | 30 | $inMoreSeconds = Carbon::now()->addSecond(59); 31 | $this->assertEquals('peste 59 secunde', LocalizedCarbon::instance($inMoreSeconds)->diffForHumans()); 32 | 33 | $oneMinuteAgo = Carbon::now()->subMinute(1); 34 | $this->assertEquals('acum un minut', LocalizedCarbon::instance($oneMinuteAgo)->diffForHumans()); 35 | 36 | $inOneMinute = Carbon::now()->addMinute(1); 37 | $this->assertEquals('peste un minut', LocalizedCarbon::instance($inOneMinute)->diffForHumans()); 38 | 39 | $fiveMinutesAgo = Carbon::now()->subMinute(5); 40 | $this->assertEquals('acum 5 minute', LocalizedCarbon::instance($fiveMinutesAgo)->diffForHumans()); 41 | 42 | $twentyfourMinutesAgo = Carbon::now()->subMinute(24); 43 | $this->assertEquals('acum 24 minute', LocalizedCarbon::instance($twentyfourMinutesAgo)->diffForHumans()); 44 | 45 | $inTwentyfourMinutes = Carbon::now()->addMinute(24); 46 | $this->assertEquals('peste 24 minute', LocalizedCarbon::instance($inTwentyfourMinutes)->diffForHumans()); 47 | 48 | $oneYearAgo = Carbon::now()->subMonth(13); 49 | $this->assertEquals('acum un an', LocalizedCarbon::instance($oneYearAgo)->diffForHumans()); 50 | $twoYearsAgo = Carbon::now()->subMonth(25); 51 | $this->assertEquals('acum 2 ani', LocalizedCarbon::instance($twoYearsAgo)->diffForHumans()); 52 | 53 | $fourWeeksAgo = Carbon::now()->subDays(32); 54 | $this->assertEquals('acum 4 săptămâni', LocalizedCarbon::instance($fourWeeksAgo)->diffForHumans()); 55 | 56 | $oneMonthAgo = Carbon::now()->subWeek(7); 57 | $this->assertEquals('acum o lună', LocalizedCarbon::instance($oneMonthAgo)->diffForHumans()); 58 | } 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/Laravelrus/LocalizedCarbon/LocalizedCarbon.php: -------------------------------------------------------------------------------- 1 | tz); 27 | } 28 | 29 | $isFuture = $this->gt($other); 30 | 31 | $delta = $other->diffInSeconds($this); 32 | 33 | // 4.35 weeks per year. 365 days in a year, 12 months, 7 days in a week: 34 | // 365/12/7 = 4.345238095238095 4.35 is good enough for big time calculations! 35 | $divs = array( 36 | 'second' => self::SECONDS_PER_MINUTE, 37 | 'minute' => self::MINUTES_PER_HOUR, 38 | 'hour' => self::HOURS_PER_DAY, 39 | 'day' => self::DAYS_PER_WEEK, 40 | 'week' => 4.35, 41 | 'month' => self::MONTHS_PER_YEAR 42 | ); 43 | 44 | $unit = 'year'; 45 | 46 | foreach ($divs as $divUnit => $divValue) { 47 | if ($delta < $divValue) { 48 | $unit = $divUnit; 49 | break; 50 | } 51 | 52 | $delta = floor($delta / $divValue); 53 | } 54 | 55 | if ($delta == 0) { 56 | $delta = 1; 57 | } 58 | 59 | // Format and return 60 | $result = null; 61 | if ($formatter instanceof DiffFormatterInterface) { 62 | $result = $formatter->format($isNow, $isFuture, $delta, $unit); 63 | } elseif ($formatter instanceof \Closure) { 64 | $result = $formatter($isNow, $isFuture, $delta, $unit); 65 | } 66 | 67 | return $result; 68 | } 69 | 70 | public function formatLocalized($format = self::COOKIE) { 71 | if (strpos($format, '%f') !== false) { 72 | $langKey = strtolower(parent::format("F")); 73 | $replace = \Lang::get("localized-carbon::months." . $langKey); 74 | $result = str_replace('%f', $replace, $format); 75 | } else { 76 | $result = $format; 77 | } 78 | 79 | $result = parent::formatLocalized($result); 80 | 81 | return $result; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /docs/README-ru.md: -------------------------------------------------------------------------------- 1 | # Localized Carbon 2 | 3 | + [Вступление](#intro) 4 | + [Использование](#usage) 5 | + [Поддерживаемые языки](#languages) 6 | + [Установка](#installation) 7 | + [Расширение пакета](#extending) 8 | + [Вклад в развитие пакета](#contributing) 9 | 10 | 11 | ## Вступление 12 | 13 | `Localized Carbon` - это расширение популярного пакета `Carbon`. Оно предназначено для использования исключительно во фреймворке Laravel. Под локализацией подразумевается локализация функции `diffForHumans` оригинального Carbon'а, предназначенная для вывода удобочитамой разницы в датах. 14 | 15 | 16 | ## Использование 17 | 18 | Этот пакет предоставляет класс `LocalizedCarbon`, который наследует оригинальный `Carbon`, поэтому его использование ничем не отличается от оригинального Carbon'а. 19 | 20 | Но представте, что у вас есть модель `Comment` (комментарий), в которой имеются временные поля по умолчанию (`created_at` и `updated_at`). И вам требуется вывести информацию о том, сколько времени прошло с момента создания комментария (поле `created_at`), в удобочитаемом формате. Это можно сделать несколькими способами, например так (в Blade-шаблоне): 21 | 22 | ``` 23 | {{ LocalizedCarbon::instance($comment->created_at)->diffForHumans() }} 24 | ``` 25 | 26 | В этом случае класс выведет что-то вроде "5 минут назад" для русского языка. 27 | 28 | Но есть и другой способ. Вы можете подменить имеющийся в Laravel класс Eloquent\Model при помощи поставляемого с пакетом классаа модели, чтобы временные поля, наподобие `created_at` и т.д., конвертировались в `LocalizedCarbon`, вместо `Carbon`. Таким образом, использование `LocalizedCarbon` ничем не будет отличаться от привычного: 29 | 30 | ``` 31 | {{ $comment->created_at->diffForHumans() }} 32 | ``` 33 | 34 | Как и в исходном Carbon'е, метод `diffForHumans` имеет первый необязательный аргумент (который является другим экземпляром класса `Carbon`). Он указывает время, относительно которого вычислять разницу. По умолчанию (если этот параметр не задан, или равен `null`) используется текущее время. 35 | 36 | В методе классе `LocalizedCarbon` имеется и второе необязательный аргумент, в котором вы можете указать желаемый язык, или напрямую класс-форматтер, используемый для формирования строки-разницы между временами (см. [расширение](#extending)). По умолчанию будет использоваться текущий язык приложения. Также, в качестве второго аргумента можно передавать замыкание, которое будет форматировать строку. Параметры этого замыкания аналогичные метода `format` интерфейса `DiffFormatterInterface` (см. раздел [Расширение Localzied Carbon](#extending)). 37 | 38 | 39 | ## Поддерживаемые языки 40 | 41 | Текущая версия Localized Carbon поставляетс со следующими локализациями: 42 | 43 | + Английский (en) 44 | + Русский (ru) 45 | + Украинский (uk) 46 | + Голландский (nl) 47 | + Испанский (es) 48 | + Португальский (pt) 49 | + Французский (fr) 50 | + Болгарский (bg) 51 | + Словацкий (sk) 52 | + Турецкий (tr) 53 | + Арабский (ar) 54 | + Японский (ja) 55 | 56 | Но пакет расширяем, то есть вы можете написать и использовать свою собственную локализацию, не трогая само содержимое пакета. См. [расширение пакета](#extending). 57 | 58 | 59 | ## Установка 60 | 61 | Добавьте следующее определение в секцию `require` файла `composer.json` вашего проекта: `"laravelrus/localized-carbon": "1.*"`, после чего выполните команду `composer update`. 62 | 63 | Далее нужно добавить сервис провайдер (Service Provider), поставляемый с пакетом, в раздел `providers` файла `app/config/app.php`: 64 | 65 | ``` 66 | 'Laravelrus\LocalizedCarbon\LocalizedCarbonServiceProvider', 67 | ``` 68 | 69 | После этого рекомендуется добавить следующие алиасы (секция `aliases` того же конфига): 70 | 71 | ``` 72 | 'LocalizedCarbon' => 'Laravelrus\LocalizedCarbon\LocalizedCarbon', 73 | 'DiffFormatter' => 'Laravelrus\LocalizedCarbon\DiffFactoryFacade', 74 | ``` 75 | 76 | Стоит отметить, что класс `DiffFormatter` будет использоваться только для расширения пакета дополнительными локализациями. См. [расширение пакета](#extending). 77 | 78 | Если вы хотите использовать `LocalizedCarbon` привычным способом в ваших моделях, то можете воспользоваться поставляемым трейтом: 79 | 80 | ``` 81 | use \Laravelrus\LocalizedCarbon\Traits\LocalizedEloquentTrait; 82 | ``` 83 | 84 | В этом случае для всех дат в вашей ELoquent-модели будет использоваться `LocalizedCarbon` вместо исходного `Carbon`. 85 | 86 | Но этот способ годится только если Вы используете PHP версии 5.4 или выше. 87 | 88 | Если же Вы по-прежнему используете PHP версии 5.3.7, вы можете подменить имеющийся в Laravel класс Eloquent поставляемым классом `Laravelrus\LocalizedCarbon\Models\Eloquent`. Для этого вы можете как наследовать свои модели как напрямую от этого класса, так и заменить алиас к Eloquent на него в файле 'app\config\app.php'. 89 | 90 | 91 | ## Расширение пакета 92 | 93 | Если требуемая локализация не поствляется с пакетом, вы можете написать свою собственную и расширить пакет, не трогая его содержимое. 94 | 95 | Существует несеколько способов расширить класс Localized Carbon. 96 | 97 | Во-первых, вы можете написать свой класс `DiffFormatter` для этого, который реализует интерфейс `Laravelrus\LocalizedCarbon\DiffFormatters\DiffFormatterInterface`. Этот интерфейс требует от класса реализовать единственный метод `format`, который имеет следующий вид: 98 | 99 | ``` 100 | public function format($isNow, $isFuture, $delta, $unit); 101 | ``` 102 | 103 | + `$isNow` - это флаг, который равен `true`, если разница во времени вычисляется относительно текущего времени. 104 | + `$isFuture` - это флаг, который равен `true`, если время находится в будущем относительно проверяемого времени. 105 | + `$delta` - это число, содержащее разницу во времени в единицах, указанных в `$unit`. 106 | + `$unit` - это единица измерения параметра `$delta`. Может принимать одно из следующих значений: `second` (секунды), `minute` (минуты), `hour` (часы), `day` (дни), `week` (недели), `month` (месяцы) или `year` (года). 107 | 108 | Таким образом, ваш метод `format` должен возвращать строку, сформированную на основе этих аргументов. Для примера смотрите существующие форматтеры в директории `vendor\laravelrus\localized-carbon\src\Laravelrus\LocalizedCarbon\DiffFormatters`. Вы также можете например ссылаться на языковые файлы, посредством `Lang::choice`, как это сделано, например, в русской локализации. 109 | 110 | Как только ваш класс будет готов, нужно зарегистрировать его в пакете. Для этого нужно вызвать `DiffFormatter::extend` из любого файла, который подключается фреймворком. Например, это можно сделать где-нибудь в файле `app/start/global.php`. 111 | 112 | Метод `extend` принимает два аргумента. Первый - это язык, для которого написан этот форматтер (чаще всего это будет `App::getLocale()`, если вы пишете локализацию для текущего языка приложения). Следующий аргумент - это экземпляр вашего класса, ЛИБО просто полное имя вашего класса, принимая во внимание то, что он должен быть доступен для автозагрузки. Взгляните на примеры: 113 | 114 | ``` 115 | $formatter = new Acme\DiffFormatters\FrDiffFormatter; 116 | DiffFormatter::extend('fr', $formatter); 117 | 118 | // ИЛИ 119 | 120 | DiffFormatter::extend('fr', 'Acme\\DiffFormatters\\FrDiffFormatter'); 121 | ``` 122 | 123 | В последнем случае форматтер будет автоматически загружен, как только в нем будет необходимость (посредством IoC). Имейте также ввиду, что форматтер будет загружен только однажды за весь цикл приложениия из соображений оптимизации. 124 | 125 | Второй способ - это передать замыкание в качестве второго аргумента `extend`. Параметры замыкания должны быть такими же, как и у метода `format` интерфейса `DiffFormatterInterface`. Например: 126 | 127 | ``` 128 | DiffFormatter::extend('fr', function($isNow, $isFuture, $delta, $unit) { 129 | return 'Сформированная строка!'; 130 | }); 131 | ``` 132 | 133 | Также возможно добавлять "алиасы" к существующим языкам. Например, Localized Carbon поставляется с Украинской локализацией, которая распознается по языковому ключу `uk`. Но что, если в вашем приложении для украинского языка используется ключ `ua`, или `ukr`? В это случае вы можете зарегистрировать алиас для языка `uk` таким образом: 134 | 135 | ``` 136 | DiffFormatter::alias('ukr', 'uk'); 137 | ``` 138 | 139 | 140 | ## Вклад в развитие пакета 141 | 142 | Если вы написали локализацию для языка, которые не поставляется с текущей версией пакета, будет здорово, если вы сделаете pull request с ним в текущую ветку пакета (1.3), убедившись только, что вы "настроили" его для использования внутри пакета. 143 | 144 | Форматтер должен находиться в директории `src/Laravelrus/LocalizedCarbon/DiffFormatters` и следовать следующим соглашениям: имя класса должно начинаться с языка, для которого он написан, в нижнем регистре, но первый символ - в верхнем. Осальная часть имени должна заканчиваться на `DiffFormatter`. Имя файла должно соответствовать имени класса. 145 | 146 | Например, форматтер для языка `fr` (французский) будет находится в файле `src/Laravelrus/LocalizedCarbon/DiffFormatters/FrDiffFormatter.php`, а имя класса будет соответственно `FrDiffFormatter`. 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Maintainers needed 2 | Sorry, I have not much time supporting this repo. Also I rarely work with Laravel now, so new maintainers are needed. 3 | 4 | # Localized Carbon 5 | 6 | for **L4** use **1.4** branch 7 | for **L5.4** use **2.2** 8 | for **>=L5.5** use **2.3** 9 | 10 | See also [localized documentation](docs) 11 | 12 | + [Introduction](#intro) 13 | + [Installation](#installation) 14 | + [Usage](#usage) 15 | + [Supported languages](#languages) 16 | + [Extending](#extending) 17 | + [Contributing](#contributing) 18 | 19 | 20 | ## Introduction 21 | 22 | Localized Carbon is an extension of a popular Carbon package, designed specially for Laravel framework. By localization I mean its `diffForHumans` function, which returns a human-readable string of time interval. This package also supports genitive months by introducing the "%f" key in `formatLocalized` method. 23 | 24 | 25 | 26 | ## Installation 27 | 28 | Add the following requirement to your `composer.json`: `"laravelrus/localized-carbon": "1.*"` and then run `composer update`. 29 | 30 | Next, add package's Service Provider to `app/config/app.php` in `providers` section: 31 | 32 | ``` 33 | 'Laravelrus\LocalizedCarbon\LocalizedCarbonServiceProvider', 34 | ``` 35 | 36 | After that you may want to add some Aliases (`aliases` section of the same config): 37 | 38 | ``` 39 | 'LocalizedCarbon' => Laravelrus\LocalizedCarbon\LocalizedCarbon::class, 40 | 'DiffFormatter' => Laravelrus\LocalizedCarbon\DiffFactoryFacade::class, 41 | ``` 42 | 43 | Note that `DiffFormatter` will only be used for extending default localizations. See [extending Localized Carbon](#extending). 44 | 45 | If you want to use the power of `LocalizedCarbon` the same way as you did with original `Carbon` in your models, you may want to use supplied trait for this in your models: 46 | 47 | ``` 48 | use \Laravelrus\LocalizedCarbon\Traits\LocalizedEloquentTrait; 49 | ``` 50 | 51 | In this case `LocalizedCarbon` will be used for all dates in your Eloquent model instead of original `Carbon`. 52 | 53 | Note that this method is actual for PHP versions 5.4 and higher. 54 | 55 | If you are still using PHP 5.3.7 you can substitute Laravel's Eloquent class by `Laravelrus\LocalizedCarbon\Models\Eloquent` supplied with this package. To do this you can either inherit this class directly, or make an alias to it instead of originial Eloquent in `app\config\app.php`. 56 | 57 | 58 | 59 | ## Usage 60 | 61 | This package provides a `LocalizedCarbon` class which inherits original Carbon, so its usage is absolutely the same as original Carbon's. 62 | 63 | But imagine you have a `Comment` model for example, which has default timestamp fields (`created_at` and `updated_at`). You want to display, how much time has gone since its `created_at` in a human-readable format. One way to achieve may be such (in your Blade template): 64 | 65 | ``` 66 | {{ LocalizedCarbon::instance($comment->created_at)->diffForHumans() }} 67 | ``` 68 | 69 | In this case the class will output something like "5 minutes ago". Note that for just an English version of the string original Carbon would be enough. This `LocalizedCarbon` is used to display the message in the current application language. For example, for Russian language it will display "5 минут назад". 70 | 71 | But also, you may substitute Laravel's Eloquent model, so the timestamps would be converted to `LocalizedCarbon` instead of original `Carbon`. So the usage could be as if your were using original Carbon: 72 | 73 | ``` 74 | {{ $comment->created_at->diffForHumans() }} 75 | ``` 76 | 77 | As in original Carbon, `diffForHumans` functions has an optional first argument (which is another Carbon instance). It specified the time to which difference should be calculated. By default (a missing or `null` value) current time is used. 78 | 79 | Also `LocalizedCarbon` adds an optional second argument, in which you may specify the desired language, or directly a `formatter` class which is used to format the difference-string (see [extending Localized Carbon](#extending)). By default current application language is used. Also you may specify a Closure in the second parameter which will do formatting. For its signature refer to [extending Localized Carbon](#extending) section. 80 | 81 | 82 | ## Supported languages 83 | 84 | Current version of Localized Carbon ships with these localizations: 85 | 86 | + English (en) (full) 87 | + Russian (ru) (full) 88 | + Ukrainian (uk) (full) 89 | + Dutch (nl) (no genitive) 90 | + Spanish (es) (full) 91 | + Portuguese (pt) (no genitive) 92 | + French (fr) (no genitive) 93 | + Bulgarian (bg) (no genitive) 94 | + Slovakian (sk) (no genitive) 95 | + Turkish (tr) (no genitive) 96 | + Arabic (ar) (no genitive) 97 | + Japanese (ja) (full) 98 | + Bengali (bn) (full) 99 | + Persian (fa) (full) 100 | 101 | 102 | But it is extendable, so you may write and use your own localization without altering the contents of the package. See [extending Localized Carbon](#extending). 103 | 104 | 105 | 106 | 107 | ## Extending Localized Carbon 108 | 109 | If needed localization is not shipped with this package, you may write your own and extend Localized Carbon with it, not even touching the vendor folder itself. 110 | 111 | There are a couple of ways to extend Localized Carbon. 112 | 113 | First, you may write your own `DiffFormatter` class for this, implementing `Laravelrus\LocalizedCarbon\DiffFormatters\DiffFormatterInterface`. This interface forces the class to have a single `format` method which looks like this: 114 | 115 | ``` 116 | public function format($isNow, $isFuture, $delta, $unit); 117 | ``` 118 | 119 | `$isNow` is a boolean, which is `true` when the time difference is calculated relevant to current time. 120 | `$isFuture` is boolean, which is `true` if the DateTime object is in the future relevant to comparable time. 121 | `$delta` is an integer, equals to number of units of difference. 122 | `$unit` is a time-"unit". It can be either: `second`, `minute`, `hour`, `day`, `week`, `month` or `year`. 123 | 124 | So, your `format` method should return a string based on this arguments. As an example see an existing DiffFormatters in `vendor\laravelrus\localized-carbon\src\Laravelrus\LocalizedCarbon\DiffFormatters` directory. You can also reference a lang-files, using `Lang::choice` as it is done in Russian localization for example. 125 | 126 | When your class is ready, you must register it within the Localized Carbon. For this you must call `DiffFormatter::extend` method from within any file which is loaded by the framework. For example, you can do it somewhere in `app/start/global.php`. 127 | 128 | The `extend` method expects two parameters: first is the language you want to be supported (most often it would be `App::getLocale()` if you want just to use application's language). Next is the instance of your formatter, OR just a name of the class if it can be autoloaded. Consider these examples: 129 | 130 | ``` 131 | $formatter = new Acme\DiffFormatters\FrDiffFormatter; 132 | DiffFormatter::extend('fr', $formatter); 133 | 134 | // OR 135 | 136 | DiffFormatter::extend('fr', 'Acme\\DiffFormatters\\FrDiffFormatter'); 137 | ``` 138 | 139 | In the latter case the formatter will be autoloaded when it is needed using IoC. Also note that formatter is loaded only once during application life-cycle due to optimization considerations. 140 | 141 | The second way to extend is to pass a Closure as the second parameter. It must have the same signature as the `format` method of `DiffFormatterInterface` interface. For example: 142 | 143 | ``` 144 | DiffFormatter::extend('fr', function($isNow, $isFuture, $delta, $unit) { 145 | return 'Some formatter diff string!'; 146 | }); 147 | ``` 148 | 149 | Also, there is a possibility to add an alias for an existing language. For example, Localized Carbon is shipped with Ukranian localization, which is recognized by `uk` language key. But what if your application uses `ua` or `ukr` language, which still means it is Ukranian? In this case you may add an alias for `uk` language in this way: 150 | 151 | ``` 152 | DiffFormatter::alias('ukr', 'uk'); 153 | ``` 154 | 155 | 156 | ## Contributing 157 | 158 | If you've written a formatter for the language which is not supported by current version of Localized Carbon out of the box - feel free to make a pull request with it in the current version branch (1.3), but be sure to adjust your formatter for been used by the package. 159 | 160 | The formatter should lie in `src/Laravelrus/LocalizedCarbon/DiffFormatters` directory, following a simple naming convention: the class name should start with the desired language in lower-case, but the first letter in upper-case. The rest part of the name should be "DiffFormatter". The file name should correspond to the class name. 161 | 162 | For example, the formatter for `fr` language would lie in `src/Laravelrus/LocalizedCarbon/DiffFormatters/FrDiffFormatter.php`, and the class name would be `FrDiffFormatter`. 163 | 164 | Also I need the help of the community to complete the list of genitives for all supported languages. If you know a language and it uses genitives in dates, feel free to contribute. See an example of Russian or Ukranian `lang\XX\months.php` files. 165 | --------------------------------------------------------------------------------