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 çalışmalarınızı basitleştirebilecek ve geliştirebilecek bir araçla tanıştıracağız!

Neden Laravel web sitesini yerelleştirmelisiniz?

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

Laravel web sitenizi neden yerelleştirmelisiniz, bunun bazı önemli nedenleri aşağıda verilmiştir.

  • Küresel bir kitleye ulaşın: Laravel
  • Kullanıcı deneyimini iyileştirir: Yerelleştirme, kullanıcıların uygulamayla ana dillerinde etkileşimde bulunmalarını sağlar, bu da kullanıcı deneyimini önemli ölçüde iyileştirir. Bu, etkileşim oranlarını artırabilir, sıçrama oranlarını azaltabilir ve dönüşümleri artırabilir.
  • Rekabet avantajı: Rekabetçi bir küresel pazarda, uygulamaları birden fazla dilde 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.
  • SEO'yu iyileştirir: İyi yerelleştirilmiş web siteleri, belirli bir dildeki aramalarda arama motorlarında daha iyi sıralanma 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ştirmesi için gereksinimler

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

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

  • En son yerelleştirme özelliklerini almak için Laravel 'nin en son sürümünü (örneğin, 10.x sürümü) kullandığınızdan emin olun.
  • Laravel çerçevesi ve PHP hakkında temel bir anlayış, uygulama sürecinde yardımcı olacaktır.
  • Laraveldahil olmak üzere bir web sunucusu ve veritabanı içeren 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 gereksinimleri karşılaması gerektiğini anladıktan sonra, Laravel ç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, gövde 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/431f4e8b131b30a3d3da8324aaa1db48.js?ver=6943a"></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 uyarlayabilmek için daha esnek hale getireceğiz. Laravel bunun için çok yararlı bir özellik sunar; yerelleştirme sistemi. İlk adım olarak, mevcut metni aşağıdaki kod ile 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 varsayılan dil olarak kullanılacaktır.

Laravel çok dilli bir web'de yerel ayarları yapılandırma

Bilgisayar ekranlarında çalışan iki kişi. Büyük ekranlarla etkileşim halindeler.

Peki Laravel geçerli dili nasıl belirliyor veya uygulama içinde hangi dillerin mevcut olduğunu nasıl biliyor? config/app.php dosyasındaki locale ayarlarını kontrol ediyor. 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 net 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 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'i üç dili desteklemeye çalıştık, yani İngilizce, İtalyanca ve Fransızca.

Laravel çeviri dosyalarına genel bakış

Büyük bir bilgisayar ekranına çeşitli renkli simgeler gösteren bir kadını işaret ediyor. Ekranın beyaz arka planı mavi ve mor simgeler içeriyor.

Laravel'te, 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ıda 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 çeviri anahtarlarının adlandırılması ve erişimindeki farklılıklar dışında, ilkeler benzerdir.

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

Genel bilgiler

Laravel'te, 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 depolamayı 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ılması ve erişilmesi konusundaki varyasyonlarla birlikte).

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österilecektir.

Laravel çeviri dosyaları oluşturma

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

Yeni yerelleştirme dosyaları JSON formatında resources/lang dizininde oluşturarak başlayalım. İlk olarak, resources/lang/it.json dosyasını oluşturacağız ve 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 ({{ __(‘ Linguise web sitesine hoş geldiniz!’) }}) sürekli olarak referans alıyoruz. en.json dosyası oluşturmaya gerek yoktur, çünkü Laravel varsayılan iletilerin İngilizce olduğunu otomatik olarak tanır.

Çok dilli bir Laravel uygulamasında dil değiştirici 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ılmamıştır, bu nedenle şimdilik çeviriyi doğrudan rota içinde ele alacağız. routes/web.php dosyası içindeki varsayılan karşılama rotasını buna göre 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 geçerli yerel ayarı buna göre ayarlıyoruz (istenen yerel 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ı

Her URL'de yerel ayarları 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 katman 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 katman, eğer bu seçenek oturumda mevcutsa, Laravel 'in kullanıcı tarafından seçilen konumu kullanmasını sağlar.

Her istekte çalıştırma işlemine ihtiyacımız olduğundan, web ara yazılım grubu için app/Http/Kernel.php'deki varsayılan ara 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

Ardından, routes/web.php dosyasında yerel ayarı değiştirmek için bir rota tanımlayın. Burada bir kapatma rotası kullanıyoruz, ancak aynı kodu bir denetleyici içine de yerleştirebilirsiniz.

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

				
			

Ek olarak, daha önce varsayılan karşılama rotasına eklenen yerel ayar anahtarını kaldırın. Kök rotanız şimdi şö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ştirebilir. Seçilen yerel ayar oturumda kaydedilecek ve kullanıcılar önceki sayfalarına yönlendirilecektir (Localization ara yazılımı tarafından işlenir). 

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. Siteyi gezebilir veya sayfayı yenileyebilirsiniz, seçilen dil etkin kalacaktır.

Dil değiştirici uygulaması

Şimdi, kullanıcıya dil değiştirme seçeneğini manuel olarak URL'ye locale kodlarını girmelerini gerektirmek yerine tıklanabilir bir seçenek sunmamız gerekiyor. Dil değiştirici Laravel web 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, değiştiricinin görünmesini istediğiniz yere welcome.blade.php dosyasına aşağıdaki satırı 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/431f4e8b131b30a3d3da8324aaa1db48.js?ver=6943a"></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'da yerelleştirilmiş tarihler

Tarihleri ve saatleri yönetmek, yerelleştirme sürecinde çok önemlidir. Laravel , tarihleri ve saatleri yönetmek için Carbon'u kullanır. İşte Carbon'u yerelleştirilmiş bir tarihi 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.

Bir görünümde yerelleştirilmiş tarihi 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 yazabilirsiniz.

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

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

İşte para birimleri. Fransız yerel ayarı (`fr`) için para birimi euro (€) olarak görüntülenirken, ABD yerel ayarı (`en_US`) için ABD doları ($) olarak 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 çevrilidir.

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

Bu kesinlikle uygulamalarını yerelleştirmek isteyen yeni başlayan kullanıcılar için zor olabilir. 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'dir. Linguise , Laravel yerelleştirmeye daha kolay ve daha verimli bir yaklaşım sunar ve derinlemesine kodlama bilgisine ihtiyaç duymaz. Linguise 'in temel özellikleri.

  • 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
  • Çok dilli sürümler için SEO optimizasyonu

Kurulum adımları Linguise, Laravel web sitelerine de kolayca yapılabilir. İşte kısa bir açıklama.

  1. Ücretsiz 30 günlük deneme süresini kullanarak bir Linguise hesabı oluşturun
  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ı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 sitenizde görünecek ve içerik otomatik olarak çevrilecektir.

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 aracılığıyla, medya, resim vb. çevirileri yapabilirsiniz.

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 çok adım içerir ve çerçeve hakkında iyi bir anlayış 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

Okumaya ilgisi duyabileceğiniz diğer içeriklerimiz

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 ayrılmayın!

Piyangoyu kazanacağınızı garanti edemeyiz, ancak çeviri ve ara sıra indirimler hakkında ilginç bilgilendirici haberler verebiliriz.

Kaçırmayın!
Invalid email address