Selamat pagi, siang, malam untuk anda yang kebetulan sedang mampir di blog saya, melanjutkan seri tulisan saya tentang symfony 4, kali ini saya akan menulis tentang Translation. Apa itu Translation ? yah... simpelnya sejenis tool untuk membuat aplikasi kita bisa multi bahasa. Untuk tulisan saya sebelumnya bisa dibaca di https://catatan-pemrograman.blogspot.com/2018/10/membuat-api-crud-di-symfony-4.html. Da untuk bahan praktek saya, bisa diunduh di akun github saya disini : https://github.com/kematjaya0/tutorial. Oke cekidot....
Instalasi Translation
tulisan ini saya praktekkan dan saya rangkum dari halaman resmi symfony di https://symfony.com/doc/current/components/translation.html. Langsung saja untuk instalasi silahkan masuk ke direktori / folder project latihan kita dengan menggunakan CMD. Kalau saya di
F:\xampp_72\htdocs\tutorial
kemudian jalankan perintah berikut:
composer require symfony/translation
dan ikuti instruksi yang diberikan. Setelah selesai instalasi, silahkan buka file config di config/packages/translation.yaml
framework:
default_locale: '%locale%'
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks:
- '%locale%'
dari kode diatas, folder untuk membuat file translation adalah di folder translations. Untuk simulasi dual bahasa, disini saya coba buat antara bahasa Indonesia dengan bahasa Inggris. Untuk memulainya kita buat file translator di dalam folder translations. masing masing messages.en.yml untuk bahasa Inggris dan file messages.id.yml untuk bahasa Indonesia, seperti berikut,
// translations/messages.en.yml
test: Hai, this is symfony framework
// translations/messages.id.yml
test: Hai, ini latihan symfony framework
pada contoh file diatas, yg sebelah kiri disebut key dan yang kanan adalah value. Kemudan buka file config/packages/framework.yaml dan tambahkan kode berikut :
framework:
translator: { fallback: '%locale%' }
secret: '%env(APP_SECRET)%'
kemudian buka file config/services.yaml. Kemudian lihat di bagian parameter berikut :
parameters:
locale: 'id'
Pada potongan kode di atas, default bahasa / locale yang digunakan adalah id / Indonesia. Untuk menggunakan bahasa inggris, anda bisa mengganti value dari parameter locale dengan en. Untuk penggunaan di controller, sekarang kita buka file src/Controller/ApiController.php:
<?php // src/Controller/ApiController.php
namespace App\Controller;
use App\Entity\MCategory;
use App\Controller\Base\BaseController;
use App\Form\MCategoryType;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* @Route("/api/test")
*/
class ApiController extends BaseController
{
/**
* @Route("/", name="api_index")
*/
public function index(Request $request)
{
$queryBuilder = $this->getQueryBuilder(MCategory::class);
$paginator = $this->createPaginator($request, $queryBuilder->getQuery());
return $this->getPaginationData($paginator);
}
/**
* @Route("/insert", name="api_insert", methods={"GET","POST"})
*/
public function insert(Request $request, ValidatorInterface $validator)
{
$MCategory = new MCategory(); // membuat object MCategory
if($request->getMethod() == Request::METHOD_POST) { // jalankan jika method POST
$form = $this->createForm(MCategoryType::class, $MCategory); // membuat object form untuk menangkap inputan dari user
$MCategory = $this->processForm($MCategory, $form, $request); // memanggil function proccessForm yang ada di BaseController untuk memproses data input dari user
$valid = $MCategory instanceof MCategory; // check apakah data yang dikirim valid / tidak
if(!$valid){ // kirimkan pesan error jika data yang dikirim tidak valid
return $this->getResponseSuccess($MCategory);
}
$result =["status" => true, "messages" => 'data saved successfully'];
return $this->getResponseSuccess($MCategory);
}
$form = $this->createFormApi(MCategoryType::class, $MCategory); // membuat data form untuk ditampilkan ke user
return $form;
}
/**
* @Route("/update/{id}", name="api_update", methods={"GET","POST"})
*/
public function update(MCategory $MCategory, Request $request)
{
if($request->getMethod() == Request::METHOD_POST) { // jalankan jika method == POST
$form = $this->createForm(MCategoryType::class, $MCategory); // membuat object form untuk melakukan proses data
$MCategory = $this->processForm($MCategory, $form, $request); // memanggil funcgsi processForm di BaseController untuk memproses data
$valid = $MCategory instanceof MCategory;
if(!$valid){
return $this->getResponseSuccess($MCategory); // tampilkan pesan error jika ada error
}
$result =["status" => true, "messages" => 'data saved successfully'];
return $this->getResponseSuccess($MCategory);
}
$form = $this->createFormApi(MCategoryType::class, $MCategory);
return $this->getResponseSuccess($form);
}
/**
* @Route("/delete/{id}", name="api_delete", methods={"DELETE"})
*/
public function deleted(MCategory $MCategory)
{
// menghapus data
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($MCategory);
$entityManager->flush();
$data = ['status' => true, 'messages' => 'data berhasil dihapus'];
return $this->getResponseSuccess($data);
}
}
sebagai contoh kita akan ubah di function index, pertama tambahkan kode berikut untuk menggunakan translator:
<?php // src/Controller/ApiController.php
namespace App\Controller;
....
use Symfony\Component\Translation\TranslatorInterface;
kemudian ubah function index menjadi seperti berikut:
<?php //src/Controller/ApiController.php
namespace App\Controller;
...
use Symfony\Component\Translation\TranslatorInterface;
/**
* @Route("/api/test")
*/
class ApiController extends BaseController
{
/**
* @Route("/", name="api_index")
*/
public function index(Request $request, TranslatorInterface $translator)
{
return $translator->trans('test');
}
}
kemudian panggil menggunakan POSTMAN / di browser, sehingga hasilnya sebagai berikut,
kemudian untuk mencoba bahasa inggris saya coba ganti parameter locale yang ada di file config/services.yaml menjadi en seperti berikut:
parameters:
locale: 'en'
maka setelah saya coba lagi di browser / POSTMAN, maka hasilnya sebagai berikut:
mudah bukan ? sekarang kita perbaiki function kita yang lain agar bisa multi bahasa. Pertama kita buka file translation kita dan tambahkan menjadi seperti berikut :
// translations/messages.en.yml
test: Hai, this is symfony framework
save_success: Data saved successfully
update_success: Data updated successfully
delete_success: Data deleted successfully
// translations/messages.id.yml
test: Hai, ini latihan symfony framework
save_success: Data berhasil disimpan
update_success: Data berhasil diubah
delete_success: Data berhasil dihapus
kemudian kita ubah controller ApiController.php menjadi seperti berikut :
// function index, untuk index kita kembalikan seperti semula karena dalam contoh ini di dalam function index tidak ada label yang perlu di translate ke dalam multi bahasa
/**
* @Route("/", name="api_index")
*/
public function index(Request $request)
{
$queryBuilder = $this->getQueryBuilder(MCategory::class);
$paginator = $this->createPaginator($request, $queryBuilder->getQuery());
return $this->getPaginationData($paginator);
}
// function insert
/**
* @Route("/insert", name="api_insert", methods={"GET","POST"})
*/
public function insert(Request $request, ValidatorInterface $validator, TranslatorInterface $translator)
{
$MCategory = new MCategory(); // membuat object MCategory
if($request->getMethod() == Request::METHOD_POST) { // jalankan jika method POST
$form = $this->createForm(MCategoryType::class, $MCategory); // membuat object form untuk menangkap inputan dari user
$MCategory = $this->processForm($MCategory, $form, $request); // memanggil function proccessForm yang ada di BaseController untuk memproses data input dari user
$valid = $MCategory instanceof MCategory; // check apakah data yang dikirim valid / tidak
if(!$valid){ // kirimkan pesan error jika data yang dikirim tidak valid
return $this->getResponseSuccess($MCategory);
}
$result =["status" => true, "messages" => $translator->trans('save_success')];
return $this->getResponseSuccess($MCategory);
}
$form = $this->createFormApi(MCategoryType::class, $MCategory); // membuat data form untuk ditampilkan ke user
return $form;
}
// function update
/**
* @Route("/update/{id}", name="api_update", methods={"GET","POST"})
*/
public function update(MCategory $MCategory, Request $request, TranslatorInterface $translator)
{
if($request->getMethod() == Request::METHOD_POST) { // jalankan jika method == POST
$form = $this->createForm(MCategoryType::class, $MCategory); // membuat object form untuk melakukan proses data
$MCategory = $this->processForm($MCategory, $form, $request); // memanggil funcgsi processForm di BaseController untuk memproses data
$valid = $MCategory instanceof MCategory;
if(!$valid){
return $this->getResponseSuccess($MCategory); // tampilkan pesan error jika ada error
}
$result =["status" => true, "messages" => $translator->trans('update_success')];
return $this->getResponseSuccess($MCategory);
}
$form = $this->createFormApi(MCategoryType::class, $MCategory);
return $this->getResponseSuccess($form);
}
// function deleted
/**
* @Route("/delete/{id}", name="api_delete", methods={"DELETE"})
*/
public function deleted(MCategory $MCategory, TranslatorInterface $translator)
{
// menghapus data
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($MCategory);
$entityManager->flush();
$data = ['status' => true, 'messages' => $translator->trans('delete_success')];
return $this->getResponseSuccess($data);
}
kemudian silahkan dicoba pakai POSTMAN. Mudah bukan ?
Sementara cukup sekian dulu tulisan saya kali ini, semoga bermanfaat. Untuk mengunduh project latihan ini anda bisa kunjungi akun github saya di https://github.com/kematjaya0/tutorial.
Untuk tulisan saya selanjutnya, insya allah saya lanjutkan untuk memasukkan translation pada url di browser. Sampai Jumpa...
0 Komentar