Files
HRM-System/app/Http/Controllers/LanguageController.php
2026-04-13 08:16:56 +08:00

276 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Illuminate\Support\Facades\File;
use App\Models\AddOn;
class LanguageController extends Controller
{
// Show the manage language Inertia page
public function managePage(Request $request, $lang = null)
{
$langListPath = resource_path('lang/language.json');
$languages = [];
if (File::exists($langListPath)) {
$languages = json_decode(File::get($langListPath), true);
}
$defaultLang = 'en';
$selectedLang = $defaultLang;
if ($lang && collect($languages)->pluck('code')->contains($lang)) {
$selectedLang = $lang;
}
$defaultData = [];
if (File::exists(resource_path("lang/{$selectedLang}.json"))) {
$defaultData = json_decode(File::get(resource_path("lang/{$selectedLang}.json")), true);
}
return Inertia::render('manage-language', [
'languages' => $languages,
'defaultLang' => $selectedLang,
'defaultData' => $defaultData,
]);
}
// Load a language file
public function load(Request $request)
{
$langListPath = resource_path('lang/language.json');
$languages = collect();
if (File::exists($langListPath)) {
$languages = collect(json_decode(File::get($langListPath), true));
}
$lang = $request->get('lang', 'en');
if (!$languages->pluck('code')->contains($lang)) {
return response()->json(['error' => __('Language not found')], 404);
}
$langPath = resource_path("lang/{$lang}.json");
if (!File::exists($langPath)) {
return response()->json(['error' => __('Language file not found')], 404);
}
$data = json_decode(File::get($langPath), true);
return response()->json(['data' => $data]);
}
// Save a language file
public function save(Request $request)
{
try {
$langListPath = resource_path('lang/language.json');
$languages = collect();
if (File::exists($langListPath)) {
$languages = collect(json_decode(File::get($langListPath), true));
}
$lang = $request->get('lang');
$data = $request->get('data');
if (!$lang || !is_array($data) || !$languages->pluck('code')->contains($lang)) {
if ($request->expectsJson()) {
return response()->json(['error' => __('Invalid request')], 400);
}
return redirect()->back()->with('error', __('Invalid request'));
}
$langPath = resource_path("lang/{$lang}.json");
if (!File::exists($langPath)) {
if ($request->expectsJson()) {
return response()->json(['error' => __('Language file not found')], 404);
}
return redirect()->back()->with('error', __('Language file not found'));
}
File::put($langPath, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
if ($request->expectsJson()) {
return response()->json(['success' => __('Language updated successfully')]);
}
return redirect()->back()->with('success', __('Language updated successfully'));
} catch (\Exception $e) {
if ($request->expectsJson()) {
return response()->json(['error' => __('Failed to update language file: ') . $e->getMessage()], 500);
}
return redirect()->back()->with('error', __('Failed to update language file: ') . $e->getMessage());
}
}
public function createLanguage(Request $request)
{
$request->validate([
'code' => 'required|string|max:10',
'name' => 'required|string|max:255',
'countryCode' => 'required|string|size:2'
], [
'code.required' => __('Language code is required.'),
'code.string' => __('Language code must be a valid string.'),
'code.max' => __('Language code must not exceed 10 characters.'),
'name.required' => __('Language name is required.'),
'name.string' => __('Language name must be a valid string.'),
'name.max' => __('Language name must not exceed 255 characters.'),
'countryCode.required' => __('Country code is required.'),
'countryCode.string' => __('Country code must be a valid string.'),
'countryCode.size' => __('Country code must be exactly 2 characters.'),
]);
try {
// Check if language already exists in language.json
$languagesFile = resource_path('lang/language.json');
if (!is_writable($languagesFile)) {
return response()->json(['error' => __('Language file is not writable. Please check file permissions.')], 500);
}
$languages = json_decode(File::get($languagesFile), true);
$existingLanguage = collect($languages)->firstWhere('code', $request->code);
if ($existingLanguage) {
return response()->json(['error' => __('The language code already exists')], 422);
}
$languages[] = [
'code' => $request->code,
'name' => $request->name,
'countryCode' => strtoupper($request->countryCode)
];
$result = File::put($languagesFile, json_encode($languages, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
if ($result === false) {
return response()->json(['error' => __('Failed to write to language file. Please check file permissions.')], 500);
}
// Copy en.json to new language
$enFile = resource_path('lang/en.json');
$newLangFile = resource_path("lang/{$request->code}.json");
if (File::exists($enFile)) {
$enContent = File::get($enFile);
File::put($newLangFile, $enContent);
} else {
// Create empty translation file if en.json doesn't exist
File::put($newLangFile, json_encode([], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
return response()->json(['success' => true, 'message' => __('The language has been created successfully.')]);
} catch (\Exception $e) {
return response()->json(['error' => 'Failed to create language: ' . $e->getMessage()], 500);
}
}
public function deleteLanguage($languageCode)
{
if ($languageCode === 'en') {
return response()->json(['error' => __('Cannot delete English language')], 422);
}
try {
// Remove from language.json
$languagesFile = resource_path('lang/language.json');
$languages = json_decode(File::get($languagesFile), true);
$languages = array_filter($languages, fn($lang) => $lang['code'] !== $languageCode);
File::put($languagesFile, json_encode(array_values($languages), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
// Delete main language file
$mainLangFile = resource_path("lang/{$languageCode}.json");
if (File::exists($mainLangFile)) {
File::delete($mainLangFile);
}
return response()->json(['success' => true, 'message' => __('The language has been deleted.')]);
} catch (\Exception $e) {
return response()->json(['error' => __('Failed to delete language: :error', ['error' => $e->getMessage()])], 500);
}
}
public function toggleLanguageStatus($languageCode)
{
if ($languageCode === 'en') {
return response()->json(['error' => __('Cannot disable English language')], 422);
}
try {
$languagesFile = resource_path('lang/language.json');
$languages = json_decode(File::get($languagesFile), true);
foreach ($languages as &$language) {
if ($language['code'] === $languageCode) {
$language['enabled'] = !($language['enabled'] ?? true);
break;
}
}
File::put($languagesFile, json_encode($languages, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
return response()->json(['success' => true, 'message' => __('The language status updated successfully.')]);
} catch (\Exception $e) {
return response()->json(['error' => __('Failed to update language status: :error', ['error' => $e->getMessage()])], 500);
}
}
public function updateTranslations(Request $request, $locale)
{
$newTranslations = $request->input('translations');
$path = resource_path("lang/{$locale}.json");
try {
// Ensure directory exists
$dir = dirname($path);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// Try to make file writable if it exists
if (file_exists($path)) {
@chmod($path, 0666);
}
// Load existing translations
$existingTranslations = [];
if (file_exists($path)) {
$existingContent = File::get($path);
$existingTranslations = json_decode($existingContent, true) ?? [];
}
// Merge new translations with existing ones
$mergedTranslations = array_merge($existingTranslations, $newTranslations);
$result = File::put($path, json_encode($mergedTranslations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
if ($result === false) {
// If File::put fails, try alternative method
$handle = @fopen($path, 'w');
if ($handle) {
fwrite($handle, json_encode($mergedTranslations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
fclose($handle);
@chmod($path, 0666);
} else {
return response()->json(['error' => __('Cannot write to translation file. Please check permissions.')], 500);
}
}
return response()->json(['success' => true, 'message' => __('Translations updated successfully')]);
} catch (\Exception $e) {
return response()->json(['error' => __('Failed to save translations: ') . $e->getMessage()], 500);
}
}
public function changeLanguage(Request $request)
{
$languageCode = $request->input('language');
// RTL languages that should automatically set layoutDirection to 'right'
$rtlLanguages = ['ar', 'he'];
$isRtl = in_array($languageCode, $rtlLanguages);
if (config('app.is_demo')) {
return redirect()->back()->cookie('app_language', $languageCode, 60 * 24 * 365);
}
if ($request->user()) {
$request->user()->update(['lang' => $languageCode]);
// Auto-update layoutDirection for RTL languages
if ($isRtl) {
updateSetting('layoutDirection', 'right', $request->user()->id);
}
}
return redirect()->back();
}
}