Adım Adım Laravel Yerelleştirme [Kılavuzu]

İşletmenizi küresel genişleme ile bir sonraki seviyeye taşıyın. İş büyümesi ve gelişimi.
İçindekiler

Laravel yerelleştirme, geliştiricilerin çok dilli web siteleri oluşturmasını sağlayan güçlü bir özelliktir. Web yerelleştirmeyi Laravel projelerinizde uygulayarak, farklı dilsel geçmişlere sahip ziyaretçiler için kişiselleştirilmiş bir kullanıcı deneyimi sağlayabilir, sonuçta erişiminizi genişletebilir ve kullanıcı etkileşimini geliştirebilirsiniz.

Laravel uygulamanızda yerelleştirmeyi nasıl uygulayacağınızı adım adım anlatacağız ve yerelleştirme çabalarınızı basitleştirebilecek ve geliştirebilecek bir araçla tanıştıracağız!

Neden Laravel web sitesini yerelleştirmelisiniz?

Turuncu yelekli bir adam dünya haritası olan bir tablet tutuyor. Çeşitli ülke bayrakları gösteriliyor.

Laravel web sitenizi neden yerelleştirmelisiniz, bazı önemli nedenler burada.

  • Küresel bir kitleye ulaşın: Laravel web sitenizi yerelleştirerek, uygulamanızın erişimini uluslararası bir kitleye genişletebilirsiniz. Bu, farklı ülkelerden ve dil arka planlarından kullanıcıların içeriğinizi anlamasına ve etkileşimde bulunmasına olanak tanır.
  • Kullanıcı deneyimini geliştirir: Yerelleştirme, kullanıcıların uygulamayla ana dillerinde etkileşimde bulunmalarını sağlar, bu da kullanıcı deneyimini önemli ölçüde geliştirir. 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, birden fazla dilde uygulama sunmak rakiplere karşı önemli bir avantaj sağlayabilir. Bu, uluslararası pazarlara olan bağlılığınızı gösterir ve yeni pazarlara daha etkili bir şekilde girmmenize yardımcı olabilir.
  • Arama motoru optimizasyonunu geliştirir: İyi yerelleştirilmiş web siteleri, belirli bir dildeki aramalarda arama motorlarında daha iyi sıralama eğilimindedir. Bu, blog trafiğinizi artırabilir ve çok dilli çeviri ile çeşitli pazarlarda çevrimiçi görünürlüğünüzü artırabilir.

Çok dilli Laravel yerelleştirme gereksinimleri

Çeşitli uygulamalar içeren büyük bir bilgisayar ekranında işbirliği yapan iki kişi. Birlikte çalışıyor gibi görünüyorlar.

Laravel'da çok dilli yerelleştirmeyi uygularken dikkate almanız gereken birkaç gereksinim ve adım vardır.

  • En son yerelleştirme özelliklerini almak için Laravel 'ün en son sürümünü (örneğin, 10.x sürümü) kullandığınızdan emin olun.
  • PHP ve Laravel çerçevesinin temel anlaşılması, uygulama sürecinde yardımcı olacaktır.
  • Bir web sunucusu ve veritabanı dahil olmak üzere Laravel'yi destekleyen yerel bir geliştirme ortamı veya sunucu kurun.
  • Uygulamanızın başlangıçtan itibaren destekleyeceği dilleri belirleyin.

Basit Laravel çevirileri

Laptop üzerinde çalışan adam. Ekranda web taraması.

Bir Laravel uygulamasını veya web sitesini çevirmeden önce hangi gereksinimlerin karşılanması gerektiğini anladıktan sonra, Laravel 'ı basitçe ç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. Ardından, 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">window.lazyLoadOptions=Object.assign({},{threshold:300},window.lazyLoadOptions||{});!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 o(t){return e({},at,t)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,vt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,vt,e)}function i(t){return s(t,null),0}function r(t){return null===c(t)}function u(t){return c(t)===_t}function d(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function f(t,e){et?t.classList.add(e):t.className+=(t.className?" ":"")+e}function _(t,e){et?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 v(t,e){!e||(e=e._observer)&&e.unobserve(t)}function b(t,e){t&&(t.loadingCount+=e)}function p(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 h(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function m(t){return!!t[lt]}function E(t){return t[lt]}function I(t){return delete t[lt]}function y(e,t){var n;m(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[lt]=n)}function L(a,t){var o;m(a)&&(o=E(a),t.forEach(function(t){var e,n;e=a,(t=o[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function k(t,e,n){f(t,e.class_loading),s(t,st),n&&(b(n,1),d(e.callback_loading,t,n))}function A(t,e,n){n&&t.setAttribute(e,n)}function O(t,e){A(t,rt,l(t,e.data_sizes)),A(t,it,l(t,e.data_srcset)),A(t,ot,l(t,e.data_src))}function w(t,e,n){var a=l(t,e.data_bg_multi),o=l(t,e.data_bg_multi_hidpi);(a=nt&&o?o:a)&&(t.style.backgroundImage=a,n=n,f(t=t,(e=e).class_applied),s(t,dt),n&&(e.unobserve_completed&&v(t,e),d(e.callback_applied,t,n)))}function x(t,e){!e||0<e.loadingCount||0<e.toLoadCount||d(t.callback_finish,e)}function M(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function N(t){return!!t.llEvLisnrs}function z(t){if(N(t)){var e,n,a=t.llEvLisnrs;for(e in a){var o=a[e];n=e,o=o,t.removeEventListener(n,o)}delete t.llEvLisnrs}}function C(t,e,n){var a;delete t.llTempImage,b(n,-1),(a=n)&&--a.toLoadCount,_(t,e.class_loading),e.unobserve_completed&&v(t,n)}function R(i,r,c){var l=g(i)||i;N(l)||function(t,e,n){N(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";M(t,a,e),M(t,"error",n)}(l,function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_loaded),s(e,ut),d(n.callback_loaded,e,a),o||x(n,a),z(l)},function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_error),s(e,ft),d(n.callback_error,e,a),o||x(n,a),z(l)})}function T(t,e,n){var a,o,i,r,c;t.llTempImage=document.createElement("IMG"),R(t,e,n),m(c=t)||(c[lt]={backgroundImage:c.style.backgroundImage}),i=n,r=l(a=t,(o=e).data_bg),c=l(a,o.data_bg_hidpi),(r=nt&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),k(a,o,i)),w(t,e,n)}function G(t,e,n){var a;R(t,e,n),a=e,e=n,(t=Et[(n=t).tagName])&&(t(n,a),k(n,a,e))}function D(t,e,n){var a;a=t,(-1<It.indexOf(a.tagName)?G:T)(t,e,n)}function S(t,e,n){var a;t.setAttribute("loading","lazy"),R(t,e,n),a=e,(e=Et[(n=t).tagName])&&e(n,a),s(t,_t)}function V(t){t.removeAttribute(ot),t.removeAttribute(it),t.removeAttribute(rt)}function j(t){h(t,function(t){L(t,mt)}),L(t,mt)}function F(t){var e;(e=yt[t.tagName])?e(t):m(e=t)&&(t=E(e),e.style.backgroundImage=t.backgroundImage)}function P(t,e){var n;F(t),n=e,r(e=t)||u(e)||(_(e,n.class_entered),_(e,n.class_exited),_(e,n.class_applied),_(e,n.class_loading),_(e,n.class_loaded),_(e,n.class_error)),i(t),I(t)}function U(t,e,n,a){var o;n.cancel_on_exit&&(c(t)!==st||"IMG"===t.tagName&&(z(t),h(o=t,function(t){V(t)}),V(o),j(t),_(t,n.class_loading),b(a,-1),i(t),d(n.callback_cancel,t,e,a)))}function $(t,e,n,a){var o,i,r=(i=t,0<=bt.indexOf(c(i)));s(t,"entered"),f(t,n.class_entered),_(t,n.class_exited),o=t,i=a,n.unobserve_entered&&v(o,i),d(n.callback_enter,t,e,a),r||D(t,n,a)}function q(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function H(t,o,i){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?$(t.target,t,o,i):(e=t.target,n=t,a=o,t=i,void(r(e)||(f(e,a.class_exited),U(e,n,a,t),d(a.callback_exit,e,n,t))));var e,n,a})}function B(e,n){var t;tt&&!q(e)&&(n._observer=new IntersectionObserver(function(t){H(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function J(t){return Array.prototype.slice.call(t)}function K(t){return t.container.querySelectorAll(t.elements_selector)}function Q(t){return c(t)===ft}function W(t,e){return e=t||K(e),J(e).filter(r)}function X(e,t){var n;(n=K(e),J(n).filter(Q)).forEach(function(t){_(t,e.class_error),i(t)}),t.update()}function t(t,e){var n,a,t=o(t);this._settings=t,this.loadingCount=0,B(t,this),n=t,a=this,Y&&window.addEventListener("online",function(){X(n,a)}),this.update(e)}var Y="undefined"!=typeof window,Z=Y&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),tt=Y&&"IntersectionObserver"in window,et=Y&&"classList"in document.createElement("p"),nt=Y&&1<window.devicePixelRatio,at={elements_selector:".lazy",container:Z||Y?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",it="srcset",rt="sizes",ct="poster",lt="llOriginalAttrs",st="loading",ut="loaded",dt="applied",ft="error",_t="native",gt="data-",vt="ll-status",bt=[st,ut,dt,ft],pt=[ot],ht=[ot,ct],mt=[ot,it,rt],Et={IMG:function(t,e){h(t,function(t){y(t,mt),O(t,e)}),y(t,mt),O(t,e)},IFRAME:function(t,e){y(t,pt),A(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){y(t,pt),A(t,ot,l(t,e.data_src))}),y(t,ht),A(t,ct,l(t,e.data_poster)),A(t,ot,l(t,e.data_src)),t.load()}},It=["IMG","IFRAME","VIDEO"],yt={IMG:j,IFRAME:function(t){L(t,pt)},VIDEO:function(t){a(t,function(t){L(t,pt)}),L(t,ht),t.load()}},Lt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,o=this._settings,i=W(t,o);{if(p(this,i.length),!Z&&tt)return q(o)?(e=o,n=this,i.forEach(function(t){-1!==Lt.indexOf(t.tagName)&&S(t,e,n)}),void p(n,0)):(t=this._observer,o=i,t.disconnect(),a=t,void o.forEach(function(t){a.observe(t)}));this.loadAll(i)}},destroy:function(){this._observer&&this._observer.disconnect(),K(this._settings).forEach(function(t){I(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;W(t,n).forEach(function(t){v(t,e),D(t,n,e)})},restoreAll:function(){var e=this._settings;K(e).forEach(function(t){P(t,e)})}},t.load=function(t,e){e=o(e);D(t,e)},t.resetStatus=function(t){i(t)},t}),function(t,e){"use strict";function n(){e.body.classList.add("litespeed_lazyloaded")}function a(){console.log("[LiteSpeed] Start Lazy Load"),o=new LazyLoad(Object.assign({},t.lazyLoadOptions||{},{elements_selector:"[data-lazyloaded]",callback_finish:n})),i=function(){o.update()},t.MutationObserver&&new MutationObserver(i).observe(e.documentElement,{childList:!0,subtree:!0,attributes:!0})}var o,i;t.addEventListener?t.addEventListener("load",a,!1):t.attachEvent("onload",a)}(window,document);</script><script data-no-optimize="1">window.litespeed_ui_events=window.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><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/96129ac38cb6b9f49104ed76760d740a.js?ver=570de"></script></body>
				
			

Gördüğünüz gibi, yukarıdaki metin şu anda doğrudan kod içinde yazılmıştır. Bu daha az verimlidir ve web sitelerini farklı dillere çevirmeyi (uluslararasılaştırma) zorlaştırır.

Yukarıdaki metni farklı dillere kolayca uyarlanabilecek şekilde daha esnek hale getireceğiz. Laravel bunun için çok yararlı bir özellik sağlar; 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ışındaki bir dili seçerse çeviriye bakacaktır. Bu durumda, İngilizce uygulama için varsayılan dil olarak kullanılacaktır.

Laravel çok dilli web'de yerel ayarların yapılandırılması

Two people working on computer screens. They are interacting with large displays.

Peki Laravel uygulama içinde hangi dilin geçerli olduğunu veya hangi dillerin mevcut olduğunu nasıl belirler? 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',

				
			

Anahtarların üzerindeki açıklama açık olmalıdır. Özetle, locale anahtarı uygulamanız için varsayılan dili tutar (kodda başka bir dil belirtilmemişse). fallback_locale, uygulamanızda var olmayan bir dil istendiğinde etkinleştirilir.

Şimdi, desteklenen tüm yerel ayarların bir 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 sitesini üç dili, yani İngilizce, İtalyanca ve Fransızca'yı destekleyecek şekilde denedim.

Laravel çeviri dosyalarına genel bakış

Renkli çeşitli simgeler gösteren büyük bir bilgisayar ekranını işaret eden bir kadın. Ekranın mavi ve mor simgelerle beyaz bir arka planı var.

Laravel'de, diğer birçok çerçevede olduğu gibi, farklı diller için çeviriler ayrı dosyalarda saklanır. Bu çeviri dosyalarını düzenlemek için iki yöntem kullanılır.

Eski yöntem, dosyaları aşağıdaki yapıya göre depolar: resources/lang/{en,fr,it}/{myfile.php}. Yeni yöntem, resources/lang/{fr.json, it.json} gibi JSON dosyaları kullanır. Bu makale, daha yeni yönteme odaklanacaktır, ancak ilkeler eski yöntem için de benzerdir, çeviri anahtarlarının adlandırılması ve erişimindeki farklılıklar hariç.

Bölgesel varyasyonları olan diller için, dil dizinlerini veya dosyalarını ISO 15897 standardına göre adlandırmanız gerekir. Örneğin, İngiliz İngilizcesi en-gb yerine en_GB olarak adlandırılmalıdır.

Genel bilgiler

Laravel'daki birçok çerçevede olduğu gibi, farklı diller için çeviriler ayrı dosyalarda saklanır. Laravel çeviri dosyalarını düzenlemek için iki temel yöntem vardır.

  1. Eski yaklaşım, dosyaları şu yol altında saklamayı 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 odaklanacaktır, ancak ilkeler her ikisi için de geçerlidir (çeviri anahtarlarının adlandırılma ve erişilme şeklindeki varyasyonlarla birlikte).

Bölgeye göre değişen diller için, dil dizinlerini/dosyalarını ISO 15897 standartlarına göre adlandırmanız ö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.

Kaynaklar/dil dizini içinde JSON biçiminde yeni yerelleştirme dosyaları oluşturarak başlayalım. İlk olarak, resources/lang/it.json dosyasını oluşturup uygun çevirilerle dolduracağız.

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

				
			

Ardından, resources/lang/fr.json dosyasını ekleyin.

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

				
			

Gözlemleyebileceğiniz gibi, welcome.blade.php dosyasından varsayılan iletiyi sürekli olarak referans alıyoruz ({{ __(‘ Linguise web sitesine hoş geldiniz!’) }}). en.json dosyası oluşturmaya gerek yok, çünkü Laravel varsayılan iletilerin İngilizce olduğunu otomatik olarak tanır.

Laravel çok dilli uygulamasında dil değiştiriciyi ayarlama

Büyük bir e-posta arayüzü ile etkileşimde bulunan insanlar.

Ayrıca, Laravel yerel dili geçersiz kılmak için henüz yapılandırılmadı, bu nedenle şimdilik çeviriyi doğrudan rota içinde ele alacağız. routes/web.php dosyası içindeki varsayılan karşılama rotasını bu ş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 GET parametresi yakalıyoruz ve buna dayalı olarak geçerli yerel ayarları belirliyoruz (istenen yerel ayar destekleniyorsa).

Artık web sitenizi ziyaret edebilir ve URL'deki ilk segment olarak desteklenen dillerden herhangi birini dahil edebilirsiniz. Örneğin, localhost/it veya localhost/fr adresine gidildiğinde yerelleştirilmiş içerik görüntülenir. Bir yerel ayar belirtmezseniz veya desteklenmeyen bir yerel ayar seçerseniz, Laravel varsayılan olarak İngilizce (en) olur.

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

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

Ardından, aşağıdaki kodu içeriye 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 yazılım, eğer bu seçenek oturumda mevcutsa, Laravel 'nin kullanıcı tarafından seçilen konumu kullanmasını sağlar.

Bu işlemin her isteğe göre çalıştırılması gerektiğinden, app/Http/Kernel.php'deki varsayılan ara yazılım yığınına web ara yazılım grubu için 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

Ardından, routes/web.php dosyasında yerel ayarları değiştirmek için bir rota tanımlayın. Burada bir closure rotası kullanıyoruz, ancak isterseniz aynı kodu bir denetleyici içinde de kullanabilirsiniz.

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

				
			

Ek olarak, daha önce varsayılan karşılama yoluna eklenen yerel ayarı değiştirme özelliğini kaldırın. Kök rotanız şimdi böyle görünmelidir.

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

				
			

Bu işlem yapıldıktan sonra, kullanıcı yalnızca localhost/language/{locale} adresini ziyaret ederek etkin dili değiştirebilecektir. Seçilen yerel ayar oturumda kaydedilecek ve kullanıcılar önceki sayfalarına geri yönlendirilecektir (Localization ara yazılımı tarafından işlenir). 

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

Dil değiştirici uygulaması

Şimdi, kullanıcıya dil değiştiriciyi değiştirmek Laravel web kullanıcıların URL'ye manuel olarak yerel kodları girmelerini talep etmek yerine. Bunu başarmak için basit bir dil değiştirici oluşturun. resources/views/partials/language_switcher.blade.php konumuna 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 "welcome" görünümüne dahil etmek için, welcome.blade.php dosyasına aşağıdaki satırı ekleyin; dil değiştiricinin görünmesini istediğiniz yere ekleyin.

				
					<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">window.lazyLoadOptions=Object.assign({},{threshold:300},window.lazyLoadOptions||{});!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 o(t){return e({},at,t)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,vt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,vt,e)}function i(t){return s(t,null),0}function r(t){return null===c(t)}function u(t){return c(t)===_t}function d(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function f(t,e){et?t.classList.add(e):t.className+=(t.className?" ":"")+e}function _(t,e){et?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 v(t,e){!e||(e=e._observer)&&e.unobserve(t)}function b(t,e){t&&(t.loadingCount+=e)}function p(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 h(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function m(t){return!!t[lt]}function E(t){return t[lt]}function I(t){return delete t[lt]}function y(e,t){var n;m(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[lt]=n)}function L(a,t){var o;m(a)&&(o=E(a),t.forEach(function(t){var e,n;e=a,(t=o[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function k(t,e,n){f(t,e.class_loading),s(t,st),n&&(b(n,1),d(e.callback_loading,t,n))}function A(t,e,n){n&&t.setAttribute(e,n)}function O(t,e){A(t,rt,l(t,e.data_sizes)),A(t,it,l(t,e.data_srcset)),A(t,ot,l(t,e.data_src))}function w(t,e,n){var a=l(t,e.data_bg_multi),o=l(t,e.data_bg_multi_hidpi);(a=nt&&o?o:a)&&(t.style.backgroundImage=a,n=n,f(t=t,(e=e).class_applied),s(t,dt),n&&(e.unobserve_completed&&v(t,e),d(e.callback_applied,t,n)))}function x(t,e){!e||0<e.loadingCount||0<e.toLoadCount||d(t.callback_finish,e)}function M(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function N(t){return!!t.llEvLisnrs}function z(t){if(N(t)){var e,n,a=t.llEvLisnrs;for(e in a){var o=a[e];n=e,o=o,t.removeEventListener(n,o)}delete t.llEvLisnrs}}function C(t,e,n){var a;delete t.llTempImage,b(n,-1),(a=n)&&--a.toLoadCount,_(t,e.class_loading),e.unobserve_completed&&v(t,n)}function R(i,r,c){var l=g(i)||i;N(l)||function(t,e,n){N(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";M(t,a,e),M(t,"error",n)}(l,function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_loaded),s(e,ut),d(n.callback_loaded,e,a),o||x(n,a),z(l)},function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_error),s(e,ft),d(n.callback_error,e,a),o||x(n,a),z(l)})}function T(t,e,n){var a,o,i,r,c;t.llTempImage=document.createElement("IMG"),R(t,e,n),m(c=t)||(c[lt]={backgroundImage:c.style.backgroundImage}),i=n,r=l(a=t,(o=e).data_bg),c=l(a,o.data_bg_hidpi),(r=nt&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),k(a,o,i)),w(t,e,n)}function G(t,e,n){var a;R(t,e,n),a=e,e=n,(t=Et[(n=t).tagName])&&(t(n,a),k(n,a,e))}function D(t,e,n){var a;a=t,(-1<It.indexOf(a.tagName)?G:T)(t,e,n)}function S(t,e,n){var a;t.setAttribute("loading","lazy"),R(t,e,n),a=e,(e=Et[(n=t).tagName])&&e(n,a),s(t,_t)}function V(t){t.removeAttribute(ot),t.removeAttribute(it),t.removeAttribute(rt)}function j(t){h(t,function(t){L(t,mt)}),L(t,mt)}function F(t){var e;(e=yt[t.tagName])?e(t):m(e=t)&&(t=E(e),e.style.backgroundImage=t.backgroundImage)}function P(t,e){var n;F(t),n=e,r(e=t)||u(e)||(_(e,n.class_entered),_(e,n.class_exited),_(e,n.class_applied),_(e,n.class_loading),_(e,n.class_loaded),_(e,n.class_error)),i(t),I(t)}function U(t,e,n,a){var o;n.cancel_on_exit&&(c(t)!==st||"IMG"===t.tagName&&(z(t),h(o=t,function(t){V(t)}),V(o),j(t),_(t,n.class_loading),b(a,-1),i(t),d(n.callback_cancel,t,e,a)))}function $(t,e,n,a){var o,i,r=(i=t,0<=bt.indexOf(c(i)));s(t,"entered"),f(t,n.class_entered),_(t,n.class_exited),o=t,i=a,n.unobserve_entered&&v(o,i),d(n.callback_enter,t,e,a),r||D(t,n,a)}function q(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function H(t,o,i){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?$(t.target,t,o,i):(e=t.target,n=t,a=o,t=i,void(r(e)||(f(e,a.class_exited),U(e,n,a,t),d(a.callback_exit,e,n,t))));var e,n,a})}function B(e,n){var t;tt&&!q(e)&&(n._observer=new IntersectionObserver(function(t){H(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function J(t){return Array.prototype.slice.call(t)}function K(t){return t.container.querySelectorAll(t.elements_selector)}function Q(t){return c(t)===ft}function W(t,e){return e=t||K(e),J(e).filter(r)}function X(e,t){var n;(n=K(e),J(n).filter(Q)).forEach(function(t){_(t,e.class_error),i(t)}),t.update()}function t(t,e){var n,a,t=o(t);this._settings=t,this.loadingCount=0,B(t,this),n=t,a=this,Y&&window.addEventListener("online",function(){X(n,a)}),this.update(e)}var Y="undefined"!=typeof window,Z=Y&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),tt=Y&&"IntersectionObserver"in window,et=Y&&"classList"in document.createElement("p"),nt=Y&&1<window.devicePixelRatio,at={elements_selector:".lazy",container:Z||Y?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",it="srcset",rt="sizes",ct="poster",lt="llOriginalAttrs",st="loading",ut="loaded",dt="applied",ft="error",_t="native",gt="data-",vt="ll-status",bt=[st,ut,dt,ft],pt=[ot],ht=[ot,ct],mt=[ot,it,rt],Et={IMG:function(t,e){h(t,function(t){y(t,mt),O(t,e)}),y(t,mt),O(t,e)},IFRAME:function(t,e){y(t,pt),A(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){y(t,pt),A(t,ot,l(t,e.data_src))}),y(t,ht),A(t,ct,l(t,e.data_poster)),A(t,ot,l(t,e.data_src)),t.load()}},It=["IMG","IFRAME","VIDEO"],yt={IMG:j,IFRAME:function(t){L(t,pt)},VIDEO:function(t){a(t,function(t){L(t,pt)}),L(t,ht),t.load()}},Lt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,o=this._settings,i=W(t,o);{if(p(this,i.length),!Z&&tt)return q(o)?(e=o,n=this,i.forEach(function(t){-1!==Lt.indexOf(t.tagName)&&S(t,e,n)}),void p(n,0)):(t=this._observer,o=i,t.disconnect(),a=t,void o.forEach(function(t){a.observe(t)}));this.loadAll(i)}},destroy:function(){this._observer&&this._observer.disconnect(),K(this._settings).forEach(function(t){I(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;W(t,n).forEach(function(t){v(t,e),D(t,n,e)})},restoreAll:function(){var e=this._settings;K(e).forEach(function(t){P(t,e)})}},t.load=function(t,e){e=o(e);D(t,e)},t.resetStatus=function(t){i(t)},t}),function(t,e){"use strict";function n(){e.body.classList.add("litespeed_lazyloaded")}function a(){console.log("[LiteSpeed] Start Lazy Load"),o=new LazyLoad(Object.assign({},t.lazyLoadOptions||{},{elements_selector:"[data-lazyloaded]",callback_finish:n})),i=function(){o.update()},t.MutationObserver&&new MutationObserver(i).observe(e.documentElement,{childList:!0,subtree:!0,attributes:!0})}var o,i;t.addEventListener?t.addEventListener("load",a,!1):t.attachEvent("onload",a)}(window,document);</script><script data-no-optimize="1">window.litespeed_ui_events=window.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><script data-optimized="1" type="litespeed/javascript" data-src="https://www.linguise.com/wp-content/litespeed/js/96129ac38cb6b9f49104ed76760d740a.js?ver=570de"></script></body>


				
			

app/Providers/AppServiceProvider.php dosyasını açın ve dil değiştirici kullanıldığında tüm görünümlerle mevcut dili 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'de Gelişmiş çeviri özellikleri

Bir proje üzerinde çalışan insanların illüstrasyonu. İşbirliği yapan bir takım.

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

Laravel'de Yerelleştirilmiş tarihler

Tarihler ve saatlerle ilgili işlemler, yerelleştirme sürecinde çok önemlidir. Laravel , tarihleri ve saatleri yönetmek için Carbon'u kullanır. İşte Carbon'u yerelleştirilmiş bir tarih görüntülemek için nasıl kullanabileceğiniz.

				
					<?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 mevcut yerel ayarı temelinde 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ı ülkelerin sayıları biçimlendirme yöntemleri farklıdır. Örneğin.

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

Laravel uygulamanızdaki bu varyasyonları karşılamak için NumberFormatter'ı kullanabilirsiniz.

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

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

Sayıları belirli bir dilde de telaffuz edebilirsiniz.

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

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

İşte para birimleri. Fransız bölgesi (`fr`) için para birimi euro (€) cinsinden gösterilirken, ABD bölgesi (`en_US`) için ABD dolar ($) cinsinden gösterilecektir.

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

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

Alternatif çözüm Laravel yerelleştirme Linguise ile

Dijital bir proje üzerinde birlikte çalışan bir ekip. Çeşitli dijital araçlar ve sembollerle çevrilidirler.

Makale de açıklandığı gibi Laravel yerelleştirme adımlarını anladıktan sonra, bu işlem kullanıcıların Laravel program kodunu derinlemesine anlamasını gerektiren birçok adım içerir.

Bu, uygulamalarını yerelleştirmek isteyen yeni başlayanlar için kesinlikle zor olabilir. Bu nedenle, hızlı çeviri yapabilen, yerelleştirmeyi destekleyen ve uygulanması için yalnızca birkaç basit adım gerektiren daha yenilikçi bir çözüme ihtiyaç vardır.

Umut verici bir çözüm Linguise'tir. Linguise , Laravel yerelleştirmeye daha kolay ve daha verimli bir yaklaşım sunar, derinlemesine kodlama bilgisine gerek kalmadan. Linguise 'in temel özellikleri arasında.

  • Laravel ile kolay entegrasyon
  • Kodlama olmadan dil değiştiriciyi özelleştirin
  • Görüntü çevirisi
  • Çevirileri yerel bağlama uyarlamak için canlı düzenleyici
  • Dinamik olarak oluşturulan içerik için dinamik çeviri
  • Çoklu dil sürümleri için SEO optimizasyonu

LinguiseLaravel web sitelerine de kolayca yapılabilir. İşte kısa bir açıklama.

  1. Bir Linguise hesabı oluşturun (ücretsiz 30 günlük deneme süresini 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ı aldığınız Laravel klasörüne yükleyin ve bağlayın.
  4. htaccess dosyasında dil URL'lerini ayarlayın.
  5. Dil değiştirme 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 sitesinde görünecek ve içerik otomatik olarak çevrilecektir.

Nasıl? Linguiseile sadece kayıt olmanız ve etkinleştirmeniz gerekir, dil değiştirici görünecektir. Bundan sonra, örneğin canlı düzenleyici aracılığıyla yerelleştirmek, medya çevirmek, resimler vb. için özgürsünüz.

Yeni pazarları keşfetmeye hazır mısınız? Otomatik çeviri hizmetimizi 1 aylık risksiz deneme süresiyle ücretsiz deneyin. Kredi kartı gerekmez!

Sonuç

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

Linguise gibi araçlar, daha akıcı bir yaklaşım arayanlar için yenilikçi bir alternatif sunar. 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 ve Laravel için özelliklerimizin keyfini çıkarın!

Ayrıca okumaktan hoşlanabilirsiniz

Kaçırmayın!
Bültenimize Abone Olun

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

Invalid email address
Deneyin. Ayda bir kez ve istediğiniz zaman abonelikten çıkabilirsiniz.

E-posta adresinizi paylaşmadan bırakmayın!

Piyangoyu kazanmanızı garanti edemeyiz, ancak çeviri ve ara sıra yapılan indirimler hakkında ilginç bilgilendirici haberler verebiliriz.

Kaçırmayın!
Invalid email address