Förbättringsförslag kring översättning i Wordpress

Permalänk
Medlem

Förbättringsförslag kring översättning i Wordpress

Hej,

jag bör börja med att jag är total novis på detta och jag håller på att bygga min första hemsida och har ett köpt tema. Jag använder även woocommerce på hemsidan. För att översätta allt har jag använt loco translate som funkat utmärkt för allt utom en liten sträng i kundvagnen "no products in the cart". För att lösa detta kollade jag runt med supporten för de olika plugins som berörs och temat utan lycka. Ramlade sedan över en lösning på google, nämligen att lägga till detta i mitt barntemas function-fil:

// translation of empty cart function change_translate_text( $translated_text ) { if ( 'No products in the cart.' === $translated_text ) { $translated_text = 'Inga produkter i varukorgen.'; } return $translated_text; } add_filter( 'gettext', 'change_translate_text', 20 );

Men i samma veva hittade jag själva funktionen i någon wordpress logg och där hade några kommenterat att det inte är bästa sättet att översätta på. Dock undrar jag hur man bör göra istället för att på ett bättre sätt översätta kundvagnens meddelande. Går det att skriva koden mer träffsäker eller på något annat vis för att göra det bättre?

Här finns kommentaren (den översta kommentaren): https://developer.wordpress.org/reference/hooks/gettext/

Någon som förstår sig på vad dom pratar om? Jag har främst byggt min hemsida med elementor och ett färdigt tema, så det tekniska bakom går över mitt huvud 🤷‍♂️

Permalänk
Medlem
Skrivet av flamur:

Hej,

jag bör börja med att jag är total novis på detta och jag håller på att bygga min första hemsida och har ett köpt tema. Jag använder även woocommerce på hemsidan. För att översätta allt har jag använt loco translate som funkat utmärkt för allt utom en liten sträng i kundvagnen "no products in the cart". För att lösa detta kollade jag runt med supporten för de olika plugins som berörs och temat utan lycka. Ramlade sedan över en lösning på google, nämligen att lägga till detta i mitt barntemas function-fil:

// translation of empty cart function change_translate_text( $translated_text ) { if ( 'No products in the cart.' === $translated_text ) { $translated_text = 'Inga produkter i varukorgen.'; } return $translated_text; } add_filter( 'gettext', 'change_translate_text', 20 );

__________________________

Men i samma veva hittade jag själva funktionen i någon wordpress logg och där hade några kommenterat att det inte är bästa sättet att översätta på. Dock undrar jag hur man bör göra istället för att på ett bättre sätt översätta kundvagnens meddelande. Går det att skriva koden mer träffsäker eller på något annat vis för att göra det bättre?

Här finns kommentaren (den översta kommentaren): https://developer.wordpress.org/reference/hooks/gettext/

Någon som förstår sig på vad dom pratar om? Jag har främst byggt min hemsida med elementor och ett färdigt tema, så det tekniska bakom går över mitt huvud 🤷‍♂️

Gör dig själv en tjänst och kika på hur du formatterar kodstycke här

Jag har aldrig nyttjat wordpress så utan att lära mig mer om det så låter det som att det som varnas för i huvudsak är att om du har flera översättningar på samma sida samt har flera översättningar du kollar emot i din change_translate_text funktion så kommer alla dessa kollas igenom av alla funktionskall. Pondera att du har en sida som ser ut såhär (psuedo)

Min hemsida change_translate_text('welcome'); change_translate_text('how are you today'); change_translate_text('please come again');

change_translate text kommer i detta fall kallas på 3 gånger, har du då 3 översättningar den kollar emot i funktionen (i värsta fall fler) så är det detta som snabbt kan spåra ur. Om du inte hittar hur översättningarna kan ske genom pluginet så är troligen det bästa du kan göra en key => value array likt nedan, de du länkar till ser även ut att ta upp att kolla om sidan du är på innehåller översättningar ($domain) detta kan enkelt läggas till genom att ha domain som en övre nyckel men kräver då också att du skickar in den som argument.

function change_translate_text($translated_text) { // utan domain $translations = [ 'No products in the cart' => 'Inga produkter i varukorgen' ]; return $translations[$translated_text] ?? $translated_text; } function change_translate_text($domain, $translated_text) { // med domain $translations = [ 'cart.php' => [ 'No products in the cart' => 'Inga produkter i varukorgen' ] ]; return $translations[$domain][$translated_text] ?? $translated_text; }

Permalänk
Medlem

Tusen tack Joakim. Jag har uppdaterat inlägget så det är enklare att läsa nu också 😇

Jag fick faktiskt fatt i personen som skrev inlägget jag nämnde som du också kollade på och han svarade såhär på min fråga (liknande den ovan):

It's not as big of a difference with 1 translation, when you have multiple (which should be inside the 1 function, rather than having multiple functions all with various translations) then checking the domain means running once, rather than having 5 different checks it's comparing for a thousand various strings on the page.

add_filter( 'gettext', 'change_translate_text', 20, 3 ); function change_translate_text( $translated_text, $untranslated_text, $domain ) { if ( 'woocommerce' !== $domain ) { return $translated_text; } if ( 'No products in the cart.' === $translated_text ) { $translated_text = 'Inga produkter i varukorgen.'; } return $translated_text; }

______________

Problemet är att hans inte funkade tyvärr. Jag skrev tillbaka och frågade så väntar svar där.

Du utgår också från hans ide om att skriva domain. Jag förstår inte vad som menas med detta, jag kopierar bara vad ni skriver. Men ska jag använda domain eller inte? Något i hans kodförslag funkade inte, kanske fel domain? Om jag kopierar din kod är det bara rakt av eller måste jag skriva in något mer för att koden ska förstå vilken domain som menas? 🤔🤷‍♂️

Permalänk
Medlem

Fick precis svar från honom igen:

Hi XXXX,

I have a test WooCommerce site, the wording is "Your cart is currently empty." instead of "No products in the cart.". If I change the string in the snippet it swaps to 'Inga produkter i varukorgen.' for me (https://d.pr/i/HnrjFL/k7j9U9rL5B)
The original string can vary between site languages.

Turns out though there is actually a filter specifically for this message, which is the better way to do it because it runs once, rather than gettext which runs hundreds of times, sometimes thousands, on every single page load. Despite only ever being useful in empty cart scenario. It's a very flexible function but very inefficient!

add_filter( 'wc_empty_cart_message', 'my_woocommerce_empty_cart_message' ); function my_woocommerce_empty_cart_message() { return 'Inga produkter i varukorgen.'; }

Permalänk
Medlem
Skrivet av flamur:

Fick precis svar från honom igen:

Hi XXXX,

I have a test WooCommerce site, the wording is "Your cart is currently empty." instead of "No products in the cart.". If I change the string in the snippet it swaps to 'Inga produkter i varukorgen.' for me (https://d.pr/i/HnrjFL/k7j9U9rL5B)
The original string can vary between site languages.

Turns out though there is actually a filter specifically for this message, which is the better way to do it because it runs once, rather than gettext which runs hundreds of times, sometimes thousands, on every single page load. Despite only ever being useful in empty cart scenario. It's a very flexible function but very inefficient!

add_filter( 'wc_empty_cart_message', 'my_woocommerce_empty_cart_message' ); function my_woocommerce_empty_cart_message() { return 'Inga produkter i varukorgen.'; }

Det låter som att du har hittat en bra lösning med det där filtret, här har du lite mer information gällande översättningar för WordPress. $domain är tydligen deras sätt att differentiera mellan olika plugins och teman. Det jag skulle gissa sker är att gettext med $domain optimeras för att bara köras om det angivna pluginet/temat aktivt laddas till sidan eller liknande, filtret ovan gör troligen samma sak men kanske än mer effektivt.

Permalänk
Medlem

Tusen tack för din hjälp Joakim. Aha! Makes sense när du förklarar det så. Det vore ju ett smartare sätt helt enkelt. Tyvärr funkar inte det filtret han skrev heller. Det kanske beror på fel domain eller något annat litet fel - men jag är bara på en copy paste nivå så vet inte vad jag läser egentligen. Jag har skrivit dessa exempel till woocommerce också och fick ett förslag från dom också - ska med spänning prova den senare 😅 Jag fortsätter uppdatera löpande ifall någon annan letar svar senare och ifall någon snäll skäl förstår sig på vad som skrivs kanske har ett fungerande förslag.

Förslag 4 från woocommerce supporten som ska provas och som kanske är lite mer optimerad än den breda get text koden jag fått att fungera i början:

add_filter( 'gettext', 'change_translate_text', 20, 3 ); function change_translate_text( $translated_text, $untranslated_text, $domain ) { if ( 'woocommerce' !== $domain ) { return $translated_text; } if ( 'No products in the cart.' === $translated_text ) { $translated_text = 'Inga produkter i varukorgen.'; } return $translated_text; }

Permalänk
Medlem

Uppdatering: Woocommerce förslag, ser jag nu, är samma som jag skrev till dom. Funkar alltså inte. Provade att ta bort 3an och flytta ner filtret längst ner också (= så det ser mer ut som den koden som fungerar utan domain) men ingen lycka så heller. Strängen är ju översättningsbar så jag fattar inte hur det kan vara så lurigt att träffa den... kan temats skapare ha flyttat strängen till sitt tema eller någon av hans plugins som behövs för sidan? Jag har frågat honom förut kring detta när jag började felsöka översättningen men han svarade bara att han skulle kolla upp det 🤷‍♂️

Permalänk
Medlem
Skrivet av flamur:

Tusen tack för din hjälp Joakim. Aha! Makes sense när du förklarar det så. Det vore ju ett smartare sätt helt enkelt. Tyvärr funkar inte det filtret han skrev heller. Det kanske beror på fel domain eller något annat litet fel - men jag är bara på en copy paste nivå så vet inte vad jag läser egentligen. Jag har skrivit dessa exempel till woocommerce också och fick ett förslag från dom också - ska med spänning prova den senare 😅 Jag fortsätter uppdatera löpande ifall någon annan letar svar senare och ifall någon snäll skäl förstår sig på vad som skrivs kanske har ett fungerande förslag.

Förslag 4 från woocommerce supporten som ska provas och som kanske är lite mer optimerad än den breda get text koden jag fått att fungera i början:

add_filter( 'gettext', 'change_translate_text', 20, 3 ); function change_translate_text( $translated_text, $untranslated_text, $domain ) { if ( 'woocommerce' !== $domain ) { return $translated_text; } if ( 'No products in the cart.' === $translated_text ) { $translated_text = 'Inga produkter i varukorgen.'; } return $translated_text; }

Skrivet av flamur:

Uppdatering: Woocommerce förslag, ser jag nu, är samma som jag skrev till dom. Funkar alltså inte. Provade att ta bort 3an och flytta ner filtret längst ner också (= så det ser mer ut som den koden som fungerar utan domain) men ingen lycka så heller. Strängen är ju översättningsbar så jag fattar inte hur det kan vara så lurigt att träffa den... kan temats skapare ha flyttat strängen till sitt tema eller någon av hans plugins som behövs för sidan? Jag har frågat honom förut kring detta när jag började felsöka översättningen men han svarade bara att han skulle kolla upp det 🤷‍♂️

Att ta bort 3an är ingen bra ide, den noterar hur många argument funktionen tar emot. Då jag som sagt inte är insatt i Wordpress så kan jag tyvärr inte ge så mycket mer råd utan att dyka ner i det själv. Vilka plugins och teman använder du?

Edit: hittade även detta, kan vara lättare att använda?

Permalänk
Medlem
Skrivet av flamur:

Uppdatering: Woocommerce förslag, ser jag nu, är samma som jag skrev till dom. Funkar alltså inte. Provade att ta bort 3an och flytta ner filtret längst ner också (= så det ser mer ut som den koden som fungerar utan domain) men ingen lycka så heller. Strängen är ju översättningsbar så jag fattar inte hur det kan vara så lurigt att träffa den... kan temats skapare ha flyttat strängen till sitt tema eller någon av hans plugins som behövs för sidan? Jag har frågat honom förut kring detta när jag började felsöka översättningen men han svarade bara att han skulle kolla upp det 🤷‍♂️

Jag slängde upp en docker-miljö med wordpress för o testa och följande fungerade direkt för mig, det jag gjorde var att lägga denna kod i slutet av functions.php av det temat jag använder mig utav. Detta är dock inte rekommenderat då dessa ändringar troligen kommer skrivas över vid uppdatering etc. och man bör i sådana fall använda sig av något likt detta.

function my_woocommerce_empty_cart_message() { return 'Inga produkter i varukorgen.'; } add_filter( 'wc_empty_cart_message', 'my_woocommerce_empty_cart_message' );

Permalänk
Medlem

Ojdå vilken manöver. Verkligen tusen tack för ditt engagemang och hjälp 🙏

Jag provade det sista du skrev utan lycka. Men jag kan konstatera några saker som säkert påverkar detta. Jag ser nu att woocommerce varukorgen är översatt med loco translate (när jag skriver in urlen så jag smiter in i den tomma varukorgen så att säga). Dock är det temat som har en popup funktion för varukorgen och det är den som inte går att översätta förutom med den generella koden. Och det blir uppenbart att det säkert är något han själv byggt och inte inom woocommerce och därför det inte går att "träffa" med specifik kod. Jag killgissar nu alltså. Jag kan också konstatera att den andra delen som jag inte lyckas översätta är en sidebar som kommer från elementor PRO (en plugin för att nybörjare som mig ska kunna bygga en hemsida). Dessa två platser är alltså inte woocoomerce specifika och jag gissar att det är därför de inte hittas och kan översättas. Jag lutar åt att strunta i detta då temats grundare inte bemödar sig att klura ut hur han lagt popupen som inte är översättningsbar samt elementor-delen är inte inom temat. Det är nog därför den generella get text koden funkar då den laddas hela tiden. Men den stör mitt sinne då det blir en massa onödiga laddningar enligt den där wordpress personen 😅

Permalänk
Medlem
Skrivet av flamur:

Ojdå vilken manöver. Verkligen tusen tack för ditt engagemang och hjälp 🙏

Jag provade det sista du skrev utan lycka. Men jag kan konstatera några saker som säkert påverkar detta. Jag ser nu att woocommerce varukorgen är översatt med loco translate (när jag skriver in urlen så jag smiter in i den tomma varukorgen så att säga). Dock är det temat som har en popup funktion för varukorgen och det är den som inte går att översätta förutom med den generella koden. Och det blir uppenbart att det säkert är något han själv byggt och inte inom woocommerce och därför det inte går att "träffa" med specifik kod. Jag killgissar nu alltså. Jag kan också konstatera att den andra delen som jag inte lyckas översätta är en sidebar som kommer från elementor PRO (en plugin för att nybörjare som mig ska kunna bygga en hemsida). Dessa två platser är alltså inte woocoomerce specifika och jag gissar att det är därför de inte hittas och kan översättas. Jag lutar åt att strunta i detta då temats grundare inte bemödar sig att klura ut hur han lagt popupen som inte är översättningsbar samt elementor-delen är inte inom temat. Det är nog därför den generella get text koden funkar då den laddas hela tiden. Men den stör mitt sinne då det blir en massa onödiga laddningar enligt den där wordpress personen 😅

Ah okej, elementor pro verkar ha "elementor" som domain vilket du kan testa, du kan också leta i koden för temat efter "Text Domain:" vilket det efter bör stå vad det temat har för domain.

Permalänk
Medlem

Jag har ingen som helst koll på Wordpress så än mindre på plugins.
Men har inte sådan profesionella sidor separata språkfiler?