I18n improvements (#1060)
* Add a default locale * Use html lang and dir attributes * Fix translations * Add pluralize forms
This commit is contained in:
@@ -48,6 +48,9 @@ APP_EMAIL_NEW_USERS_NOTIFICATION=EmailThatWillSendNotificationsForNewUser
|
||||
# https://github.com/monicahq/monica/blob/master/resources/views/settings/index.blade.php#L70
|
||||
APP_DEFAULT_TIMEZONE=US/Eastern
|
||||
|
||||
# Default locale used in the application.
|
||||
APP_DEFAULT_LOCALE=en
|
||||
|
||||
# Ability to disable signups on your instance.
|
||||
# Can be true or false. Default to false.
|
||||
APP_DISABLE_SIGNUP=true
|
||||
|
||||
@@ -2,6 +2,7 @@ UNRELEASED CHANGES:
|
||||
|
||||
* Fix called_at field in the Call object returned by the API
|
||||
* Add Linkedin URL in the Contact object returned by the API
|
||||
* Improve localization: add plural forms, localize every needed messages
|
||||
|
||||
RELEASED VERSIONS:
|
||||
|
||||
|
||||
+34
-36
@@ -2,12 +2,24 @@
|
||||
|
||||
namespace App\Helpers;
|
||||
|
||||
use Auth;
|
||||
use Carbon\Carbon;
|
||||
use Jenssegers\Date\Date;
|
||||
|
||||
class DateHelper
|
||||
{
|
||||
/**
|
||||
* Set the locale of the instance for Date frameworks.
|
||||
*
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public static function setLocale($locale)
|
||||
{
|
||||
$locale = $locale ?: config('app.locale');
|
||||
Carbon::setLocale($locale);
|
||||
Date::setLocale($locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a Carbon object.
|
||||
*
|
||||
@@ -27,10 +39,10 @@ class DateHelper
|
||||
* @param Carbon $date
|
||||
* @return string
|
||||
*/
|
||||
public static function getShortDate($date, $locale = null)
|
||||
public static function getShortDate($date)
|
||||
{
|
||||
$date = new Date($date);
|
||||
$locale = self::getLocale($locale);
|
||||
$locale = Date::getLocale();
|
||||
|
||||
switch ($locale) {
|
||||
case 'en':
|
||||
@@ -55,10 +67,9 @@ class DateHelper
|
||||
* @param Carbon $date
|
||||
* @return string
|
||||
*/
|
||||
public static function getShortMonth($date, $locale = null)
|
||||
public static function getShortMonth($date)
|
||||
{
|
||||
$date = new Date($date);
|
||||
$locale = self::getLocale($locale);
|
||||
$format = 'M';
|
||||
|
||||
return $date->format($format);
|
||||
@@ -71,10 +82,9 @@ class DateHelper
|
||||
* @param Carbon $date
|
||||
* @return string
|
||||
*/
|
||||
public static function getShortDay($date, $locale = null)
|
||||
public static function getShortDay($date)
|
||||
{
|
||||
$date = new Date($date);
|
||||
$locale = self::getLocale($locale);
|
||||
$format = 'D';
|
||||
|
||||
return $date->format($format);
|
||||
@@ -87,10 +97,10 @@ class DateHelper
|
||||
* @param Carbon $date
|
||||
* @return string
|
||||
*/
|
||||
public static function getShortDateWithoutYear($date, $locale = null)
|
||||
public static function getShortDateWithoutYear($date)
|
||||
{
|
||||
$date = new Date($date);
|
||||
$locale = self::getLocale($locale);
|
||||
$locale = Date::getLocale();
|
||||
|
||||
switch ($locale) {
|
||||
case 'en':
|
||||
@@ -115,10 +125,10 @@ class DateHelper
|
||||
* @param Carbon $date
|
||||
* @return string
|
||||
*/
|
||||
public static function getShortDateWithTime($date, $locale = null)
|
||||
public static function getShortDateWithTime($date)
|
||||
{
|
||||
$date = new Date($date);
|
||||
$locale = self::getLocale($locale);
|
||||
$locale = Date::getLocale();
|
||||
|
||||
switch ($locale) {
|
||||
case 'en':
|
||||
@@ -135,25 +145,6 @@ class DateHelper
|
||||
return $date->format($format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the locale of the instance, if defined. English by default.
|
||||
*
|
||||
* @param string
|
||||
* @return string
|
||||
*/
|
||||
public static function getLocale($locale = null)
|
||||
{
|
||||
if (Auth::check()) {
|
||||
$locale = $locale ?: Auth::user()->locale;
|
||||
} else {
|
||||
$locale = $locale ?: 'en';
|
||||
}
|
||||
|
||||
Date::setLocale($locale);
|
||||
|
||||
return $locale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a given number of week/month/year to a date.
|
||||
* @param Carbon $date the start date
|
||||
@@ -185,10 +176,18 @@ class DateHelper
|
||||
*/
|
||||
public static function getMonthAndYear(int $month)
|
||||
{
|
||||
$month = Carbon::now()->addMonthsNoOverflow($month)->format('M');
|
||||
$year = Carbon::now()->addMonthsNoOverflow($month)->format('Y');
|
||||
$date = Date::now()->addMonthsNoOverflow($month);
|
||||
$locale = Date::getLocale();
|
||||
|
||||
return $month.' '.$year;
|
||||
switch ($locale) {
|
||||
case 'en':
|
||||
$format = 'M Y';
|
||||
break;
|
||||
default:
|
||||
$format = 'M Y';
|
||||
}
|
||||
|
||||
return $date->format($format);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -202,10 +201,10 @@ class DateHelper
|
||||
public static function getNextTheoriticalBillingDate(String $interval)
|
||||
{
|
||||
if ($interval == 'monthly') {
|
||||
return Carbon::now()->addMonth();
|
||||
return Date::now()->addMonth();
|
||||
}
|
||||
|
||||
return Carbon::now()->addYear();
|
||||
return Date::now()->addYear();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -215,7 +214,6 @@ class DateHelper
|
||||
*/
|
||||
public static function getListOfMonths()
|
||||
{
|
||||
Date::setLocale(auth()->user()->locale);
|
||||
$months = collect([]);
|
||||
$currentDate = Date::now();
|
||||
$currentDate->day = 1;
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace App\Helpers;
|
||||
|
||||
use Auth;
|
||||
|
||||
class LocaleHelper
|
||||
{
|
||||
/**
|
||||
* Get the current or default locale.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getLocale()
|
||||
{
|
||||
if (Auth::check()) {
|
||||
$locale = Auth::user()->locale;
|
||||
} else {
|
||||
$locale = app('language.detector')->detect() ?: config('app.locale');
|
||||
}
|
||||
|
||||
return $locale;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current or default locale.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getDirection()
|
||||
{
|
||||
$locale = self::getLocale();
|
||||
|
||||
switch ($locale) {
|
||||
// Source: https://meta.wikimedia.org/wiki/Template:List_of_language_names_ordered_by_code
|
||||
case 'ar':
|
||||
case 'arc':
|
||||
case 'dv':
|
||||
case 'fa':
|
||||
case 'ha':
|
||||
case 'he':
|
||||
case 'khw':
|
||||
case 'ks':
|
||||
case 'ku':
|
||||
case 'ps':
|
||||
case 'ur':
|
||||
case 'yi':
|
||||
return 'rtl';
|
||||
default:
|
||||
return 'ltr';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,9 +33,9 @@ class GiftsController extends Controller
|
||||
'is_an_idea' => $gift->is_an_idea,
|
||||
'has_been_offered' => $gift->has_been_offered,
|
||||
'has_been_received' => $gift->has_been_received,
|
||||
'offered_at' => \App\Helpers\DateHelper::getShortDate($gift->offered_at, auth()->user()->locale),
|
||||
'received_at' => \App\Helpers\DateHelper::getShortDate($gift->received_at, auth()->user()->locale),
|
||||
'created_at' => \App\Helpers\DateHelper::getShortDate($gift->created_at, auth()->user()->locale),
|
||||
'offered_at' => \App\Helpers\DateHelper::getShortDate($gift->offered_at),
|
||||
'received_at' => \App\Helpers\DateHelper::getShortDate($gift->received_at),
|
||||
'created_at' => \App\Helpers\DateHelper::getShortDate($gift->created_at),
|
||||
'edit' => false,
|
||||
'show_comment' => false,
|
||||
];
|
||||
|
||||
@@ -21,21 +21,17 @@ class SubscriptionsController extends Controller
|
||||
}
|
||||
|
||||
if (! auth()->user()->account->isSubscribed()) {
|
||||
$data = [
|
||||
return view('settings.subscriptions.blank', [
|
||||
'numberOfCustomers' => InstanceHelper::getNumberOfPaidSubscribers(),
|
||||
];
|
||||
|
||||
return view('settings.subscriptions.blank', $data);
|
||||
]);
|
||||
}
|
||||
|
||||
$planId = auth()->user()->account->getSubscribedPlanId();
|
||||
|
||||
$data = [
|
||||
return view('settings.subscriptions.account', [
|
||||
'planInformation' => InstanceHelper::getPlanInformationFromConfig($planId),
|
||||
'nextBillingDate' => auth()->user()->account->getNextBillingDate(),
|
||||
];
|
||||
|
||||
return view('settings.subscriptions.account', $data);
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -49,19 +45,16 @@ class SubscriptionsController extends Controller
|
||||
return redirect('settings/');
|
||||
}
|
||||
|
||||
$account = auth()->user()->account;
|
||||
$plan = $request->query('plan');
|
||||
|
||||
$data = [
|
||||
'planInformation' => InstanceHelper::getPlanInformationFromConfig($plan),
|
||||
'nextTheoriticalBillingDate' => DateHelper::getShortDate(DateHelper::getNextTheoriticalBillingDate($plan)),
|
||||
];
|
||||
|
||||
if ($account->isSubscribed()) {
|
||||
if (auth()->user()->account->isSubscribed()) {
|
||||
return redirect('/settings/subscriptions');
|
||||
}
|
||||
|
||||
return view('settings.subscriptions.upgrade', $data);
|
||||
$plan = $request->query('plan');
|
||||
|
||||
return view('settings.subscriptions.upgrade', [
|
||||
'planInformation' => InstanceHelper::getPlanInformationFromConfig($plan),
|
||||
'nextTheoriticalBillingDate' => DateHelper::getShortDate(DateHelper::getNextTheoriticalBillingDate($plan)),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -55,9 +55,23 @@ class SettingsController extends Controller
|
||||
public function index()
|
||||
{
|
||||
return view('settings.index')
|
||||
->withLocales($this->getLocaleList())
|
||||
->withHours(\App\Helpers\DateHelper::getListOfHours());
|
||||
}
|
||||
|
||||
private function getLocaleList()
|
||||
{
|
||||
$locales = collect([]);
|
||||
foreach (config('lang-detector.languages') as $lang) {
|
||||
$locales->push([
|
||||
'lang' => $lang,
|
||||
'name' => trans('settings.locale_'.$lang),
|
||||
]);
|
||||
}
|
||||
|
||||
return $locales->sortBy('name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Save user settings.
|
||||
*
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Auth;
|
||||
use Closure;
|
||||
use Carbon\Carbon;
|
||||
use App\Helpers\DateHelper;
|
||||
use App\Helpers\LocaleHelper;
|
||||
|
||||
class CheckLocale
|
||||
{
|
||||
@@ -17,10 +17,10 @@ class CheckLocale
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if (Auth::check()) {
|
||||
\App::setLocale(Auth::user()->locale);
|
||||
Carbon::setLocale(config('app.locale'));
|
||||
}
|
||||
$locale = LocaleHelper::getLocale();
|
||||
|
||||
\App::setLocale($locale);
|
||||
DateHelper::setLocale($locale);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
+2
-2
@@ -104,9 +104,9 @@ class Note extends Model
|
||||
* @param string $locale
|
||||
* @return string
|
||||
*/
|
||||
public function getCreatedAt($locale)
|
||||
public function getCreatedAt()
|
||||
{
|
||||
return DateHelper::getShortDate($this->created_at, $locale);
|
||||
return DateHelper::getShortDate($this->created_at);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,6 +57,7 @@ class User extends Authenticatable
|
||||
$user->password = bcrypt($password);
|
||||
$user->timezone = config('app.timezone');
|
||||
$user->created_at = Carbon::now();
|
||||
$user->locale = \App::getLocale();
|
||||
$user->save();
|
||||
|
||||
return $user;
|
||||
|
||||
+2
-1
@@ -29,7 +29,8 @@
|
||||
"predis/predis": "^1.1",
|
||||
"sabre/vobject": "^4.1",
|
||||
"sentry/sentry-laravel": "^0.8",
|
||||
"symfony/translation": "^3.4"
|
||||
"symfony/translation": "^3.4",
|
||||
"vluzrmos/language-detector": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"barryvdh/laravel-debugbar": "^3",
|
||||
|
||||
Generated
+56
-1
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "f4b3aff6a5c74b487641883e0b97ba73",
|
||||
"content-hash": "d4df94eb414e4edd8d927f54f186c2b9",
|
||||
"packages": [
|
||||
{
|
||||
"name": "aws/aws-sdk-php",
|
||||
@@ -4811,6 +4811,61 @@
|
||||
],
|
||||
"time": "2016-09-01T10:05:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vluzrmos/language-detector",
|
||||
"version": "v1.0.19",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vluzrmos/laravel-language-detector.git",
|
||||
"reference": "7aeb9531e8caee41421a8a1d53920eadcc602ad9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vluzrmos/laravel-language-detector/zipball/7aeb9531e8caee41421a8a1d53920eadcc602ad9",
|
||||
"reference": "7aeb9531e8caee41421a8a1d53920eadcc602ad9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"illuminate/config": "~5.0",
|
||||
"illuminate/cookie": "~5.0",
|
||||
"illuminate/support": "~5.0",
|
||||
"illuminate/translation": "~5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"fabpot/php-cs-fixer": "~1.11",
|
||||
"mockery/mockery": "0.9.*",
|
||||
"orchestra/testbench": "3.0.*",
|
||||
"phpunit/phpunit": "~4.0"
|
||||
},
|
||||
"type": "package",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Vluzrmos\\LanguageDetector\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/Support/helpers.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Vagner do Carmo",
|
||||
"email": "vluzrmos@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Detect the language for your application using browser preferences, subdomains or route prefixes.",
|
||||
"keywords": [
|
||||
"i18n",
|
||||
"language",
|
||||
"laravel",
|
||||
"locale",
|
||||
"lumen"
|
||||
],
|
||||
"time": "2017-03-11T03:40:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "zendframework/zend-diactoros",
|
||||
"version": "1.7.1",
|
||||
|
||||
+2
-1
@@ -65,7 +65,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'locale' => 'en',
|
||||
'locale' => env('APP_DEFAULT_LOCALE', 'en'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -154,6 +154,7 @@ return [
|
||||
App\Providers\AppServiceProvider::class,
|
||||
App\Providers\AuthServiceProvider::class,
|
||||
App\Providers\EventServiceProvider::class,
|
||||
Vluzrmos\LanguageDetector\Providers\LanguageDetectorServiceProvider::class,
|
||||
App\Providers\RouteServiceProvider::class,
|
||||
Laravel\Socialite\SocialiteServiceProvider::class,
|
||||
Intervention\Image\ImageServiceProvider::class,
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
* Indicates whenever should autodetect and apply the language of the request.
|
||||
*/
|
||||
'autodetect' => env('LANG_DETECTOR_AUTODETECT', false),
|
||||
|
||||
/*
|
||||
* Default driver to use to detect the request language.
|
||||
*
|
||||
* Available: browser, subdomain, uri.
|
||||
*/
|
||||
'driver' => env('LANG_DETECTOR_DRIVER', 'browser'),
|
||||
|
||||
/*
|
||||
* Used on subdomain and uri drivers. That indicates which segment should be used
|
||||
* to verify the language.
|
||||
*/
|
||||
'segment' => env('LANG_DETECTOR_SEGMENT', 0),
|
||||
|
||||
/*
|
||||
* Languages available on the application.
|
||||
*
|
||||
* You could use parse_langs_to_array to use the string syntax
|
||||
* or just use the array of languages with its aliases.
|
||||
*/
|
||||
'languages' => parse_langs_to_array(
|
||||
env('LANG_DETECTOR_LANGUAGES', 'auto')
|
||||
),
|
||||
|
||||
/*
|
||||
* Indicates if should store detected locale on cookies
|
||||
*/
|
||||
'cookie' => (bool) env('LANG_DETECTOR_COOKIE', true),
|
||||
|
||||
/*
|
||||
* Indicates if should encrypt cookie
|
||||
*/
|
||||
'cookie_encrypt' => (bool) env('LANG_DETECTOR_COOKIE_ENCRYPT', false),
|
||||
|
||||
/*
|
||||
* Cookie name
|
||||
*/
|
||||
'cookie_name' => env('LANG_DETECTOR_COOKIE', 'locale'),
|
||||
];
|
||||
@@ -2,27 +2,6 @@
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Locales supported by the application
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the list of locales that we will use to localize the application.
|
||||
| Each locale is defined in `resources/lang/` in its respective folder.
|
||||
|
|
||||
*/
|
||||
'langs' => [
|
||||
'en',
|
||||
'fr',
|
||||
'pt',
|
||||
'ru',
|
||||
'cs',
|
||||
'it',
|
||||
'de',
|
||||
'zh',
|
||||
'he',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Disable User registration
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="QUEUE_DRIVER" value="sync"/>
|
||||
<env name="APP_DEFAULT_LOCALE" value="en"/>
|
||||
</php>
|
||||
<logging>
|
||||
<log type="coverage-clover" target="./results/coverage.xml"/>
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
<env name="CACHE_DRIVER" value="array"/>
|
||||
<env name="SESSION_DRIVER" value="array"/>
|
||||
<env name="QUEUE_DRIVER" value="sync"/>
|
||||
<env name="APP_DEFAULT_LOCALE" value="en"/>
|
||||
</php>
|
||||
<logging>
|
||||
<log type="coverage-clover" target="./results/coverage.xml"/>
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"/js/app.js": "/js/app.js?id=65c22c70a408625c7e72",
|
||||
"/js/app.js": "/js/app.js?id=60a9453f0d4d480ce5fe",
|
||||
"/css/app.css": "/css/app.css?id=2984556e5f69d69788e7",
|
||||
"/css/stripe.css": "/css/stripe.css?id=956554a2e96db30fafa3",
|
||||
"/js/app.js.map": "/js/app.js.map?id=e62443022dbabf2c461f",
|
||||
"/js/app.js.map": "/js/app.js.map?id=7ddf240b0d44c4c67647",
|
||||
"/css/app.css.map": "/css/app.css.map?id=a1585d15bdf5306642f7",
|
||||
"/css/stripe.css.map": "/css/stripe.css.map?id=80d7af9d49b0922d35e6",
|
||||
"/js/stripe.js": "/js/stripe.js?id=55d823b61fc4f7e8b1ab",
|
||||
"/js/stripe.js.map": "/js/stripe.js.map?id=4f29019f2c2bda216ee1"
|
||||
"/js/stripe.js.map": "/js/stripe.js.map?id=24771ea90ec93c0f1d81"
|
||||
}
|
||||
@@ -12,15 +12,17 @@
|
||||
<div>
|
||||
<div v-if="tokens.length > 0">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Authorized Applications</div>
|
||||
<div class="panel-heading">
|
||||
{{ $t('settings.api_authorized_clients_title') }}
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
<!-- Authorized Tokens -->
|
||||
<table class="table table-borderless m-b-none">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Scopes</th>
|
||||
<th>{{ $t('settings.api_authorized_clients_name') }}</th>
|
||||
<th>{{ $t('settings.api_authorized_clients_scopes') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -42,7 +44,7 @@
|
||||
<!-- Revoke Button -->
|
||||
<td style="vertical-align: middle;">
|
||||
<a class="action-link text-danger" @click="revoke(token)">
|
||||
Revoke
|
||||
{{ $t('app.revoke') }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -11,11 +11,11 @@
|
||||
<div class="panel-heading">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span>
|
||||
OAuth Clients
|
||||
{{ $t('settings.api_oauth_title') }}
|
||||
</span>
|
||||
|
||||
<a class="btn" @click="showCreateClientForm">
|
||||
Create New Client
|
||||
{{ $t('settings.api_oauth_create_new') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -23,15 +23,15 @@
|
||||
<div class="panel-body">
|
||||
<!-- Current Clients -->
|
||||
<p class="m-b-none" v-if="clients.length === 0">
|
||||
You have not created any OAuth clients.
|
||||
{{ $t('settings.api_oauth_not_created') }}
|
||||
</p>
|
||||
|
||||
<table class="table table-borderless m-b-none" v-if="clients.length > 0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Client ID</th>
|
||||
<th>Name</th>
|
||||
<th>Secret</th>
|
||||
<th>{{ $t('settings.api_oauth_clientid') }}</th>
|
||||
<th>{{ $t('settings.api_oauth_name') }}</th>
|
||||
<th>{{ $t('settings.api_oauth_secret') }}</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
@@ -57,14 +57,14 @@
|
||||
<!-- Edit Button -->
|
||||
<td style="vertical-align: middle;">
|
||||
<a class="action-link" @click="edit(client)">
|
||||
Edit
|
||||
{{ $t('app.edit') }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
<!-- Delete Button -->
|
||||
<td style="vertical-align: middle;">
|
||||
<a class="action-link text-danger" @click="destroy(client)">
|
||||
Delete
|
||||
{{ $t('app.delete') }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -81,7 +81,7 @@
|
||||
<button type="button " class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
|
||||
<h4 class="modal-title">
|
||||
Create Client
|
||||
{{ $t('settings.api_oauth_create') }}
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
@@ -101,28 +101,28 @@
|
||||
<form class="form-horizontal" role="form">
|
||||
<!-- Name -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">Name</label>
|
||||
<label class="col-md-3 control-label">{{ $t('settings.api_oauth_name') }}</label>
|
||||
|
||||
<div class="col-md-7">
|
||||
<input id="create-client-name" type="text" class="form-control"
|
||||
@keyup.enter="store" v-model="createForm.name">
|
||||
|
||||
<span class="help-block">
|
||||
Something your users will recognize and trust.
|
||||
{{ $t('settings.api_oauth_name_help') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Redirect URL -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">Redirect URL</label>
|
||||
<label class="col-md-3 control-label">{{ $t('settings.api_oauth_redirecturl') }}</label>
|
||||
|
||||
<div class="col-md-7">
|
||||
<input type="text" class="form-control" name="redirect"
|
||||
@keyup.enter="store" v-model="createForm.redirect">
|
||||
|
||||
<span class="help-block">
|
||||
Your application's authorization callback URL.
|
||||
{{ $t('settings.api_oauth_redirecturl_help') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -131,11 +131,9 @@
|
||||
|
||||
<!-- Modal Actions -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('app.close') }}</button>
|
||||
|
||||
<button type="button" class="btn btn-primary" @click="store">
|
||||
Create
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" @click="store">{{ $t('app.create') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -169,28 +167,28 @@
|
||||
<form class="form-horizontal" role="form">
|
||||
<!-- Name -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">Name</label>
|
||||
<label class="col-md-3 control-label">{{ $t('settings.api_oauth_name') }}</label>
|
||||
|
||||
<div class="col-md-7">
|
||||
<input id="edit-client-name" type="text" class="form-control"
|
||||
@keyup.enter="update" v-model="editForm.name">
|
||||
|
||||
<span class="help-block">
|
||||
Something your users will recognize and trust.
|
||||
{{ $t('settings.api_oauth_name_help') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Redirect URL -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">Redirect URL</label>
|
||||
<label class="col-md-3 control-label">{{ $t('settings.api_oauth_redirecturl') }}</label>
|
||||
|
||||
<div class="col-md-7">
|
||||
<input type="text" class="form-control" name="redirect"
|
||||
@keyup.enter="update" v-model="editForm.redirect">
|
||||
|
||||
<span class="help-block">
|
||||
Your application's authorization callback URL.
|
||||
{{ $t('settings.api_oauth_redirecturl_help') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -199,11 +197,9 @@
|
||||
|
||||
<!-- Modal Actions -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('app.close') }}</button>
|
||||
|
||||
<button type="button" class="btn btn-primary" @click="update">
|
||||
Save Changes
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" @click="update">{{ $t('app.save') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
<div class="panel-heading">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span>
|
||||
Personal Access Tokens
|
||||
{{ $t('settings.api_personal_access_tokens') }}
|
||||
</span>
|
||||
|
||||
<a class="btn" @click="showCreateTokenForm">
|
||||
Create New Token
|
||||
{{ $t('settings.api_token_create_new') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -37,14 +37,14 @@
|
||||
<div class="panel-body">
|
||||
<!-- No Tokens Notice -->
|
||||
<p class="m-b-none" v-if="tokens.length === 0">
|
||||
You have not created any personal access tokens.
|
||||
{{ $t('settings.api_token_not_created') }}
|
||||
</p>
|
||||
|
||||
<!-- Personal Access Tokens -->
|
||||
<table class="table table-borderless m-b-none" v-if="tokens.length > 0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>{{ $t('settings.api_token_name') }}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -59,7 +59,7 @@
|
||||
<!-- Delete Button -->
|
||||
<td style="vertical-align: middle;">
|
||||
<a class="action-link text-danger" @click="revoke(token)">
|
||||
Delete
|
||||
{{ $t('settings.api_token_delete') }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -77,7 +77,7 @@
|
||||
<button type="button " class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
|
||||
<h4 class="modal-title">
|
||||
Create Token
|
||||
{{ $t('settings.api_token_create') }}
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
<form class="form-horizontal" role="form" @submit.prevent="store">
|
||||
<!-- Name -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-4 control-label">Name</label>
|
||||
<label class="col-md-4 control-label">{{ $t('settings.api_token_name') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="create-token-name" type="text" class="form-control" name="name" v-model="form.name">
|
||||
@@ -106,7 +106,7 @@
|
||||
|
||||
<!-- Scopes -->
|
||||
<div class="form-group" v-if="scopes.length > 0">
|
||||
<label class="col-md-4 control-label">Scopes</label>
|
||||
<label class="col-md-4 control-label">{{ $t('settings.api_token_scopes') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div v-for="scope in scopes">
|
||||
@@ -127,11 +127,9 @@
|
||||
|
||||
<!-- Modal Actions -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('app.close') }}</button>
|
||||
|
||||
<button type="button" class="btn btn-primary" @click="store">
|
||||
Create
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" @click="store">{{ $t('app.create') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -142,18 +140,15 @@
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button " class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
|
||||
<h4 class="modal-title">
|
||||
Personal Access Token
|
||||
{{ $t('settings.api_token_title') }}
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
<p>
|
||||
Here is your new personal access token. This is the only time it will be shown so don't lose it!
|
||||
You may now use this token to make API requests.
|
||||
</p>
|
||||
<p>{{ $t('settings.api_token_help') }}</p>
|
||||
|
||||
<div class="access-key">
|
||||
<pre><code>{{ accessToken }}</code></pre>
|
||||
@@ -162,7 +157,7 @@
|
||||
|
||||
<!-- Modal Actions -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('app.close') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
<span class="ml1 mr1 black-50">•</span>
|
||||
</span>
|
||||
<a v-if="gift.comment" @click="toggleComment(gift)" class="ml1 mr1 pointer">{{ $t('people.gifts_view_comment') }}</a>
|
||||
<a @click="toggle(gift)" class="pointer mr1">Mark as an idea</a>
|
||||
<a @click="toggle(gift)" class="pointer mr1">{{ $t('people.gifts_offered_as_an_idea') }}</a>
|
||||
<a :href="'/people/' + contactId + '/gifts/' + gift.id + '/edit'">{{ $t('app.edit') }}</a>
|
||||
<a @click="showDeleteModal(gift)" class="mr1 pointer">{{ $t('app.delete') }}</a>
|
||||
<div v-if="gift.show_comment" class="mb1 mt1">
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
<div class="mb4">
|
||||
<p class="mb2">{{ $t('settings.personalization_genders_modal_delete_desc', {name: deleteForm.name}) }}</p>
|
||||
<div v-if="numberOfContacts != 0">
|
||||
<p>{{ $t('settings.personalization_genders_modal_delete_question', {numberOfContacts: numberOfContacts}) }}</p>
|
||||
<p>{{ $tc('settings.personalization_genders_modal_delete_question', numberOfContacts, {numberOfContacts: numberOfContacts}) }}</p>
|
||||
<form-select
|
||||
v-model="deleteForm.newId"
|
||||
:options="genders"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<div class="dt-row bb b--light-gray" v-for="reminderRule in reminderRules" :key="reminderRule.id">
|
||||
<div class="dtc">
|
||||
<div class="pa2">
|
||||
{{ $t('settings.personalization_reminder_rule_line', {count: reminderRule.number_of_days_before}) }}
|
||||
{{ $tc('settings.personalization_reminder_rule_line', reminderRule.number_of_days_before, {count: reminderRule.number_of_days_before}) }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="dtc tr">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,9 @@ return [
|
||||
'edit' => 'Edit',
|
||||
'upload' => 'Upload',
|
||||
'close' => 'Close',
|
||||
'create' => 'Create',
|
||||
'remove' => 'Remove',
|
||||
'revoke' => 'Revoke',
|
||||
'done' => 'Done',
|
||||
'verify' => 'Verify',
|
||||
'for' => 'for',
|
||||
@@ -18,6 +20,10 @@ return [
|
||||
'loading' => 'Loading...',
|
||||
'with' => 'with',
|
||||
|
||||
'application_title' => 'Monica – a CRM for your friends and family',
|
||||
'application_description' => 'Monica is a tool to manage your interactions with your loved ones, friends and family.',
|
||||
'application_og_title' => 'Have better relations with your loved ones. Free Online CRM for friends and family.',
|
||||
|
||||
'markdown_description' => 'Want to format your text in a nice way? We support Markdown to add bold, italic, lists and more.',
|
||||
'markdown_link' => 'Read documentation',
|
||||
|
||||
|
||||
@@ -23,4 +23,40 @@ return [
|
||||
'2fa_one_time_password' => 'Authentication code',
|
||||
'2fa_recuperation_code' => 'Enter a two factor recovery code',
|
||||
|
||||
'login_to_account' => 'Login to your account',
|
||||
'email' => 'Email',
|
||||
'password' => 'Password',
|
||||
'login' => 'Login',
|
||||
'button_remember' => 'Remember Me',
|
||||
'password_forget' => 'Forget your password?',
|
||||
'password_reset' => 'Reset your password',
|
||||
'signup_no_account' => "Don't have an account?",
|
||||
'signup' => 'Sign up',
|
||||
'create_account' => 'Create the first account by <a href=":url">signing up</a>',
|
||||
|
||||
'password_reset_title' => 'Reset Password',
|
||||
'password_reset_email' => 'E-Mail Address',
|
||||
'password_reset_send_link' => 'Send Password Reset Link',
|
||||
'password_reset_password' => 'Password',
|
||||
'password_reset_password_confirm' => 'Confirm Password',
|
||||
'password_reset_action' => 'Reset Password',
|
||||
'password_reset_email_content' => 'Click here to reset your password:',
|
||||
|
||||
'register_title_welcome' => 'Welcome to your newly installed Monica instance',
|
||||
'register_create_account' => 'You need to create an account to use Monica',
|
||||
'register_title_create' => 'Create your Monica account',
|
||||
'register_login' => '<a href=":url">Log in</a> if you already have an account.',
|
||||
'register_email' => 'Enter a valid email address',
|
||||
'register_email_example' => 'you@home',
|
||||
'register_firstname' => 'First name',
|
||||
'register_firstname_example' => 'eg. John',
|
||||
'register_lastname' => 'Last name',
|
||||
'register_lastname_example' => 'eg. Doe',
|
||||
'register_password' => 'Password',
|
||||
'register_password_example' => 'Enter a secure password',
|
||||
'register_password_confirmation' => 'Password confirmation',
|
||||
'register_action' => 'Register',
|
||||
'register_policy' => 'Signing up signifies you’ve read and agree to our <a href=":url">Privacy Policy</a>.',
|
||||
'register_invitation_email' => 'For security purposes, please indicate the email of the person who\'ve invited you to join this account. This information is provided in the invitation email.',
|
||||
|
||||
];
|
||||
|
||||
@@ -4,6 +4,7 @@ return [
|
||||
'dashboard_blank_title' => 'Welcome to your account!',
|
||||
'dashboard_blank_description' => 'Monica is the place to organize all the interactions you have with the ones you care about.',
|
||||
'dashboard_blank_cta' => 'Add your first contact',
|
||||
'dashboard_blank_illustration' => 'Illustration by <a href=":url">Freepik</a>',
|
||||
|
||||
'notes_title' => 'You don\'t have any starred notes yet.',
|
||||
|
||||
@@ -15,4 +16,8 @@ return [
|
||||
'statistics_activities' => 'Activities',
|
||||
'statistics_gifts' => 'Gifts',
|
||||
|
||||
'reminders_next_months' => 'Events in the next 3 months',
|
||||
'reminders_none' => 'No reminder for this month',
|
||||
|
||||
'linkedin_profile' => 'LinkedIn',
|
||||
];
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
return [
|
||||
|
||||
//index
|
||||
'people_list_number_kids' => '{0} 0 kid|{1,1} 1 kid|{2,*} :count kids',
|
||||
'people_list_number_kids' => '1 kid|:count kids',
|
||||
'people_list_last_updated' => 'Last consulted:',
|
||||
'people_list_number_reminders' => '{0} 0 reminders|{1,1} 1 reminder|{2, *} :count reminders',
|
||||
'people_list_number_reminders' => '1 reminder|:count reminders',
|
||||
'people_list_blank_title' => 'You don\'t have anyone in your account yet',
|
||||
'people_list_blank_cta' => 'Add someone',
|
||||
'people_list_sort' => 'Sort',
|
||||
@@ -18,7 +18,7 @@ return [
|
||||
'people_list_lastactivitydateOldtoNew' => 'Sort by last activity date oldest to newest',
|
||||
'people_list_filter_tag' => 'Showing all the contacts tagged with ',
|
||||
'people_list_clear_filter' => 'Clear filter',
|
||||
'people_list_contacts_per_tags' => '{0} 0 contact|{1,1} 1 contact|{2,*} :count contacts',
|
||||
'people_list_contacts_per_tags' => '1 contact|:count contacts',
|
||||
'people_search' => 'Search your contacts...',
|
||||
'people_search_no_results' => 'No relevant contacts found :(',
|
||||
'people_list_account_usage' => 'Your account usage: :current/:limit contacts',
|
||||
@@ -42,6 +42,7 @@ return [
|
||||
'people_add_birthday_reminder' => 'Wish happy birthday to :name',
|
||||
'people_add_import' => 'Do you want to <a href="/settings/import">import your contacts</a>?',
|
||||
'people_edit_email_error' => 'There is already a contact in your account with this email address. Please choose another one.',
|
||||
'people_export' => 'Export as vCard',
|
||||
|
||||
// show
|
||||
'section_contact_information' => 'Contact information',
|
||||
@@ -95,7 +96,7 @@ return [
|
||||
'information_edit_probably' => 'This person is probably...',
|
||||
'information_edit_not_year' => 'I know the day and month of the birthdate of this person, but not the year…',
|
||||
'information_edit_exact' => 'I know the exact birthdate of this person...',
|
||||
'information_edit_help' => 'If you indicate an exact birthdate for this person, we will create a new reminder for you - so you\'ll be notified every year when it\'s time to celebrate this person\'s birthdate.',
|
||||
'information_edit_help' => 'If you indicate an exact birthdate for this person, we will create a new reminder for you – so you\'ll be notified every year when it\'s time to celebrate this person\'s birthdate.',
|
||||
'information_no_linkedin_defined' => 'No LinkedIn defined',
|
||||
'information_no_work_defined' => 'No work information defined',
|
||||
'information_work_at' => 'at :company',
|
||||
@@ -104,6 +105,7 @@ return [
|
||||
'work_edit_title' => 'Update :name\'s job information',
|
||||
'work_edit_job' => 'Job title (optional)',
|
||||
'work_edit_company' => 'Company (optional)',
|
||||
'work_information' => 'Work information',
|
||||
|
||||
// food preferencies
|
||||
'food_preferencies_add_success' => 'Food preferences have been saved',
|
||||
@@ -156,11 +158,11 @@ return [
|
||||
'significant_other_add_probably' => 'This person is probably',
|
||||
'significant_other_add_probably_yo' => 'years old',
|
||||
'significant_other_add_exact' => 'I know the exact birthdate of this person, which is',
|
||||
'significant_other_add_help' => 'If you indicate an exact birthdate for this person, we will create a new reminder for you - so you\'ll be notified every year when it\'s time to celebrate this person\'s birthdate.',
|
||||
'significant_other_add_help' => 'If you indicate an exact birthdate for this person, we will create a new reminder for you – so you\'ll be notified every year when it\'s time to celebrate this person\'s birthdate.',
|
||||
'significant_other_add_cta' => 'Add significant other',
|
||||
'significant_other_edit_cta' => 'Edit significant other',
|
||||
'significant_other_delete_confirmation' => 'Are you sure you want to delete this significant other? Deletion is permanent',
|
||||
'significant_other_unlink_confirmation' => 'Are you sure you want to delete this relationship? This significant other will not be deleted - only the relationship between the two.',
|
||||
'significant_other_unlink_confirmation' => 'Are you sure you want to delete this relationship? This significant other will not be deleted – only the relationship between the two.',
|
||||
'significant_other_add_success' => 'The significant other has been added successfully',
|
||||
'significant_other_edit_success' => 'The significant other has been updated successfully',
|
||||
'significant_other_delete_success' => 'The significant other has been deleted successfully',
|
||||
@@ -173,6 +175,7 @@ return [
|
||||
'contact_add_add_description' => 'This will let you treat this significant other like any other contact.',
|
||||
|
||||
// kids
|
||||
'kid_add_title' => 'Add a new kid',
|
||||
'kids_sidebar_title' => 'Children',
|
||||
'kids_sidebar_cta' => 'Add another child',
|
||||
'kids_blank_cta' => 'Add a child',
|
||||
@@ -190,7 +193,7 @@ return [
|
||||
'kids_add_probably' => 'This child is probably',
|
||||
'kids_add_probably_yo' => 'years old',
|
||||
'kids_add_exact' => 'I know the exact birthdate of this child, which is',
|
||||
'kids_add_help' => 'If you indicate an exact birthdate for this child, we will create a new reminder for you - so you\'ll be notified every year when it\'s time to celebrate this child\'s birthdate',
|
||||
'kids_add_help' => 'If you indicate an exact birthdate for this child, we will create a new reminder for you – so you\'ll be notified every year when it\'s time to celebrate this child\'s birthdate',
|
||||
'kids_add_cta' => 'Add child',
|
||||
'kids_edit_title' => 'Edit information about :name',
|
||||
'kids_delete_confirmation' => 'Are you sure you want to delete this child? Deletion is permanent',
|
||||
@@ -198,7 +201,7 @@ return [
|
||||
'kids_update_success' => 'The child has been updated successfully',
|
||||
'kids_delete_success' => 'The child has been deleted successfully',
|
||||
'kids_add_birthday_reminder' => 'Wish happy birthday to :name, :contact_firstname\'s child',
|
||||
'kids_unlink_confirmation' => 'Are you sure you want to delete this relationship? This kid will not be deleted - only the relationship between the two.',
|
||||
'kids_unlink_confirmation' => 'Are you sure you want to delete this relationship? This kid will not be deleted – only the relationship between the two.',
|
||||
|
||||
// tasks
|
||||
'tasks_blank_title' => 'You don\'t have any tasks yet.',
|
||||
@@ -273,6 +276,7 @@ return [
|
||||
'gifts_add_someone' => 'This gift is for someone in :name\'s family in particular',
|
||||
'gifts_ideas' => 'Gift ideas',
|
||||
'gifts_offered' => 'Gifts offered',
|
||||
'gifts_offered_as_an_idea' => 'Mark as an idea',
|
||||
'gifts_received' => 'Gifts received',
|
||||
'gifts_view_comment' => 'View comment',
|
||||
'gifts_mark_offered' => 'Mark as offered',
|
||||
|
||||
@@ -12,12 +12,14 @@ return [
|
||||
'sidebar_settings_security' => 'Security',
|
||||
|
||||
'export_title' => 'Export your account data',
|
||||
'export_be_patient' => 'Click the button to start the export. It might take several minutes to process the export - please be patient and do not spam the button.',
|
||||
'export_be_patient' => 'Click the button to start the export. It might take several minutes to process the export – please be patient and do not spam the button.',
|
||||
'export_title_sql' => 'Export to SQL',
|
||||
'export_sql_explanation' => 'Exporting your data in SQL format allows you to take your data and import it to your own Monica instance. This is only valuable if you do have your own server.',
|
||||
'export_sql_cta' => 'Export to SQL',
|
||||
'export_sql_link_instructions' => 'Note: <a href=":url">read the instructions</a> to learn more about importing this file to your instance.',
|
||||
|
||||
'firstname' => 'First name',
|
||||
'lastname' => 'Last name',
|
||||
'name_order' => 'Name order',
|
||||
'name_order_firstname_first' => 'First name first (John Doe)',
|
||||
'name_order_lastname_first' => 'Last name first (Doe John)',
|
||||
@@ -51,6 +53,7 @@ return [
|
||||
'locale_de' => 'German',
|
||||
'locale_zh' => 'Chinese Simplified',
|
||||
'locale_he' => 'Hebrew',
|
||||
'locale_es' => 'Spanish',
|
||||
|
||||
'security_title' => 'Security',
|
||||
'security_help' => 'Change security matters for your account.',
|
||||
@@ -91,6 +94,7 @@ return [
|
||||
'users_add_email_field' => 'Enter the email of the person you want to invite',
|
||||
'users_add_confirmation' => 'I confirm that I want to invite this user to my account. This person will access ALL my data and see exactly what I see.',
|
||||
'users_add_cta' => 'Invite user by email',
|
||||
'users_accept_title' => 'Accept invitation and create a new account',
|
||||
'users_error_please_confirm' => 'Please confirm that you want to invite this user before proceeding with the invitation',
|
||||
'users_error_email_already_taken' => 'This email is already taken. Please choose another one',
|
||||
'users_error_already_invited' => 'You already have invited this user. Please choose another email address.',
|
||||
@@ -98,9 +102,10 @@ return [
|
||||
'users_invitation_deleted_confirmation_message' => 'The invitation has been successfully deleted',
|
||||
'users_invitations_delete_confirmation' => 'Are you sure you want to delete this invitation?',
|
||||
'users_list_delete_confirmation' => 'Are you sure to delete this user from your account?',
|
||||
'users_invitation_need_subscription' => 'Adding more users requires a subscription.',
|
||||
|
||||
'subscriptions_account_current_plan' => 'Your current plan',
|
||||
'subscriptions_account_paid_plan' => 'You are on the :name plan. It costs $:price every month.',
|
||||
'subscriptions_account_current_paid_plan' => 'You are on the :name plan. Thanks so much for being a subscriber.',
|
||||
'subscriptions_account_next_billing' => 'Your subscription will auto-renew on <strong>:date</strong>. You can <a href=":url">cancel subscription</a> anytime.',
|
||||
'subscriptions_account_free_plan' => 'You are on the free plan.',
|
||||
'subscriptions_account_free_plan_upgrade' => 'You can upgrade your account to the :name plan, which costs $:price per month. Here are the advantages:',
|
||||
@@ -109,26 +114,59 @@ return [
|
||||
'subscriptions_account_free_plan_benefits_import_data_vcard' => 'Import your contacts with vCard',
|
||||
'subscriptions_account_free_plan_benefits_support' => 'Support the project on the long run, so we can introduce more great features.',
|
||||
'subscriptions_account_upgrade' => 'Upgrade your account',
|
||||
'subscriptions_account_upgrade_title' => 'Upgrade Monica today and have more meaningful relationships.',
|
||||
'subscriptions_account_upgrade_choice' => 'Pick a plan below and join over :customers persons who upgraded their Monica.',
|
||||
'subscriptions_account_invoices' => 'Invoices',
|
||||
'subscriptions_account_invoices_download' => 'Download',
|
||||
'subscriptions_account_payment' => 'Which payment option fits you best?',
|
||||
'subscriptions_downgrade_title' => 'Downgrade your account to the free plan',
|
||||
'subscriptions_downgrade_limitations' => 'The free plan has limitations. In order to be able to downgrade, you need to pass the checklist below:',
|
||||
'subscriptions_downgrade_rule_users' => 'You must have only 1 user in your account',
|
||||
'subscriptions_downgrade_rule_users_constraint' => 'You currently have <a href=":url">:count users</a> in your account.',
|
||||
'subscriptions_downgrade_rule_users_constraint' => 'You currently have <a href=":url">1 user</a> in your account.|You currently have <a href=":url">:count users</a> in your account.',
|
||||
'subscriptions_downgrade_rule_invitations' => 'You must not have pending invitations',
|
||||
'subscriptions_downgrade_rule_invitations_constraint' => 'You currently have <a href="/settings/users/">:count pending invitations</a> sent to people.',
|
||||
'subscriptions_downgrade_rule_invitations_constraint' => 'You currently have <a href="/settings/users/">1 pending invitation</a> sent to people.|You currently have <a href="/settings/users/">:count pending invitations</a> sent to people.',
|
||||
'subscriptions_downgrade_cta' => 'Downgrade',
|
||||
'subscriptions_downgrade_success' => 'You are back to the Free plan!',
|
||||
'subscriptions_downgrade_thanks' => 'Thanks so much for having tried the paid plan. We keep adding new features on Monica all the time – so you might want to come back in the future to see if you might be interested in taking a subscription again.',
|
||||
'subscriptions_back' => 'Back to settings',
|
||||
'subscriptions_upgrade_title' => 'Upgrade your account',
|
||||
'subscriptions_upgrade_description' => 'Please enter your card details below. Monica uses <a href="https://stripe.com">Stripe</a> to process your payments securely. No credit card information are stored on our servers.',
|
||||
'subscriptions_upgrade_choose' => 'You picked the :plan plan.',
|
||||
'subscriptions_upgrade_thanks' => "We couldn't be happier. Enter your payment info below.",
|
||||
'subscriptions_upgrade_name' => 'Name on card',
|
||||
'subscriptions_upgrade_zip' => 'ZIP or postal code',
|
||||
'subscriptions_upgrade_credit' => 'Credit or debit card',
|
||||
'subscriptions_upgrade_warning' => 'Your account will be instantly updated. You can upgrade, downgrade, or cancel any time. When you cancel, you will never be charged again. However, you will not be refunded for the current month.',
|
||||
'subscriptions_upgrade_cta' => ' Charge my card $:price every month',
|
||||
'subscriptions_upgrade_submit' => 'Submit Payment',
|
||||
'subscriptions_upgrade_charge' => "We'll charge your card USD $:price now. The next charge will be on :date. If you ever change your mind, you can cancel anytime, no questions asked.",
|
||||
'subscriptions_upgrade_charge_handled' => 'The payment is handled by <a href=":url">Stripe</a>. No card information touches our server.',
|
||||
'subscriptions_upgrade_success' => 'Thank you! You are now subscribed.',
|
||||
'subscriptions_upgrade_thanks' => 'Welcome to the community of people who try to make the world a better place.',
|
||||
|
||||
'subscriptions_pdf_title' => 'Your :name monthly subscription',
|
||||
'subscriptions_plan_choose' => 'Choose this plan',
|
||||
'subscriptions_plan_year_title' => 'Pay annually',
|
||||
'subscriptions_plan_year_cost' => '$45/year',
|
||||
'subscriptions_plan_year_cost_save' => "you'll save 25%",
|
||||
'subscriptions_plan_year_bonus' => 'Peace of mind for a whole year',
|
||||
'subscriptions_plan_month_title' => 'Pay monthly',
|
||||
'subscriptions_plan_month_cost' => '$5/month',
|
||||
'subscriptions_plan_month_bonus' => 'Cancel any time',
|
||||
'subscriptions_plan_include1' => 'Included with your upgrade:',
|
||||
'subscriptions_plan_include2' => 'Unlimited number of users • Reminders by email • Import with vCard',
|
||||
'subscriptions_plan_include3' => '100% of the profits go the development of this great open source project.',
|
||||
'subscriptions_help_title' => 'Additional details you may be curious about',
|
||||
'subscriptions_help_opensource_title' => 'What is an open source project?',
|
||||
'subscriptions_help_opensource_desc' => "Monica is an open source project. This means it is built by an entirely benevolent community who just wants to provide a great tool for the greater good. Being open source means the code is publicly available on GitHub, and everyone can inspect it, modify it or enhance it. All the money we raise is dedicated to build better features, have more powerful servers, help pay the bills. Thanks for your help. We couldn't do it without you – litterally.",
|
||||
'subscriptions_help_limits_title' => 'Is there any limit to the number of contacts we can have on the free plan?',
|
||||
'subscriptions_help_limits_plan' => 'Absolutely not. Free plans do not have limitations on the number of contacts you can have.',
|
||||
'subscriptions_help_discounts_title' => 'Do you have discounts for non-profits and education?',
|
||||
'subscriptions_help_discounts_desc' => "We do! Monica is free for students, and free for non-profits and charities. Just contact <a href=':support'>the support</a> with a proof of your status and we'll apply this special status in your account.",
|
||||
'subscriptions_help_change_title' => 'What if I change my mind?',
|
||||
'subscriptions_help_change_desc' => 'You can cancel anytime, no questions asked, and all by yourself – no need to contact support or whatever. However, you will not be refunded for the current period.',
|
||||
|
||||
'import_title' => 'Import contacts in your account',
|
||||
'import_cta' => 'Upload contacts',
|
||||
'import_stat' => 'You\'ve imported :number files so far.',
|
||||
'import_result_stat' => 'Uploaded vCard with :total_contacts contacts (:total_imported imported, :total_skipped skipped)',
|
||||
'import_result_stat' => 'Uploaded vCard with 1 contact (:total_imported imported, :total_skipped skipped)|Uploaded vCard with :total_contacts contacts (:total_imported imported, :total_skipped skipped)',
|
||||
'import_view_report' => 'View report',
|
||||
'import_in_progress' => 'The import is in progress. Reload the page in one minute.',
|
||||
'import_upload_title' => 'Import your contacts from a vCard file',
|
||||
@@ -155,10 +193,11 @@ return [
|
||||
'import_blank_question' => 'Would you like to import contacts now?',
|
||||
'import_blank_description' => 'We can import vCard files that you can get from Google Contacts or your Contact manager.',
|
||||
'import_blank_cta' => 'Import vCard',
|
||||
'import_need_subscription' => 'Importing data requires a subscription.',
|
||||
|
||||
'tags_list_title' => 'Tags',
|
||||
'tags_list_description' => 'You can organize your contacts by setting up tags. Tags work like folders, but you can add more than one tag to a contact. To add a new tag, add it on the contact itself.',
|
||||
'tags_list_contact_number' => ':count contacts',
|
||||
'tags_list_contact_number' => '1 contact|:count contacts',
|
||||
'tags_list_delete_success' => 'The tag has been successfully deleted',
|
||||
'tags_list_delete_confirmation' => 'Are you sure you want to delete the tag? No contacts will be deleted, only the tag.',
|
||||
'tags_blank_title' => 'Tags are a great way of categorizing your contacts.',
|
||||
@@ -166,12 +205,36 @@ return [
|
||||
|
||||
'api_title' => 'API access',
|
||||
'api_description' => 'The API can be used to manipulate Monica\'s data from an external application, like a mobile application for instance.',
|
||||
|
||||
'api_personal_access_tokens' => 'Personal access tokens',
|
||||
'api_pao_description' => 'Make sure you give this token to a source you trust - as they allow you to access all your data.',
|
||||
'api_pao_description' => 'Make sure you give this token to a source you trust – as they allow you to access all your data.',
|
||||
'api_token_title' => 'Personal access token',
|
||||
'api_token_create_new' => 'Create New Token',
|
||||
'api_token_not_created' => 'You have not created any personal access tokens.',
|
||||
'api_token_name' => 'Name',
|
||||
'api_token_delete' => 'Delete',
|
||||
'api_token_create' => 'Create Token',
|
||||
'api_token_scopes' => 'Scopes',
|
||||
'api_token_help' => 'Here is your new personal access token. This is the only time it will be shown so don’t lose it! You may now use this token to make API requests.',
|
||||
|
||||
'api_oauth_clients' => 'Your Oauth clients',
|
||||
'api_oauth_clients_desc' => 'This section lets you register your own OAuth clients.',
|
||||
'api_oauth_title' => 'Oauth Clients',
|
||||
'api_oauth_create_new' => 'Create New Client',
|
||||
'api_oauth_not_created' => 'You have not created any OAuth clients.',
|
||||
'api_oauth_clientid' => 'Client ID',
|
||||
'api_oauth_name' => 'Name',
|
||||
'api_oauth_name_help' => 'Something your users will recognize and trust.',
|
||||
'api_oauth_secret' => 'Secret',
|
||||
'api_oauth_create' => 'Create Client',
|
||||
'api_oauth_redirecturl' => 'Redirect URL',
|
||||
'api_oauth_redirecturl_help' => "Your application's authorization callback URL.",
|
||||
|
||||
'api_authorized_clients' => 'List of authorized clients',
|
||||
'api_authorized_clients_desc' => 'This section lists all the clients you\'ve authorized to access your application. You can revoke this authorization at anytime.',
|
||||
'api_authorized_clients_title' => 'Authorized Applications',
|
||||
'api_authorized_clients_name' => 'Name',
|
||||
'api_authorized_clients_scopes' => 'Scopes',
|
||||
|
||||
'personalization_tab_title' => 'Personalize your account',
|
||||
|
||||
@@ -209,7 +272,7 @@ return [
|
||||
|
||||
'personalization_reminder_rule_save' => 'The change has been saved',
|
||||
'personalization_reminder_rule_title' => 'Reminder rules',
|
||||
'personalization_reminder_rule_line' => ':count days before',
|
||||
'personalization_reminder_rule_line' => '1 day before|:count days before',
|
||||
'personalization_reminder_rule_desc' => 'For every reminder that you set, we can send you an email some days before the event happens. You can toggle those notifications here. Note that those notifications only apply to monthly and yearly reminders.',
|
||||
|
||||
'reminder_time_to_send' => 'Time of the day reminders should be sent',
|
||||
|
||||
@@ -1 +1 @@
|
||||
Click here to reset your password: <a href="{{ $link = url('password/reset', $token).'?email='.urlencode($user->getEmailForPasswordReset()) }}"> {{ $link }} </a>
|
||||
{{ trans('auth.password_reset_email_content') }} <a href="{{ $link = url('password/reset', $token).'?email='.urlencode($user->getEmailForPasswordReset()) }}">{{ $link }}</a>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
<div class="signup-box">
|
||||
<img class="logo" src="/img/small-logo.png" alt="">
|
||||
<h2>Login to your account</h2>
|
||||
<h2>{{ trans('auth.login_to_account') }}</h2>
|
||||
|
||||
@include ('partials.errors')
|
||||
|
||||
@@ -16,32 +16,32 @@
|
||||
{{ csrf_field() }}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<label for="email">{{ trans('auth.email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<label for="password">{{ trans('auth.password') }}</label>
|
||||
<input type="password" class="form-control" id="password" name="password">
|
||||
</div>
|
||||
|
||||
<div class="form-group actions">
|
||||
<button type="submit" class="btn btn-primary">Login</button>
|
||||
<button type="submit" class="btn btn-primary">{{ trans('auth.login') }}</button>
|
||||
</div>
|
||||
|
||||
<div class="checkbox">
|
||||
<label for="remember">
|
||||
<input type="checkbox" name="remember" id="remember" checked> Remember Me
|
||||
<input type="checkbox" name="remember" id="remember" checked> {{ trans('auth.button_remember') }}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="form-group links">
|
||||
<ul>
|
||||
<li>Forget your password? <a href="/password/reset">Reset your password</a></li>
|
||||
<li>{{ trans('auth.password_forget') }} <a href="/password/reset">{{ trans('auth.password_reset') }}</a></li>
|
||||
@if(! config('monica.disable_signup'))
|
||||
<li>Don't have an account? <a href="/register">Sign up</a></li>
|
||||
<li>{{ trans('auth.signup_no_account') }} <a href="/register">{{ trans('auth.signup') }}</a></li>
|
||||
@elseif(! \App\Account::hasAny())
|
||||
<li>Create the first account by <a href="/register">signing up</a></li>
|
||||
<li>{!! trans('auth.create_account', ['url' => '/register']) !!}</li>
|
||||
@endif
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<div class="col-md-8 col-md-offset-2">
|
||||
<div class="card">
|
||||
<div class="card-block">
|
||||
<div class="card-title">Reset Password</div>
|
||||
<div class="card-title">{{ trans('auth.password_reset_title') }}</div>
|
||||
<div class="panel-body">
|
||||
@if (session('status'))
|
||||
<div class="alert alert-success">
|
||||
@@ -19,7 +19,7 @@
|
||||
{{ csrf_field() }}
|
||||
|
||||
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
|
||||
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
|
||||
<label for="email" class="col-md-4 control-label">{{ trans('auth.password_reset_email') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}">
|
||||
@@ -35,7 +35,7 @@
|
||||
<div class="form-group">
|
||||
<div class="col-md-6 col-md-offset-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fa fa-btn fa-envelope"></i> Send Password Reset Link
|
||||
<i class="fa fa-btn fa-envelope"></i> {{ trans('auth.password_reset_send_link') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div class="col-md-8 col-md-offset-2">
|
||||
<div class="card">
|
||||
<div class="card-block">
|
||||
<div class="card-title">Reset Password</div>
|
||||
<div class="card-title">{{ trans('auth.password_reset_title') }}</div>
|
||||
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal" role="form" method="POST" action="{{ '/password/reset' }}">
|
||||
@@ -17,7 +17,7 @@
|
||||
<input type="hidden" name="token" value="{{ $token }}">
|
||||
|
||||
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
|
||||
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
|
||||
<label for="email" class="col-md-4 control-label">{{ trans('auth.password_reset_email') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="email" type="email" class="form-control" name="email" value="{{ $email or old('email') }}">
|
||||
@@ -31,7 +31,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
|
||||
<label for="password" class="col-md-4 control-label">Password</label>
|
||||
<label for="password" class="col-md-4 control-label">{{ trans('auth.password_reset_password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<input id="password" type="password" class="form-control" name="password">
|
||||
@@ -45,7 +45,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group{{ $errors->has('password_confirmation') ? ' has-error' : '' }}">
|
||||
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>
|
||||
<label for="password-confirm" class="col-md-4 control-label">{{ trans('auth.password_reset_password_confirm') }}</label>
|
||||
<div class="col-md-6">
|
||||
<input id="password-confirm" type="password" class="form-control" name="password_confirmation">
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
<div class="form-group">
|
||||
<div class="col-md-6 col-md-offset-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fa fa-btn fa-refresh"></i> Reset Password
|
||||
<i class="fa fa-btn fa-refresh"></i> {{ trans('auth.password_reset_action') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
<div class="signup-box">
|
||||
<img class="logo" src="/img/small-logo.png" alt="">
|
||||
@if($first)
|
||||
<h1>Welcome to your newly installed Monica instance</h1>
|
||||
<h2>You need to create an account to use Monica</h2>
|
||||
<h1>{{ trans('auth.register_title_welcome') }}</h1>
|
||||
<h2>{{ trans('auth.register_create_account') }}</h2>
|
||||
@else
|
||||
<h2>Create your Monica account</h2>
|
||||
<h3><a href="/login">Log in</a> if you already have an account.</h3>
|
||||
<h2>{{ trans('auth.register_title_create') }}</h2>
|
||||
<h3>{!! trans('auth.register_login', ['url' => '/login']) !!}</h3>
|
||||
@endif
|
||||
|
||||
@include ('partials.errors')
|
||||
@@ -22,41 +22,41 @@
|
||||
{{ csrf_field() }}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Enter a valid email address</label>
|
||||
<input type="email" class="form-control" id="email" name="email" placeholder="you@home" value="{{ old('email') }}" required>
|
||||
<label for="email">{{ trans('auth.register_email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" placeholder="{{ trans('auth.register_email_example') }}" value="{{ old('email') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="form-group">
|
||||
<label for="first_name">First name</label>
|
||||
<input type="text" class="form-control" id="first_name" name="first_name" placeholder="eg. John" value="{{ old('first_name') }}" required>
|
||||
<label for="first_name">{{ trans('auth.register_firstname') }}</label>
|
||||
<input type="text" class="form-control" id="first_name" name="first_name" placeholder="{{ trans('auth.register_firstname_example') }}" value="{{ old('first_name') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="form-group">
|
||||
<label for="last_name">Last name</label>
|
||||
<input type="text" class="form-control" id="last_name" name="last_name" placeholder="eg. Doe" value="{{ old('last_name') }}" required>
|
||||
<label for="last_name">{{ trans('auth.register_lastname') }}</label>
|
||||
<input type="text" class="form-control" id="last_name" name="last_name" placeholder="{{ trans('auth.register_lastname_example') }}" value="{{ old('last_name') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="Enter a secure password" required>
|
||||
<label for="password">{{ trans('auth.register_password') }}</label>
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="{{ trans('auth.register_password_example') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password_confirmation">Password confirmation</label>
|
||||
<label for="password_confirmation">{{ trans('auth.register_password_confirmation') }}</label>
|
||||
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group actions">
|
||||
<button type="submit" class="btn btn-primary">Register</button>
|
||||
<button type="submit" class="btn btn-primary">{{ trans('auth.register_action') }}</button>
|
||||
</div>
|
||||
|
||||
<div class="help">
|
||||
Signing up signifies you’ve read and agree to our <a href="https://monicahq.com/privacy">Privacy Policy</a>.
|
||||
{!! trans('auth.register_policy', ['url' => 'https://monicahq.com/privacy']) !!}
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@@ -20,6 +20,6 @@
|
||||
</li>
|
||||
@endforeach
|
||||
@else
|
||||
<p>No reminder for this month</p>
|
||||
<p>{{ trans('dashboard.reminders_none') }}</p>
|
||||
@endif
|
||||
</ul>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<div class="tc mb3">
|
||||
<img src="/img/dashboard/blank.png">
|
||||
</div>
|
||||
<p class="tc f7">Illustration by <a href="http://www.freepik.com/free-vector/happy-family-illustration_776167.htm">Freepik</a></p>
|
||||
<p class="tc f7">{!! trans('dashboard.dashboard_blank_illustration', ['url' => 'http://www.freepik.com/free-vector/happy-family-illustration_776167.htm']) !!}</p>
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<div class="pa3 bb b--gray-monica">
|
||||
<p class="mb0">
|
||||
<img src="/img/people/reminders.svg" width="17">
|
||||
Events in the next 3 months
|
||||
{{ trans('dashboard.reminders_next_months') }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="pt3 pr3 pl3 mb4">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{{ trans('mail.greetings', ['username' => $user->first_name]) }},
|
||||
|
||||
{{ trans('mail.notification_description', ['count' => $notification->scheduled_number_days_before, 'date' => $notification->reminder->next_expected_date->format('Y-m-d')]) }}
|
||||
{{ trans_choice('mail.notification_description', $notification->scheduled_number_days_before, ['count' => $notification->scheduled_number_days_before, 'date' => $notification->reminder->next_expected_date->format('Y-m-d')]) }}
|
||||
|
||||
{!! $reminder->title !!}
|
||||
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
<a href="/dashboard">{{ trans('app.breadcrumb_dashboard') }}</a>
|
||||
</li>
|
||||
<li class="di">
|
||||
> <a href="/journal">{{ trans('app.breadcrumb_journal') }}</a>
|
||||
> <a href="/journal">{{ trans('app.breadcrumb_journal') }}</a>
|
||||
</li>
|
||||
<li class="di">
|
||||
> {{ trans('journal.journal_add') }}
|
||||
> {{ trans('journal.journal_add') }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<a href="/dashboard">{{ trans('app.breadcrumb_dashboard') }}</a>
|
||||
</li>
|
||||
<li class="di">
|
||||
> {{ trans('app.breadcrumb_journal') }}
|
||||
> {{ trans('app.breadcrumb_journal') }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ app()->getLocale() }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<!-- CSRF Token -->
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>{{ config('app.name', 'Laravel') }}</title>
|
||||
|
||||
<!-- Styles -->
|
||||
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<nav class="navbar navbar-default navbar-static-top">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
|
||||
<!-- Collapsed Hamburger -->
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse" aria-expanded="false">
|
||||
<span class="sr-only">Toggle Navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<!-- Branding Image -->
|
||||
<a class="navbar-brand" href="{{ url('/') }}">
|
||||
{{ config('app.name', 'Laravel') }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="collapse navbar-collapse" id="app-navbar-collapse">
|
||||
<!-- Left Side Of Navbar -->
|
||||
<ul class="nav navbar-nav">
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- Right Side Of Navbar -->
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<!-- Authentication Links -->
|
||||
@guest
|
||||
<li><a href="{{ route('login') }}">Login</a></li>
|
||||
<li><a href="{{ route('register') }}">Register</a></li>
|
||||
@else
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true">
|
||||
{{ Auth::user()->name }} <span class="caret"></span>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a href="{{ route('logout') }}"
|
||||
onclick="event.preventDefault();
|
||||
document.getElementById('logout-form').submit();">
|
||||
Logout
|
||||
</a>
|
||||
|
||||
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
|
||||
{{ csrf_field() }}
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
@endguest
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
@yield('content')
|
||||
</div>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="{{ asset('js/app.js') }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,20 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="{{ \App::getLocale() }}" dir="{{ \App\Helpers\LocaleHelper::getDirection() }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}"/>
|
||||
<title>@yield('title', 'Monica - a CRM for your friends and family')</title>
|
||||
<title>@yield('title', trans('app.application_title'))</title>
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
|
||||
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
|
||||
<link rel="shortcut icon" href="/img/favicon.png">
|
||||
<script>
|
||||
window.Laravel = <?php echo json_encode([
|
||||
window.Laravel = {!! json_encode([
|
||||
'csrfToken' => csrf_token(),
|
||||
'locale' => (Auth::check() ? auth()->user()->locale : 'en')
|
||||
]); ?>
|
||||
'locale' => \App::getLocale()
|
||||
]); !!}
|
||||
</script>
|
||||
</head>
|
||||
<body data-account-id={{ auth()->user()->account_id }} class="bg-gray-monica">
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html lang="{{ \App::getLocale() }}" dir="{{ \App\Helpers\LocaleHelper::getDirection() }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||
<title>Monica - a CRM for your friends and family</title>
|
||||
<meta http-equiv="x-ua-compatible" content="IE=edge,chrome=1">
|
||||
<title>{{ trans('app.application_title') }}</title>
|
||||
|
||||
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
|
||||
<meta name="description" content="Monica is a tool to manage your interactions with your loved ones, friends and family.">
|
||||
<meta name="description" content="{{ trans('app.application_description') }}">
|
||||
<link rel="author" href="@djaiss">
|
||||
<meta property="og:title" content="Have better relations with your loved ones. Free Online CRM for friends and family." />
|
||||
<meta property="og:title" content="{{ trans('app.application_og_title') }}" />
|
||||
<link rel="shortcut icon" href="/img/favicon.png">
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
@yield('content')
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span>×</span>
|
||||
</button>
|
||||
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
...
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-primary">Save changes</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -19,7 +19,7 @@
|
||||
<a href="{{ route('people.show', $contact) }}">{{ $contact->getCompleteName(auth()->user()->name_order) }}</a>
|
||||
</li>
|
||||
<li>
|
||||
Add a new kid
|
||||
{{ trans('people.kid_add_title') }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<a href="{{ route('people.show', $contact) }}">{{ $contact->getCompleteName(auth()->user()->name_order) }}</a>
|
||||
</li>
|
||||
<li>
|
||||
Edit {{ $kid->getCompleteName(auth()->user()->name_order) }}
|
||||
{{ trans('people.kids_edit_title', ['name' => $kid->getCompleteName(auth()->user()->name_order)]) }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
@endif
|
||||
@endif
|
||||
|
||||
<a href="#" class="action-link" onclick="if (confirm('{{ trans('people.kids_unlink_confirmation') }}')) { $(this).closest('li').find('.entry-delete-form').submit(); } return false;">Remove</a>
|
||||
<a href="#" class="action-link" onclick="if (confirm('{{ trans('people.kids_unlink_confirmation') }}')) { $(this).closest('li').find('.entry-delete-form').submit(); } return false;">{{ trans('app.remove') }}</a>
|
||||
|
||||
<form method="POST" action="{{ action('Contacts\\KidsController@unlink', compact('contact', 'kid')) }}" class="entry-delete-form hidden">
|
||||
{{ csrf_field() }}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div class="sidebar-box">
|
||||
|
||||
<p class="sidebar-box-title">
|
||||
<strong>Work information</strong>
|
||||
<strong>{{ trans('people.work_information') }}</strong>
|
||||
</p>
|
||||
|
||||
<div class="work">
|
||||
@@ -32,7 +32,7 @@
|
||||
@if (is_null($contact->linkedin_profile_url))
|
||||
{{ trans('people.information_no_linkedin_defined') }}
|
||||
@else
|
||||
<a href="{{ $contact->linkedin_profile_url }}">LinkedIn</a>
|
||||
<a href="{{ $contact->linkedin_profile_url }}">{{ trans('people.linkedin_profile') }}</a>
|
||||
@endif
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<div class="col-xs-12 col-sm-3 profile-sidebar">
|
||||
@include('people.dashboard.index')
|
||||
|
||||
<p><a href="{{ url('/people/'.$contact->id.'/vcard') }}">Export as vCard</a></p>
|
||||
<p><a href="{{ url('/people/'.$contact->id.'/vcard') }}">{{ trans('people.people_export') }}</a></p>
|
||||
<p>
|
||||
{{ trans('people.people_delete_message') }}
|
||||
<a href="#" onclick="if (confirm('{{ trans('people.people_delete_confirmation') }}')) { $('#contact-delete-form').submit(); } return false;">{{ trans('people.people_delete_click_here') }}</a>.
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
|
||||
<p class="cta"><a href="/settings/import/upload" class="btn">{{ trans('settings.import_blank_cta') }}</a></p>
|
||||
|
||||
@if (config('monica.requires_subscription') and auth()->user()->account->hasLimitations())
|
||||
<p class="requires-subscription">Importing data requires a subscription.</p>
|
||||
@if (config('monica.requires_subscription') && auth()->user()->account->hasLimitations())
|
||||
<p class="requires-subscription">{{ trans('settings.import_need_subscription') }}</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
</div>
|
||||
<div class="table-cell">
|
||||
@if (! is_null($importJob->ended_at))
|
||||
{{ trans('settings.import_result_stat', ['total_contacts' => $importJob->contacts_found, 'total_imported' => $importJob->contacts_imported, 'total_skipped' => $importJob->contacts_skipped]) }}
|
||||
{{ trans_choice('settings.import_result_stat', $importJob->contacts_found, ['total_contacts' => $importJob->contacts_found, 'total_imported' => $importJob->contacts_imported, 'total_skipped' => $importJob->contacts_skipped]) }}
|
||||
@endif
|
||||
</div>
|
||||
<div class="table-cell">
|
||||
|
||||
@@ -59,7 +59,11 @@
|
||||
</div>
|
||||
<div class="table-cell reason">
|
||||
@if (! is_null($importJobReport->skip_reason))
|
||||
{{ trans('settings.'.$importJobReport->skip_reason) }}
|
||||
{{
|
||||
trans('settings.'.$importJobReport->skip_reason)
|
||||
// settings.import_vcard_contact_exist
|
||||
// settings.import_vcard_contact_no_firstname
|
||||
}}
|
||||
@endif
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
|
||||
{{-- names --}}
|
||||
<div class="form-group">
|
||||
<label for="firstname">First name</label>
|
||||
<label for="firstname">{{ trans('settings.firstname') }}</label>
|
||||
<input type="text" class="form-control" name="first_name" id="first_name" required value="{{ auth()->user()->first_name }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="firstname">Last name</label>
|
||||
<label for="firstname">{{ trans('settings.lastname') }}</label>
|
||||
<input type="text" class="form-control" name="last_name" id="last_name" required value="{{ auth()->user()->last_name }}">
|
||||
</div>
|
||||
|
||||
@@ -67,8 +67,8 @@
|
||||
<div class="form-group">
|
||||
<label for="locale">{{ trans('settings.locale') }}</label>
|
||||
<select class="form-control" name="locale" id="locale">
|
||||
@foreach(config('monica.langs') as $lang)
|
||||
<option value="{{ $lang }}" {{ (auth()->user()->locale == $lang)?'selected':'' }}>{{ trans('settings.locale_'.$lang) }}</option>
|
||||
@foreach($locales as $locale)
|
||||
<option value="{{ $locale['lang'] }}" {{ (auth()->user()->locale == $locale['lang'])?'selected':'' }}>{{ $locale['name'] }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
|
||||
<h3>{{ trans('settings.subscriptions_account_current_plan') }}</h3>
|
||||
|
||||
<p>You are on the {{ $planInformation['name'] }} plan. Thanks so much for being a subscriber.</p>
|
||||
<p>Your next billing date will be on {{ $nextBillingDate }}.</p>
|
||||
<p><a href="{{ url('/settings/subscriptions/downgrade') }}">Click here</a> if you want to downgrade to the Free plan.</p>
|
||||
<p>{{ trans('settings.subscriptions_account_current_paid_plan', ['name' => $planInformation['name']]) }}</p>
|
||||
<p>{{ trans('settings.subscriptions_account_next_billing', ['date' => $nextBillingDate, 'url' => url('/settings/subscriptions/downgrade')]) }}</p>
|
||||
|
||||
{{-- Only display invoices if the subscription exists or existed --}}
|
||||
@if (auth()->user()->account->hasInvoices())
|
||||
|
||||
@@ -30,20 +30,20 @@
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-8 col-sm-offset-2">
|
||||
|
||||
<h2 class="tc mt4 fw4">Upgrade Monica today and have more meaningful relationships.</h2>
|
||||
<p class="tc mb4">Pick a plan below and join over {{ $numberOfCustomers }} persons who upgraded their Monica.</p>
|
||||
<h2 class="tc mt4 fw4">{{ trans('settings.subscriptions_account_upgrade_title') }}</h2>
|
||||
<p class="tc mb4">{{ trans('settings.subscriptions_account_upgrade_choice', ['customers' => $numberOfCustomers]) }}</p>
|
||||
|
||||
<div class="br3 ba b--gray-monica bg-white mb4">
|
||||
<div class="pa4 bb b--gray-monica">
|
||||
|
||||
<h3 class="tc">Which payment option fits you best?</h3>
|
||||
<h3 class="tc">{{ trans('settings.subscriptions_account_payment') }}</h3>
|
||||
<div class="cf mb4">
|
||||
<div class="fl w-50-ns w-100 pa3 mt0-ns mt4">
|
||||
<div class="b--purple ba pt3 br3 bw1 relative">
|
||||
<img src="{{ url('/img/settings/subscription/best_value.png') }}" class="absolute" style="top: -30px; left: -20px;">
|
||||
<h3 class="tc mb3 pt3">Pay annually</h3>
|
||||
<h3 class="tc mb3 pt3">{{ trans('settings.subscriptions_plan_year_title') }}</h3>
|
||||
<p class="tc mb4">
|
||||
<a href="{{ url('/settings/subscriptions/upgrade?plan=annual') }}" class="btn btn-primary pv3">Choose this plan</a>
|
||||
<a href="{{ url('/settings/subscriptions/upgrade?plan=annual') }}" class="btn btn-primary pv3">{{ trans('settings.subscriptions_plan_choose') }}</a>
|
||||
</p>
|
||||
<ul class="mb4 center ph4">
|
||||
<li class="mb3 relative ml4">
|
||||
@@ -56,7 +56,7 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<strong>$45/year</strong> - you'll save 25%
|
||||
<strong>{{ trans('settings.subscriptions_plan_year_cost') }}</strong> – {{ trans('settings.subscriptions_plan_year_cost_save') }}
|
||||
</li>
|
||||
<li class="mb3 relative ml4">
|
||||
<svg class="absolute" style="left: -30px; top: -3px;" width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
@@ -68,16 +68,16 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
Peace of mind for a whole year
|
||||
{{ trans('settings.subscriptions_plan_year_bonus') }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fl w-50-ns w-100 pa3">
|
||||
<div class="b--gray-monica ba pt3 br3 bw1">
|
||||
<h3 class="tc mb3 pt3">Pay monthly</h3>
|
||||
<h3 class="tc mb3 pt3">{{ trans('settings.subscriptions_plan_month_title') }}</h3>
|
||||
<p class="tc mb4">
|
||||
<a href="{{ url('/settings/subscriptions/upgrade?plan=monthly') }}" class="btn btn-primary pv3">Choose this plan</a>
|
||||
<a href="{{ url('/settings/subscriptions/upgrade?plan=monthly') }}" class="btn btn-primary pv3">{{ trans('settings.subscriptions_plan_choose') }}</a>
|
||||
</p>
|
||||
<ul class="mb4 center ph4">
|
||||
<li class="mb3 relative ml4">
|
||||
@@ -90,7 +90,7 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<strong>$5/month</strong>
|
||||
<strong>{{ trans('settings.subscriptions_plan_month_cost') }}</strong>
|
||||
</li>
|
||||
<li class="mb3 relative ml4">
|
||||
<svg class="absolute" style="left: -30px; top: -3px;" width="26px" height="26px" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
@@ -102,30 +102,30 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
Cancel any time
|
||||
{{ trans('settings.subscriptions_plan_month_bonus') }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mb1 tc">Included with your upgrade:</p>
|
||||
<p class="mb1 tc">Unlimited number of users • Reminders by email • Import with vCard</p>
|
||||
<p class="mb1 tc">100% of the profits go the development of this great open source project.</p>
|
||||
<p class="mb1 tc">{{ trans('settings.subscriptions_plan_include1') }}</p>
|
||||
<p class="mb1 tc">{{ trans('settings.subscriptions_plan_include2') }}</p>
|
||||
<p class="mb1 tc">{{ trans('settings.subscriptions_plan_include3') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 class="tc mb4 mt3">Additional details you may be curious about</h3>
|
||||
<h4>What is an open source project?</h4>
|
||||
<p class="mb4">Monica is an open source project. This means it is built by an entirely benevolent community who just wants to provide a great tool for the greater good. Being open source means the code is publicly available on GitHub, and everyone can inspect it, modify it or enhance it. All the money we raise is dedicated to build better features, have more powerful servers, help pay the bills. Thanks for your help. We couldn't do it without you - litterally.</p>
|
||||
<h3 class="tc mb4 mt3">{{ trans('settings.subscriptions_help_title') }}</h3>
|
||||
<h4>{{ trans('settings.subscriptions_help_opensource_title') }}</h4>
|
||||
<p class="mb4">{{ trans('settings.subscriptions_help_opensource_desc') }}</p>
|
||||
|
||||
<h4>Is there any limit to the number of contacts we can have on the free plan?</h4>
|
||||
<p class="mb4">Absolutely not. Free plans do not have limitations on the number of contacts you can have.</p>
|
||||
<h4>{{ trans('settings.subscriptions_help_limits_title') }}</h4>
|
||||
<p class="mb4">{{ trans('settings.subscriptions_help_limits_plan') }}</p>
|
||||
|
||||
<h4>Do you have discounts for non-profits and education?</h4>
|
||||
<p class="mb4">We do! Monica is free for students, and free for non-profits and charities. Just contact <a href="">the support</a> with a proof of your status and we'll apply this special status in your account.</p>
|
||||
<h4>{{ trans('settings.subscriptions_help_discounts_title') }}</h4>
|
||||
<p class="mb4">{!! trans('settings.subscriptions_help_discounts_desc', ['support' => 'mailto:regis@monicahq.com']) !!}</p>
|
||||
|
||||
<h4>What if I change my mind?</h4>
|
||||
<p class="mb4">You can cancel anytime, no questions asked, and all by yourself - no need to contact support or whatever. However, you will not be refunded for the current period.</p>
|
||||
<h4>{{ trans('settings.subscriptions_help_change_title') }}</h4>
|
||||
<p class="mb4">{{ trans('settings.subscriptions_help_change_desc') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -39,13 +39,13 @@
|
||||
<li class="{{ (auth()->user()->account->users()->count() > 1)?'fail':'success' }}">
|
||||
<span class="icon"></span>
|
||||
<span class="rule-title">{{ trans('settings.subscriptions_downgrade_rule_users') }}</span>
|
||||
<span class="rule-to-succeed">{!! trans('settings.subscriptions_downgrade_rule_users_constraint', ['url' => '/settings/users', 'count' => auth()->user()->account->users()->count()]) !!}</span>
|
||||
<span class="rule-to-succeed">{!! trans_choice('settings.subscriptions_downgrade_rule_users_constraint', auth()->user()->account->users()->count(), ['url' => '/settings/users', 'count' => auth()->user()->account->users()->count()]) !!}</span>
|
||||
</li>
|
||||
|
||||
<li class="{{ (auth()->user()->account->invitations()->count() > 0)?'fail':'success' }}">
|
||||
<span class="icon"></span>
|
||||
<span class="rule-title">{{ trans('settings.subscriptions_downgrade_rule_invitations') }}</span>
|
||||
<span class="rule-to-succeed">{!! trans('settings.subscriptions_downgrade_rule_invitations_constraint', ['url' => '/settings/users', 'count' => auth()->user()->account->invitations()->count()]) !!}</span>
|
||||
<span class="rule-to-succeed">{!! trans_choice('settings.subscriptions_downgrade_rule_invitations_constraint', auth()->user()->account->invitations()->count(), ['url' => '/settings/users', 'count' => auth()->user()->account->invitations()->count()]) !!}</span>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
@@ -60,9 +60,9 @@
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<h2 class="tc mt2 fw4">You are back to the Free plan!</h2>
|
||||
<p class="tc mb4">Thanks so much for having tried the paid plan. We keep adding new features on Monica all the time - so you might want to come back in the future to see if you might be interested in taking a subscription again.</p>
|
||||
<p class="tc"><a href="{{ url('/settings/subscriptions') }}" class="btn btn-primary">Back to Settings</a></p>
|
||||
<h2 class="tc mt2 fw4">{{ trans('settings.subscriptions_downgrade_success') }}</h2>
|
||||
<p class="tc mb4">{{ trans('settings.subscriptions_downgrade_thanks') }}</p>
|
||||
<p class="tc"><a href="{{ url('/settings/subscriptions') }}" class="btn btn-primary">{{trans('settings.subscriptions_back') }}</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<h2 class="tc mt2 fw4">Thank you! You are now subscribed.</h2>
|
||||
<p class="tc mb4">Welcome to the community of people who try to make the world a better place.</p>
|
||||
<p class="tc"><a href="{{ url('/settings/subscriptions') }}" class="btn btn-primary">Back to Settings</a></p>
|
||||
<h2 class="tc mt2 fw4">{{ trans('settings.subscriptions_upgrade_success') }}</h2>
|
||||
<p class="tc mb4">{{ trans('settings.subscriptions_upgrade_thanks') }}</p>
|
||||
<p class="tc"><a href="{{ url('/settings/subscriptions') }}" class="btn btn-primary">{{ trans('settings.subscriptions_back') }}</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
|
||||
<div class="mt4 mw6 center mb4 pa2 pa0-ns">
|
||||
<div class="br3 ba b--gray-monica bg-white pa4">
|
||||
<h2 class="tc mt2 fw4">You picked the {{ $planInformation['type'] }} plan.</h2>
|
||||
<p class="tc mb4">We couldn't be happier. Enter your payment info below.</p>
|
||||
<h2 class="tc mt2 fw4">{{ trans('settings.subscriptions_upgrade_choose', ['plan' => $planInformation['type']]) }}</h2>
|
||||
<p class="tc mb4">{{ trans('settings.subscriptions_upgrade_thanks') }}</p>
|
||||
<form action="/settings/subscriptions/processPayment" method="post" id="payment-form" class="mb4">
|
||||
{{ csrf_field() }}
|
||||
|
||||
@@ -36,17 +36,17 @@
|
||||
<div class="b--gray-monica ba pa4 br2 mb3 bg-black-05">
|
||||
<div class="form-row">
|
||||
<div class="mb3">
|
||||
<span>Name on card</span>
|
||||
<span>{{ trans('settings.subscriptions_upgrade_name') }}</span>
|
||||
<input name="cardholder-name" class="br3 b--black-30 ba pa3 w-100 f4" value="{{ auth()->user()->name }}" />
|
||||
</div>
|
||||
|
||||
<div class="mb3">
|
||||
<span>ZIP or postal code</span>
|
||||
<span>{{ trans('settings.subscriptions_upgrade_zip') }}</span>
|
||||
<input name="address-zip" class="br3 b--black-30 ba pa3 w-100 f4" />
|
||||
</div>
|
||||
|
||||
<div class="mb3" for="card-element">
|
||||
Credit or debit card
|
||||
{{ trans('settings.subscriptions_upgrade_credit') }}
|
||||
</div>
|
||||
|
||||
<div id="card-element">
|
||||
@@ -58,11 +58,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-primary w-100">Submit Payment</button>
|
||||
<button class="btn btn-primary w-100">{{ trans('settings.subscriptions_upgrade_submit') }}</button>
|
||||
</form>
|
||||
|
||||
<p>We'll charge your card USD ${{ $planInformation['friendlyPrice'] }} now. The next charge will be on {{ $nextTheoriticalBillingDate }}. If you ever change your mind, you can cancel anytime, no questions asked.</p>
|
||||
<p>The payment is handled by <a href="https://stripe.com">Stripe</a>. No card information touches our server.</p>
|
||||
<p>{{ trans('settings.subscriptions_upgrade_charge', ['price' => $planInformation['friendlyPrice'], 'date' => $nextTheoriticalBillingDate]) }}</p>
|
||||
<p>{!! trans('settings.subscriptions_upgrade_charge_handled', ['url' => 'https://stripe.com']) !!}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
<li class="table-row" data-tag-id="{{ $tag->id }}">
|
||||
<div class="table-cell">
|
||||
{{ $tag->name }}
|
||||
<span class="tags-list-contact-number">({{ trans('settings.tags_list_contact_number', ['count' => $tag->contacts()->count()]) }})</span>
|
||||
<span class="tags-list-contact-number">({{ trans_choice('settings.tags_list_contact_number', $tag->contacts()->count(), ['count' => $tag->contacts()->count()]) }})</span>
|
||||
</div>
|
||||
<div class="table-cell actions">
|
||||
<a href="#" onclick="if (confirm('{{ trans('settings.tags_list_delete_confirmation') }}')) { $(this).closest('.table-row').find('.entry-delete-form').submit(); } return false;">
|
||||
|
||||
@@ -16,46 +16,46 @@
|
||||
{{ csrf_field() }}
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Enter a valid email address</label>
|
||||
<input type="email" class="form-control" id="email" name="email" placeholder="you@home" value="{{ old('email') }}" required>
|
||||
<label for="email">{{ trans('auth.register_email') }}</label>
|
||||
<input type="email" class="form-control" id="email" name="email" placeholder="{{ trans('auth.register_email_example') }}" value="{{ old('email') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="form-group">
|
||||
<label for="first_name">First name</label>
|
||||
<input type="text" class="form-control" id="first_name" name="first_name" placeholder="eg. John" value="{{ old('first_name') }}" required>
|
||||
<label for="first_name">{{ trans('auth.register_firstname') }}</label>
|
||||
<input type="text" class="form-control" id="first_name" name="first_name" placeholder="{{ trans('auth.register_firstname_example') }}" value="{{ old('first_name') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="form-group">
|
||||
<label for="last_name">Last name</label>
|
||||
<input type="text" class="form-control" id="last_name" name="last_name" placeholder="eg. Doe" value="{{ old('last_name') }}" required>
|
||||
<label for="last_name">{{ trans('auth.register_lastname') }}</label>
|
||||
<input type="text" class="form-control" id="last_name" name="last_name" placeholder="{{ trans('auth.register_lastname_example') }}" value="{{ old('last_name') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="Enter a secure password" required>
|
||||
<label for="password">{{ trans('auth.register_password') }}</label>
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="{{ trans('auth.register_password_example') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password_confirmation">Password confirmation</label>
|
||||
<label for="password_confirmation">{{ trans('auth.register_password_confirmation') }}</label>
|
||||
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email_security">For security purposes, please indicate the email of the person who've invited you to join this account. This information is provided in the invitation email.</label>
|
||||
<label for="email_security">{{ trans('auth.register_invitation_email') }}</label>
|
||||
<input type="email" class="form-control" id="email_security" name="email_security" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group actions">
|
||||
<button type="submit" class="btn btn-primary">Join Monica</button>
|
||||
<button type="submit" class="btn btn-primary">{{ trans('auth.register_action') }}</button>
|
||||
</div>
|
||||
|
||||
<div class="help">
|
||||
Signing up signifies you’ve read and agree to our <a href="https://monicahq.com/privacy">Privacy Policy</a>.
|
||||
{!! trans('auth.register_policy', ['url' => 'https://monicahq.com/privacy']) !!}
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
|
||||
<p class="cta"><a href="/settings/users/add" class="btn">{{ trans('settings.users_blank_cta') }}</a></p>
|
||||
|
||||
@if (config('monica.requires_subscription') and auth()->user()->account->hasLimitations())
|
||||
<p class="requires-subscription">Adding more users requires a subscription.</p>
|
||||
@if (config('monica.requires_subscription') && auth()->user()->account->hasLimitations())
|
||||
<p class="requires-subscription">{{ trans('settings.users_invitation_need_subscription') }}</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -21,122 +21,102 @@ class DateHelperTest extends FeatureTestCase
|
||||
public function testGetShortDateWithEnglishLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
DateHelper::setLocale('en');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22, 2017',
|
||||
DateHelper::getShortDate($date, $locale)
|
||||
DateHelper::getShortDate($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDateWithFrenchLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'fr';
|
||||
DateHelper::setLocale('fr');
|
||||
|
||||
$this->assertEquals(
|
||||
'22 jan 2017',
|
||||
DateHelper::getShortDate($date, $locale)
|
||||
DateHelper::getShortDate($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDateWithUnknownLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'jp';
|
||||
DateHelper::setLocale('jp');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22, 2017',
|
||||
DateHelper::getShortDate($date, $locale)
|
||||
DateHelper::getShortDate($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDateWithTimeWithEnglishLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
DateHelper::setLocale('en');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22, 2017 17:56',
|
||||
DateHelper::getShortDateWithTime($date, $locale)
|
||||
DateHelper::getShortDateWithTime($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDateWithTimeWithFrenchLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'fr';
|
||||
DateHelper::setLocale('fr');
|
||||
|
||||
$this->assertEquals(
|
||||
'22 jan 2017 17:56',
|
||||
DateHelper::getShortDateWithTime($date, $locale)
|
||||
DateHelper::getShortDateWithTime($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDateWithTimeWithUnknownLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'jp';
|
||||
DateHelper::setLocale('jp');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22, 2017 17:56',
|
||||
DateHelper::getShortDateWithTime($date, $locale)
|
||||
DateHelper::getShortDateWithTime($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_short_date_without_year_returns_a_date()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
DateHelper::setLocale('en');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22',
|
||||
DateHelper::getShortDateWithoutYear($date, $locale)
|
||||
DateHelper::getShortDateWithoutYear($date)
|
||||
);
|
||||
|
||||
$locale = 'fr';
|
||||
DateHelper::setLocale('fr');
|
||||
|
||||
$this->assertEquals(
|
||||
'22 jan',
|
||||
DateHelper::getShortDateWithoutYear($date, $locale)
|
||||
DateHelper::getShortDateWithoutYear($date)
|
||||
);
|
||||
|
||||
$locale = '';
|
||||
DateHelper::setLocale('');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22',
|
||||
DateHelper::getShortDateWithoutYear($date, $locale)
|
||||
DateHelper::getShortDateWithoutYear($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function test_it_returns_the_default_short_date()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = null;
|
||||
DateHelper::setLocale(null);
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22',
|
||||
DateHelper::getShortDateWithoutYear($date, $locale)
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_locale_returns_english_by_default()
|
||||
{
|
||||
$this->assertEquals(
|
||||
'en',
|
||||
DateHelper::getLocale()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_locale_returns_right_locale_if_user_logged()
|
||||
{
|
||||
$user = $this->signIn();
|
||||
$user->locale = 'fr';
|
||||
$user->save();
|
||||
|
||||
$this->assertEquals(
|
||||
'fr',
|
||||
DateHelper::getLocale()
|
||||
DateHelper::getShortDateWithoutYear($date)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -167,66 +147,66 @@ class DateHelperTest extends FeatureTestCase
|
||||
public function testGetShortMonthWithEnglishLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
DateHelper::setLocale('en');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan',
|
||||
DateHelper::getShortMonth($date, $locale)
|
||||
DateHelper::getShortMonth($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortMonthWithFrenchLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'fr';
|
||||
DateHelper::setLocale('fr');
|
||||
|
||||
$this->assertEquals(
|
||||
'jan',
|
||||
DateHelper::getShortMonth($date, $locale)
|
||||
DateHelper::getShortMonth($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortMonthWithUnknownLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'jp';
|
||||
DateHelper::setLocale('jp');
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan',
|
||||
DateHelper::getShortMonth($date, $locale)
|
||||
DateHelper::getShortMonth($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDayWithEnglishLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
DateHelper::setLocale('en');
|
||||
|
||||
$this->assertEquals(
|
||||
'Sun',
|
||||
DateHelper::getShortDay($date, $locale)
|
||||
DateHelper::getShortDay($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDayWithFrenchLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'fr';
|
||||
DateHelper::setLocale('fr');
|
||||
|
||||
$this->assertEquals(
|
||||
'dim',
|
||||
DateHelper::getShortDay($date, $locale)
|
||||
DateHelper::getShortDay($date)
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetShortDayWithUnknownLocale()
|
||||
{
|
||||
$date = '2017-01-22 17:56:03';
|
||||
$locale = 'jp';
|
||||
DateHelper::setLocale('jp');
|
||||
|
||||
$this->assertEquals(
|
||||
'Sun',
|
||||
DateHelper::getShortDay($date, $locale)
|
||||
DateHelper::getShortDay($date)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Helper;
|
||||
|
||||
use Tests\FeatureTestCase;
|
||||
use App\Helpers\LocaleHelper;
|
||||
|
||||
class LocaleHelperTest extends FeatureTestCase
|
||||
{
|
||||
public function test_get_locale_returns_english_by_default()
|
||||
{
|
||||
$this->assertEquals(
|
||||
'en',
|
||||
LocaleHelper::getLocale()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_locale_returns_right_locale_if_user_logged()
|
||||
{
|
||||
$user = $this->signIn();
|
||||
$user->locale = 'fr';
|
||||
$user->save();
|
||||
|
||||
$this->assertEquals(
|
||||
'fr',
|
||||
LocaleHelper::getLocale()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_direction_default()
|
||||
{
|
||||
$this->assertEquals(
|
||||
'ltr',
|
||||
LocaleHelper::getDirection()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_direction_french()
|
||||
{
|
||||
$user = $this->signIn();
|
||||
$user->locale = 'fr';
|
||||
$user->save();
|
||||
|
||||
$this->assertEquals(
|
||||
'ltr',
|
||||
LocaleHelper::getDirection()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_direction_hebrew()
|
||||
{
|
||||
$user = $this->signIn();
|
||||
$user->locale = 'he';
|
||||
$user->save();
|
||||
|
||||
$this->assertEquals(
|
||||
'rtl',
|
||||
LocaleHelper::getDirection()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -77,11 +77,10 @@ class NoteTest extends TestCase
|
||||
{
|
||||
$note = new Note;
|
||||
$note->created_at = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
|
||||
$this->assertEquals(
|
||||
'Jan 22, 2017',
|
||||
$note->getCreatedAt($locale)
|
||||
$note->getCreatedAt()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -89,9 +88,8 @@ class NoteTest extends TestCase
|
||||
{
|
||||
$note = new Note;
|
||||
$note->created_at = '2017-01-22 17:56:03';
|
||||
$locale = 'en';
|
||||
|
||||
$this->assertInternalType('string', $note->getCreatedAt($locale));
|
||||
$this->assertInternalType('string', $note->getCreatedAt());
|
||||
}
|
||||
|
||||
public function testGetContentReturnsAString()
|
||||
|
||||
Reference in New Issue
Block a user