1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Distilleries\Contentful\Models; |
4
|
|
|
|
5
|
|
|
use Illuminate\Http\Request; |
6
|
|
|
use Illuminate\Support\Facades\Cache; |
7
|
|
|
use Illuminate\Database\Eloquent\Model; |
8
|
|
|
use Illuminate\Support\Str; |
9
|
|
|
|
10
|
|
|
/** |
11
|
|
|
* @property integer $id |
12
|
|
|
* @property string $label |
13
|
|
|
* @property string $code |
14
|
|
|
* @property string $fallback_code |
15
|
|
|
* @property boolean $is_editable |
16
|
|
|
* @property boolean $is_publishable |
17
|
|
|
* @property \Illuminate\Support\Carbon $created_at |
18
|
|
|
* @property \Illuminate\Support\Carbon $updated_at |
19
|
|
|
*/ |
20
|
|
|
class Locale extends Model |
21
|
|
|
{ |
22
|
|
|
/** |
23
|
|
|
* {@inheritdoc} |
24
|
|
|
*/ |
25
|
|
|
protected $table = 'locales'; |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* {@inheritdoc} |
29
|
|
|
*/ |
30
|
|
|
protected $fillable = [ |
31
|
|
|
'label', |
32
|
|
|
'code', |
33
|
|
|
'locale', |
34
|
|
|
'country', |
35
|
|
|
'fallback_code', |
36
|
|
|
'is_default', |
37
|
|
|
'is_editable', |
38
|
|
|
'is_publishable', |
39
|
|
|
]; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* {@inheritdoc} |
43
|
|
|
*/ |
44
|
|
|
protected $casts = [ |
45
|
|
|
'is_default' => 'boolean', |
46
|
|
|
'is_editable' => 'boolean', |
47
|
|
|
'is_publishable' => 'boolean', |
48
|
|
|
]; |
49
|
|
|
|
50
|
|
|
/** |
51
|
|
|
* Return default locale code. |
52
|
|
|
* |
53
|
|
|
* @return string |
54
|
|
|
*/ |
55
|
|
View Code Duplication |
public static function default(): string |
|
|
|
|
56
|
|
|
{ |
57
|
|
|
$default = Cache::get('locale_default'); |
|
|
|
|
58
|
|
|
|
59
|
|
|
if ($default === null) |
|
|
|
|
60
|
|
|
{ |
61
|
|
|
$default = static::query() |
|
|
|
|
62
|
|
|
->select('locale') |
63
|
|
|
->where('is_default', '=', true) |
64
|
|
|
->first(); |
65
|
|
|
|
66
|
|
|
$default = !empty($default) ? $default->locale : config('contentful.default_locale'); |
|
|
|
|
67
|
|
|
// Cache is cleaned in Console\Commands\SyncLocales (run at least daily) |
68
|
|
|
Cache::forever('locale_default', $default); |
|
|
|
|
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
return $default; |
|
|
|
|
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
|
75
|
|
|
public static function getAppOrDefaultLocale(): string |
76
|
|
|
{ |
77
|
|
|
return app()->getLocale() ?? self::default(); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
public static function getAppOrDefaultCountry($key = 'app.country'): string |
81
|
|
|
{ |
82
|
|
|
return config($key, self::defaultCountry()); |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/** |
86
|
|
|
* Return default country code. |
87
|
|
|
* |
88
|
|
|
* @return string |
89
|
|
|
*/ |
90
|
|
View Code Duplication |
public static function defaultCountry(): string |
|
|
|
|
91
|
|
|
{ |
92
|
|
|
$default = Cache::get('country_default'); |
93
|
|
|
|
94
|
|
|
if ($default === null) |
95
|
|
|
{ |
96
|
|
|
$default = static::query() |
|
|
|
|
97
|
|
|
->select('country') |
98
|
|
|
->where('is_default', '=', true) |
99
|
|
|
->first(); |
100
|
|
|
$default = !empty($default) ? $default->country : config('contentful.default_country'); |
101
|
|
|
// Cache is cleaned in Console\Commands\SyncLocales (run at least daily) |
102
|
|
|
Cache::forever('country_default', $default); |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
return $default; |
106
|
|
|
} |
107
|
|
|
|
108
|
|
|
/** |
109
|
|
|
* Return fallback code for given locale code. |
110
|
|
|
* |
111
|
|
|
* @param string $code |
112
|
|
|
* @return string |
113
|
|
|
*/ |
114
|
|
|
public static function fallback(string $code): string |
115
|
|
|
{ |
116
|
|
|
$fallback = Cache::get('locale_fallback_' . $code); |
117
|
|
|
|
118
|
|
|
if ($fallback === null) |
119
|
|
|
{ |
120
|
|
|
$locale = static::query() |
|
|
|
|
121
|
|
|
->select('fallback_code') |
122
|
|
|
->where('code', '=', $code) |
123
|
|
|
->first(); |
124
|
|
|
|
125
|
|
|
$fallback = (!empty($locale) and !empty($locale->fallback_code)) ? $locale->fallback_code : ''; |
|
|
|
|
126
|
|
|
|
127
|
|
|
Cache::put('locale_fallback_' . $code, $fallback, 5); |
128
|
|
|
} |
129
|
|
|
|
130
|
|
|
return $fallback; |
131
|
|
|
} |
132
|
|
|
|
133
|
|
|
public static function canBeSave(string $country, string $locale): bool |
134
|
|
|
{ |
135
|
|
|
return !in_array($country . '_' . $locale, static::_getLocalesDisabled()); |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
protected static function _getLocalesDisabled(): array |
139
|
|
|
{ |
140
|
|
|
$locales = config('contentful.locales_not_flatten', ''); |
141
|
|
|
return explode(',', $locales); |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
public function isEnabled(): bool |
145
|
|
|
{ |
146
|
|
|
return !in_array($this->country . '_' . $this->locale, static::_getLocalesDisabled()); |
147
|
|
|
} |
148
|
|
|
|
149
|
|
View Code Duplication |
public static function getLocale(string $locale): string |
|
|
|
|
150
|
|
|
{ |
151
|
|
|
if (Str::contains($locale, '_')) |
152
|
|
|
{ |
153
|
|
|
$tab = explode('_', $locale); |
154
|
|
|
return $tab[1]; |
155
|
|
|
} else if (Str::contains($locale, '-')) |
156
|
|
|
{ |
157
|
|
|
$tab = explode('-', $locale); |
158
|
|
|
return $tab[1]; |
159
|
|
|
} |
160
|
|
|
|
161
|
|
|
return $locale; |
162
|
|
|
} |
163
|
|
|
|
164
|
|
View Code Duplication |
public static function getCountry(string $locale): string |
|
|
|
|
165
|
|
|
{ |
166
|
|
|
if (Str::contains($locale, '_')) |
167
|
|
|
{ |
168
|
|
|
$tab = explode('_', $locale); |
169
|
|
|
return $tab[0]; |
170
|
|
|
} else if (Str::contains($locale, '-')) |
171
|
|
|
{ |
172
|
|
|
$tab = explode('-', $locale); |
173
|
|
|
return $tab[0]; |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
return config('contentful.default_country'); |
177
|
|
|
} |
178
|
|
|
|
179
|
|
|
|
180
|
|
|
/** |
181
|
|
|
* Return request accepted languages. |
182
|
|
|
* |
183
|
|
|
* @param \Illuminate\Http\Request|null $request |
184
|
|
|
* @return string|array |
185
|
|
|
*/ |
186
|
|
|
public static function getAcceptedLanguages(Request $request = null) |
187
|
|
|
{ |
188
|
|
|
$request = !empty($request) ? $request : request(); |
189
|
|
|
|
190
|
|
|
$langs = $request->server('HTTP_ACCEPT_LANGUAGE'); |
191
|
|
|
if (!empty($langs)) |
192
|
|
|
{ |
193
|
|
|
preg_match_all('/(\W|^)([a-z]{2})([^a-z]|$)/six', $langs, $locales, PREG_PATTERN_ORDER); |
194
|
|
|
|
195
|
|
|
if (!empty($locales) and !empty($locales[2])) |
|
|
|
|
196
|
|
|
{ |
197
|
|
|
return $locales[2]; |
198
|
|
|
} |
199
|
|
|
} |
200
|
|
|
|
201
|
|
|
return []; |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
/** |
205
|
|
|
* Return user default language. |
206
|
|
|
* |
207
|
|
|
* @param \Illuminate\Http\Request|null $request |
208
|
|
|
* @return string |
209
|
|
|
*/ |
210
|
|
|
public static function getDefaultLanguageUser(Request $request = null): string |
211
|
|
|
{ |
212
|
|
|
$country = self::defaultCountry(); |
213
|
|
|
$locales = static::getAcceptedLanguages($request); |
214
|
|
|
$locale = !empty($locales) ? $locales[0] : config('app.fallback_locale'); |
215
|
|
|
|
216
|
|
|
$localeModel = (new static) |
217
|
|
|
->where('country', $country) |
218
|
|
|
->where('locale', $locale) |
219
|
|
|
->take(1) |
220
|
|
|
->get() |
221
|
|
|
->firs(); |
222
|
|
|
|
223
|
|
|
return empty($localeModel) ? static::default() : $localeModel->locale; |
224
|
|
|
} |
225
|
|
|
|
226
|
|
|
|
227
|
|
|
} |
228
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.