Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Adım Adım Laravel Yerelleştirmesi [Kılavuz]
İçindekiler

Laravel yerelleştirmesi, geliştiricilerin çok dilli web siteleri oluşturmasına olanak tanıyan güçlü bir yerelleştirmedir. Laravel projelerinizde web yerelleştirmesini uygulayarak , farklı dil geçmişine sahip ziyaretçiler için kişiselleştirilmiş bir kullanıcı deneyimi sunabilir, sonuçta erişiminizi genişletebilir ve kullanıcı katılımını artırabilirsiniz.

Laravel uygulamanızda yerelleştirmeyi uygulama konusunda size yol göstereceğiz ve sizi yerelleştirme çabalarınızı basitleştirip geliştirebilecek bir araçla tanıştıracağız!

Neden Laravel web sitesini yerelleştirmelisiniz?

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Laravel web sitenizi yerelleştirmeniz için bazı önemli nedenleri burada bulabilirsiniz.

  • Küresel bir hedef kitleye ulaşın: Laravel yerelleştirerek uygulamanızın erişimini uluslararası bir hedef kitleye genişletebilirsiniz. Bu, farklı ülkelerden ve farklı dillerden kullanıcıların içeriğinizi anlamasına ve onunla etkileşime geçmesine olanak tanır.
  • Kullanıcı deneyimini iyileştirir: Yerelleştirme, kullanıcıların uygulamayla kendi ana dillerinde etkileşime girmesine olanak tanır ve bu da kullanıcı deneyimini önemli ölçüde artırır. Bu, etkileşim oranlarını artırabilir, hemen çıkma oranlarını azaltabilir ve dönüşümleri artırabilir.
  • Rekabet avantajı: Rekabetçi bir küresel pazarda, uygulamaların birden fazla dilde sunulması, rakiplere karşı önemli bir avantaj sağlayabilir. Uluslararası pazarlara olan bağlılığınızı gösterir ve yeni pazarlara daha etkili bir şekilde girmenize yardımcı olabilir.
  • SEO’yu İyileştirir: İyi yerelleştirilmiş web siteleri, belirli bir dilde yapılan aramalarda arama motorlarında daha iyi sıralamaya sahip olma eğilimindedir. Bu, blog trafiğinizi ve çeşitli pazarlardaki çevrimiçi görünürlüğünüzü artırabilir.

Çok dilli Laravel yerelleştirmesi için gereksinimler

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Laravelçok dilli yerelleştirmeyi uygularken dikkate alınması gereken birkaç gereksinim ve adım vardır.

  • En son yerelleştirme özelliklerini almak için Laravel en son sürümünü (örn. sürüm 10.x) kullandığınızdan emin olun.
  • PHP ve Laravel çerçevesine ilişkin temel bir anlayış, uygulama sürecinde yardımcı olacaktır.
  • Bir web sunucusu ve veritabanı da dahil olmak üzere Laraveldestekleyen bir yerel geliştirme ortamı veya sunucusu kurun.
  • Uygulamanızın destekleyeceği dilleri baştan belirleyin.

Basit Laravel çevirileri

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Bir Laravel uygulamasını veya web'i çevirmeden önce hangi gereksinimlerin karşılanması gerektiğini anladıktan sonra, Laravel basit bir şekilde çevirmek için bazı adımlar sunacağız.

Bunu yapmak için yerelleştirmek istediğiniz görünüm dosyasını açın; örneğin, Resources/views/welcome.blade.php. Daha sonra body etiketini aşağıdaki kodla değiştirin.

				
					<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to Linguise website!
            </div>
        </div>
    </div> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-no-optimize="1">var litespeed_vary=document.cookie.replace(/(?:(?:^|.*;\s*)_lscache_vary\s*\=\s*([^;]*).*$)|^.*$/,"");litespeed_vary||fetch("/wp-content/plugins/litespeed-cache/guest.vary.php",{method:"POST",cache:"no-cache",redirect:"follow"}).then(e=>e.json()).then(e=>{console.log(e),e.hasOwnProperty("reload")&&"yes"==e.reload&&(sessionStorage.setItem("litespeed_docref",document.referrer),window.location.reload(!0))});</script><script data-optimized="1" type="litespeed/javascript" data-src="https://www.linguise.com/wp-content/litespeed/js/435d0eaada3b593adf726e5cdfb5dd43.js?ver=0e199"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body>
				
			

Gördüğünüz gibi yukarıdaki metin şu anda doğrudan kodun içine yazılıyor. web sitelerinin farklı dillere çevrilmesini (uluslararasılaştırma) zorlaştırır

Yukarıdaki metni farklı dillere kolayca uyarlanabilmesi için daha esnek hale getireceğiz. Laravel bunun için çok faydalı bir özellik sunuyor; yerelleştirme sistemi. İlk adım olarak mevcut metni aşağıdaki kodla değiştirin.

				
					{{ __('Welcome to Linguise website!') }}
				
			

Laravel varsayılan olarak yukarıdaki metni görüntüleyecek ve kullanıcı İngilizce dışında bir dil seçerse çeviriye bakacaktır. Bu durumda, uygulamanın varsayılan dili olarak İngilizce kullanılacaktır.

Laravel çok dilli bir ağda yerel ayarları ayarlama

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Peki Laravel mevcut dili nasıl belirliyor veya uygulamada hangi dillerin mevcut olduğunu nasıl biliyor? Config/app.php dosyasındaki yerel ayarları kontrol eder. Bu dosyayı açın ve aşağıdaki iki anahtarı arayın.

				
					/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/

'locale' => 'en',

/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/

'fallback_locale' => 'en',

				
			

Tuşların üzerindeki açıklama açık olmalıdır. Özetle, yerel ayar anahtarı uygulamanız için varsayılan yerel ayarı tutar (kodda başka bir yerel ayar belirtilmemişse). Uygulamanızda var olmayan bir yerel ayar istenirse fallback_locale etkinleştirilir.

Şimdi desteklenen tüm yerel ayarların listesini sağlamak için bu dosyaya yeni bir anahtar ekleyelim.

				
					/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/

'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],


				
			

Bu noktada Laravel web'in İngilizce, İtalyanca ve Fransızca olmak üzere üç dili desteklemesini denedik.

Laravel çeviri dosyalarına genel bakış

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Diğer birçok çerçevede olduğu gibi Laravelde farklı dillere yönelik çeviriler ayrı dosyalarda saklanır. Bu çeviri dosyalarını düzenlemek için iki yöntem kullanılır.

Eski yöntem, dosyaları şu yapıda saklar: Resources/lang/{en,fr,it}/{myfile.php}. Yeni yöntem, Resources/lang/{fr.json, it.json} gibi JSON dosyalarını kullanır. Bu makale daha yeni yönteme odaklanacaktır; ancak çeviri anahtarlarının nasıl adlandırıldığı ve bunlara nasıl erişildiği konusundaki farklılıklar bir yana, ilkeler eski yöntem için benzerdir.

Bölgesel farklılıklar gösteren diller için dil dizinlerini veya dosyalarını ISO 15897 standardına göre adlandırmalısınız. Örneğin, İngiliz İngilizcesi en-gb yerine en_GB olarak adlandırılacaktır.

Genel bilgi

Laravelbirçok çerçevede olduğu gibi farklı dillere yönelik çeviriler ayrı dosyalarda saklanır. Laravel çeviri dosyalarını düzenlemek için iki temel yöntem vardır.

  1. Eski yaklaşım, dosyaların şu yol altında depolanmasını içerir: Resources/lang/{en,fr,it}/{myfile.php}.
  2. Modern yaklaşım, Resources/lang/{fr.json, it.json} dosyalarını kullanır.

Bu makale ikinci yönteme odaklanacak, ancak ilkeler her ikisine de uygulanabilir (çeviri anahtarlarının nasıl adlandırıldığı ve bunlara nasıl erişildiği konusunda farklılıklar vardır).

Bölgeye göre değişen diller için dil dizinlerinin/dosyalarının ISO 15897 standartlarına göre adlandırılması önerilir. Örneğin, İngiliz İngilizcesi en-gb yerine en_GB olarak gösterilir.

Laravel çeviri dosyaları oluşturma

Uygulamamız için yerel ayarları yapılandırdıktan sonra varsayılan karşılama mesajımızı çevirmeye devam edebiliriz.

Resources/lang dizini içinde JSON formatında yeni yerelleştirme dosyaları oluşturarak başlayalım. Öncelikle bir Resources/lang/it.json dosyası oluşturacağız ve onu uygun çevirilerle dolduracağız.

				
					{
  "Welcome to Linguise website!": "Benvenuti nel sito web di Linguise!"
}

				
			

Daha sonra bir Resources/lang/fr.json dosyası ekleyin.

				
					{
 "Welcome to Linguise website!": "Bienvenue sur le site de Linguise"
}

				
			

Gördüğünüz gibi, sürekli olarak hoş geldiniz.blade.php dosyasındaki varsayılan mesaja atıfta bulunuyoruz ({{ __(' Linguise web sitesine hoş geldiniz!') }}). Laravel varsayılan mesajların İngilizce olduğunu otomatik olarak tanıdığından en.json dosyası oluşturmanıza gerek yoktur.

Laravel çok dilli bir uygulamada dil değiştiriciyi ayarlama

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Ayrıca, Laravel henüz yerel dili geçersiz kılacak şekilde kurulmadığından şimdilik çeviriyi doğrudan rota içerisinde gerçekleştireceğiz. Routes/web.php dosyasındaki varsayılan karşılama rotasını şu şekilde değiştirin.

				
					Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});
				
			

Bu durumda, isteğe bağlı bir yerel ayar GET parametresi yakalıyoruz ve geçerli yerel ayarı buna göre ayarlıyoruz (istenen yerel ayar destekleniyorsa).

Artık web sitenizi ziyaret edebilir ve desteklenen dillerden herhangi birini URL'deki ilk segment olarak ekleyebilirsiniz. Örneğin, localhost/it veya localhost/fr'ye gitmek, yerelleştirilmiş içeriği görüntüleyecektir. Bir yerel ayar belirtmezseniz veya desteklenmeyen bir yerel ayar seçmezseniz, Laravel varsayılan olarak İngilizce'yi (en) kullanacaktır.

Laravel için yerelleştirme ara yazılımı

Yerel ayarın her URL'ye dahil edilmesi ideal olmayabilir ve sitenin görsel çekiciliğini bozabilir. Bu sorunu çözmek için bir dil değiştirici kuracağız ve çevrilmiş içeriği görüntülemek için kullanıcı oturumunu kullanacağız. app/Http/Middleware/Localization.php dosyasında yeni ara katman yazılımı oluşturabilir veya bunu artisan make:middleware Localization komutunu çalıştırarak oluşturabilirsiniz.

Daha sonra içerisine aşağıdaki kodu ekleyin.

				
					<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}


				
			

Bu ara katman yazılımı, eğer bu seçenek oturumda mevcutsa, Laravel kullanıcı tarafından seçilen konumu kullanmaya yönlendirecektir.

İşlemin her istekte çalıştırılmasına ihtiyacımız olduğundan, bunu web ara yazılım grubu için app/Http/Kernel.php dosyasındaki varsayılan ara katman yazılımı yığınına ekleyin.

				
					/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
  'web' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \App\Http\Middleware\Localization::class, // <--- add this
],


				
			

Rotaları değiştirme

Daha sonra,routes/web.php dosyasındaki yerel ayarı değiştirmek için bir rota tanımlayın. Burada bir kapatma rotası kullanıyoruz, ancak isterseniz aynı kodu bir denetleyicinin içine yerleştirebilirsiniz.

				
					Route::get('language/{locale}', function ($locale) {
   app()->setLocale($locale);
   session()->put('locale', $locale);
   return redirect()->back();
});

				
			

Ayrıca, daha önce varsayılan karşılama yoluna eklenen yerel ayar değiştirmeyi de kaldırın. Kök rotanız artık şu şekilde görünmelidir.

				
					Route::get('/', function () {
   return view('welcome');
});

				
			

Bu yapıldıktan sonra kullanıcı yalnızca localhost/language/{locale} adresini ziyaret ederek aktif dili değiştirebilir. Seçilen yerel ayar oturuma kaydedilecek ve kullanıcılar önceki sayfalarına yönlendirilecek (Yerelleştirme ara yazılımı tarafından işlendiği şekilde). 

Test etmek için localhost/language/it adresine gidin (oturum çerezinin tarayıcınızda etkin olduğunu varsayarak) ve çevrilmiş içeriği görmelisiniz. Sitede gezinebilir veya sayfayı yenileyebilirsiniz; seçilen dil geçerli kalacaktır.

Dil değiştirici uygulaması

yerel ayar kodlarını URL'ye manuel olarak girmelerini gerektirmek yerine, Laravel web dil değiştiricisini değiştirmesi için tıklanabilir bir seçenek sunmamız gerekiyor Bunu başarmak için basit bir dil değiştirici oluşturun. Resources/views/partials/language_switcher.blade.php adresine yeni bir dosya ekleyin ve aşağıdaki kodu ekleyin.

				
					<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>


				
			

Yeni oluşturulan dil değiştiriciyi “hoş geldiniz” görünümüne dahil etmek için, aşağıdaki satırı, değiştiricinin görünmesini istediğiniz yere hoş geldiniz.blade.php dosyanıza eklemeniz yeterlidir.

				
					<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')

            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website!') }}
            </div>
        </div>
    </div> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-optimized="1" type="litespeed/javascript" data-src="https://www.linguise.com/wp-content/litespeed/js/435d0eaada3b593adf726e5cdfb5dd43.js?ver=0e199"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body>


				
			

app/Providers/AppServiceProvider.php dosyasını açın ve dil değiştirici kullanıldığında geçerli yerel ayarı tüm görünümlerle paylaşmak için boot() yöntemine aşağıdaki kodu ekleyin.

				
					* Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    view()->composer('partials.language_switcher', function ($view) {
        $view->with('current_locale', app()->getLocale());
        $view->with('available_locales', config('app.available_locales'));
    });
}


				
			

Laravel PHP'deki gelişmiş çeviri özellikleri

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Bu tartışmada daha sonra tarih, sayı ve para birimi gibi diğer yerelleştirme bileşenlerini ele alacağız. İşte adımlar.

Laravel yerelleştirilmiş tarihler

Yerelleştirme sürecinde tarih ve saatlerin işlenmesi çok önemlidir. Laravel tarihleri ​​ve saatleri yönetmek için Carbon'u kullanır. Yerelleştirilmiş bir tarihi görüntülemek için Carbon'u nasıl kullanabileceğinizi burada bulabilirsiniz.

				
					<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});


				
			

Bu kod, Carbon yerel ayarını uygulamanın geçerli yerel ayarına göre ayarlar ve tarihi buna göre biçimlendirir.

Yerelleştirilmiş tarihi bir görünümde görüntülemek için:

				
					{{ __('Welcome to our website, :Name', ['name' => ‘Johb’]) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}


				
			

Sayıları ve para birimlerini biçimlendirme

Farklı ülkelerde sayıları biçimlendirmenin çeşitli yolları vardır. Örneğin.

  • Fransa → 123 123,12
  • Almanya → 123.123,12
  • Japonya → 123.123

Laravel uygulamanızda bu varyasyonlara uyum sağlamak için NumberFormatter'ı kullanabilirsiniz.

				
					<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);
				
			

Ayrıca sayıları belirli bir dilde de yazabilirsiniz.

				
					<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);

$num2 = NumberFormatter::create('it', NumberFormatter::SPELLOUT);
				
			

İşte para birimleri. Fransız yerel ayarında (`fr`), para birimi euro (€) cinsinden görüntülenirken, ABD yerel ayarında (`en_US`), ABD doları ($) cinsinden gösterilir.

				
					<?php
$currency1 = NumberFormatter::create('it', NumberFormatter::CURRENCY);

$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);
				
			
Dil Engellerini Aşın
Dil engellerine elveda ve sınırsız büyümeye merhaba deyin! Otomatik çeviri hizmetimizi bugün deneyin.

Linguise ile alternatif çözüm Laravel yerelleştirmesi

Adım Adım Laravel Yerelleştirmesi [Kılavuz]

Laravel yerelleştirme adımlarını makalede anlatıldığı gibi anladıktan sonra bu süreç, kullanıcıların Laravel program kodunu derinlemesine anlamasını gerektiren birçok adımı içerir.

Bu durum, uygulamalarını yerelleştirmek isteyen acemi kullanıcılar için kesinlikle işi zorlaştırabilir. Bu nedenle, hızlı çeviri yapabilen, yerelleştirmeyi destekleyen ve uygulanması yalnızca birkaç basit adım gerektiren daha yenilikçi bir çözüme ihtiyaç vardır.

Umut verici bir çözüm Linguise. Linguise derinlemesine kodlama bilgisine ihtiyaç duymadan Laravel yerelleştirmesine daha kolay ve daha verimli bir yaklaşım sunar. Linguise temel özellikleri şunları içerir:

  • Laravel ile kolay entegrasyon
  • Dil değiştiriciyi kodlamadan özelleştirin
  • Resim çevirisi
  • Çevirileri yerel bağlama göre özelleştirmek için canlı düzenleyici
  • Dinamik olarak oluşturulan içerik için dinamik çeviri
  • Çoklu dil versiyonları için SEO optimizasyonu

Linguise Laravel web sitelerine kurma adımları da kolaylıkla yapılabilir. İşte kısa bir açıklama.

  1. Linguise hesabı oluşturun (30 günlük ücretsiz deneme sürümünü ücretsiz kullanın)
  2. Laravel web alanınızı kaydedin ve bazı bilgileri girin. Bir API anahtarı alacaksınız.
  3. Linguise çeviri komut dosyasını sahip olduğunuz Laravel klasörüne yükleyin ve bağlayın.
  4. Htaccess dosyasındaki dil URL'lerini ayarlayın.
  5. Dil değiştirici komut dosyasını HTML'nizin başına ekleyin.
  6. Dil değiştiriciyi gerektiği gibi özelleştirin
  7. Dil değiştirici Laravel web üzerinde görünecek ve içerik otomatik olarak çevrilebilecektir.

Nasıl? Linguiseile yalnızca kaydolmanız ve etkinleştirmeniz yeterlidir; dil değiştirici görünecektir. Bundan sonra, örneğin canlı düzenleyici, çeviri medyası, görseller vb. aracılığıyla yerelleştirme yapmakta özgürsünüz.

Yeni pazarlar keşfetmeye hazır mısınız? 1 aylık risksiz deneme süremizle otomatik çeviri hizmetimizi ücretsiz deneyin. Kredi kartına gerek yok!

Çözüm

Laravel yerelleştirmesi, geliştiricilerin çok dilli web siteleri ve uygulamalar oluşturmasına olanak tanıyan güçlü bir özelliktir. Gördüğümüz gibi yerleşik Laravel yerelleştirme süreci birden fazla adımı içerir ve çerçevenin iyi anlaşılmasını gerektirir. Yeni başlayanlar veya daha hızlı çözüm arayanlar için zorlayıcı olabilir.

Linguise gibi araçlar, daha akıcı bir yaklaşım arayanlar için yenilikçi bir alternatif sunuyor. Bu çözümler hızlı çeviri yetenekleri, kolay entegrasyon ve özelleştirilebilir dil değiştiriciler ve görüntü çevirisi gibi kullanıcı dostu özellikler sunar. Şimdi Linguise hesabınızı oluşturun Laravel yerelleştirme özelliğimizin keyfini çıkarın !

Okumak da ilginizi çekebilir

kaçırmayın!
Haber bültenimize abone ol

Web sitesi otomatik çevirisi, uluslararası SEO ve daha fazlası hakkında haberler alın!

Invalid email address
Bir şans ver. Ayda bir ve istediğiniz zaman abonelikten çıkabilirsiniz.

E-postanızı paylaşmadan ayrılmayın!

Piyangoyu kazanacağınızı garanti edemeyiz, ancak çeviri ve ara sıra indirimlerle ilgili bazı ilginç bilgilendirici haberler verebiliriz.

kaçırmayın!
Invalid email address