mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-11-01 00:46:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Http\Controllers\Base;
 | |
| 
 | |
| use Illuminate\Http\Request;
 | |
| use Illuminate\Http\JsonResponse;
 | |
| use Illuminate\Translation\Translator;
 | |
| use Illuminate\Contracts\Translation\Loader;
 | |
| use App\Http\Controllers\Controller;
 | |
| 
 | |
| class LocaleController extends Controller
 | |
| {
 | |
|     protected Loader $loader;
 | |
| 
 | |
|     public function __construct(Translator $translator)
 | |
|     {
 | |
|         $this->loader = $translator->getLoader();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns translation data given a specific locale and namespace.
 | |
|      */
 | |
|     public function __invoke(Request $request): JsonResponse
 | |
|     {
 | |
|         $locales = explode(' ', $request->input('locale') ?? '');
 | |
|         $namespaces = explode(' ', $request->input('namespace') ?? '');
 | |
| 
 | |
|         $response = [];
 | |
|         foreach ($locales as $locale) {
 | |
|             $response[$locale] = [];
 | |
|             foreach ($namespaces as $namespace) {
 | |
|                 $response[$locale][$namespace] = $this->i18n(
 | |
|                     $this->loader->load($locale, str_replace('.', '/', $namespace))
 | |
|                 );
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return new JsonResponse($response, 200, [
 | |
|             // Cache this in the browser for an hour, and allow the browser to use a stale
 | |
|             // cache for up to a day after it was created while it fetches an updated set
 | |
|             // of translation keys.
 | |
|             'Cache-Control' => 'public, max-age=3600, stale-while-revalidate=86400',
 | |
|             'ETag' => md5(json_encode($response, JSON_THROW_ON_ERROR)),
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Convert standard Laravel translation keys that look like ":foo"
 | |
|      * into key structures that are supported by the front-end i18n
 | |
|      * library, like "{{foo}}".
 | |
|      */
 | |
|     protected function i18n(array $data): array
 | |
|     {
 | |
|         foreach ($data as $key => $value) {
 | |
|             if (is_array($value)) {
 | |
|                 $data[$key] = $this->i18n($value);
 | |
|             } else {
 | |
|                 // Find a Laravel style translation replacement in the string and replace it with
 | |
|                 // one that the front-end is able to use. This won't always be present, especially
 | |
|                 // for complex strings or things where we'd never have a backend component anyways.
 | |
|                 //
 | |
|                 // For example:
 | |
|                 // "Hello :name, the :notifications.0.title notification needs :count actions :foo.0.bar."
 | |
|                 //
 | |
|                 // Becomes:
 | |
|                 // "Hello {{name}}, the {{notifications.0.title}} notification needs {{count}} actions {{foo.0.bar}}."
 | |
|                 $data[$key] = preg_replace('/:([\w.-]+\w)([^\w:]?|$)/m', '{{$1}}$2', $value);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $data;
 | |
|     }
 | |
| }
 | 
