Skip to content

Commit 44920c7

Browse files
authored
feat: Allow to set alternate language(s) (#318)
* test: Set alternate language(s) * feat: Set alternate language(s) * doc: Set alternate language(s)
1 parent 09d0524 commit 44920c7

File tree

5 files changed

+117
-2
lines changed

5 files changed

+117
-2
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@ SEOMeta::addKeyword($keyword);
552552
SEOMeta::addMeta($meta, $value = null, $name = 'name');
553553
SEOMeta::addAlternateLanguage($lang, $url);
554554
SEOMeta::addAlternateLanguages(array $languages);
555+
SEOMeta::setAlternateLanguage($lang, $url);
556+
SEOMeta::setAlternateLanguages(array $languages);
555557
SEOMeta::setTitleSeparator($separator);
556558
SEOMeta::setTitle($title);
557559
SEOMeta::setTitleDefault($default);

src/SEOTools/Contracts/MetaTags.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,25 @@ public function addAlternateLanguage($lang, $url);
187187
*/
188188
public function addAlternateLanguages(array $languages);
189189

190+
/**
191+
* Set an alternate language.
192+
*
193+
* @param string $lang language code in format ISO 639-1
194+
* @param string $url
195+
*
196+
* @return static
197+
*/
198+
public function setAlternateLanguage($lang, $url);
199+
200+
/**
201+
* Set alternate languages.
202+
*
203+
* @param array $languages
204+
*
205+
* @return static
206+
*/
207+
public function setAlternateLanguages(array $languages);
208+
190209
/**
191210
* Get the title formatted for display.
192211
*

src/SEOTools/Facades/SEOMeta.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
* @method static \Artesaos\SEOTools\Contracts\MetaTags setNext(string $url)
2424
* @method static \Artesaos\SEOTools\Contracts\MetaTags addAlternateLanguage(string $lang, string $url)
2525
* @method static \Artesaos\SEOTools\Contracts\MetaTags addAlternateLanguages(array $languages)
26+
* @method static \Artesaos\SEOTools\Contracts\MetaTags setAlternateLanguage(string $lang, string $url)
27+
* @method static \Artesaos\SEOTools\Contracts\MetaTags setAlternateLanguages(array $languages)
2628
* @method static string getTitle()
2729
* @method static string getTitleSession()
2830
* @method static string getTitleSeparator()

src/SEOTools/SEOMeta.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,9 @@ public function generate($minify = false)
198198
}
199199

200200
foreach ($languages as $lang) {
201-
$html[] = "<link rel=\"alternate\" hreflang=\"{$lang['lang']}\" href=\"{$lang['url']}\">";
201+
if (!empty($lang['lang'] && !empty($lang['url']))) {
202+
$html[] = "<link rel=\"alternate\" hreflang=\"{$lang['lang']}\" href=\"{$lang['url']}\">";
203+
}
202204
}
203205

204206
if ($robots) {
@@ -387,6 +389,32 @@ public function addAlternateLanguages(array $languages)
387389
return $this;
388390
}
389391

392+
/**
393+
* {@inheritdoc}
394+
*/
395+
public function setAlternateLanguage($lang, $url)
396+
{
397+
// Remove language if already existing
398+
$this->alternateLanguages = array_filter($this->alternateLanguages, function ($arr) use ($lang) {
399+
return $arr['lang'] !== $lang;
400+
});
401+
402+
// Append (updated) language
403+
$this->alternateLanguages[] = ['lang' => $lang, 'url' => $url];
404+
405+
return $this;
406+
}
407+
408+
/**
409+
* {@inheritdoc}
410+
*/
411+
public function setAlternateLanguages(array $languages)
412+
{
413+
$this->alternateLanguages = $languages;
414+
415+
return $this;
416+
}
417+
390418
/**
391419
* Sets the meta robots.
392420
*

tests/SEOTools/SEOMetaTest.php

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ public function test_set_prev()
251251
$this->assertEquals($prev, $this->seoMeta->getPrev());
252252
}
253253

254-
public function test_set_alternate_languages()
254+
public function test_add_alternate_languages()
255255
{
256256
$fullHeader = "<title>It's Over 9000!</title>";
257257
$fullHeader .= "<meta name=\"description\" content=\"For those who helped create the Genki Dama\">";
@@ -270,6 +270,70 @@ public function test_set_alternate_languages()
270270
$this->assertEquals(array_merge($expectedLangs, $expectedLangs), $this->seoMeta->getAlternateLanguages());
271271
}
272272

273+
public function test_set_alternate_languages()
274+
{
275+
$fullHeader = "<title>It's Over 9000!</title>";
276+
$fullHeader .= "<meta name=\"description\" content=\"For those who helped create the Genki Dama\">";
277+
$fullHeader .= "<link rel=\"alternate\" hreflang=\"en\" href=\"http://domain.com\">";
278+
$lang = 'en';
279+
$langUrl = 'http://domain.com';
280+
281+
$expectedLangs = [['lang' => $lang, 'url' => $langUrl]];
282+
$this->seoMeta->setAlternateLanguage($lang, $langUrl);
283+
284+
$this->setRightAssertion($fullHeader);
285+
$this->assertEquals($expectedLangs, $this->seoMeta->getAlternateLanguages());
286+
287+
$this->seoMeta->setAlternateLanguages($expectedLangs);
288+
289+
$this->assertEquals($expectedLangs, $this->seoMeta->getAlternateLanguages());
290+
}
291+
292+
public function test_set_override_alternate_language()
293+
{
294+
$fullHeader = "<title>It's Over 9000!</title>";
295+
$fullHeader .= "<meta name=\"description\" content=\"For those who helped create the Genki Dama\">";
296+
$fullHeader .= "<link rel=\"alternate\" hreflang=\"en\" href=\"http://domain.test\">";
297+
$lang = 'en';
298+
$langUrl = 'http://domain.com';
299+
$langUrlOverridden = 'http://domain.test';
300+
301+
$expectedLangs = [['lang' => $lang, 'url' => $langUrl]];
302+
$expectedLangsOverridden = [['lang' => $lang, 'url' => $langUrlOverridden]];
303+
304+
$this->seoMeta->setAlternateLanguage($lang, $langUrl);
305+
$this->assertEquals($expectedLangs, $this->seoMeta->getAlternateLanguages());
306+
307+
$this->seoMeta->setAlternateLanguage($lang, $langUrlOverridden);
308+
$this->setRightAssertion($fullHeader);
309+
$this->assertEquals($expectedLangsOverridden, $this->seoMeta->getAlternateLanguages());
310+
}
311+
312+
public function test_remove_alternate_language()
313+
{
314+
$fullHeader = "<title>It's Over 9000!</title>";
315+
$fullHeader .= "<meta name=\"description\" content=\"For those who helped create the Genki Dama\">";
316+
$lang = 'en';
317+
$langUrl = 'http://domain.com';
318+
319+
$expectedLangs = [['lang' => $lang, 'url' => false]];
320+
321+
$this->seoMeta->setAlternateLanguage($lang, $langUrl);
322+
$this->seoMeta->setAlternateLanguage($lang, false);
323+
$this->setRightAssertion($fullHeader);
324+
$this->assertEquals($expectedLangs, $this->seoMeta->getAlternateLanguages());
325+
}
326+
327+
public function test_remove_alternate_languages()
328+
{
329+
$fullHeader = "<title>It's Over 9000!</title>";
330+
$fullHeader .= "<meta name=\"description\" content=\"For those who helped create the Genki Dama\">";
331+
332+
$this->seoMeta->setAlternateLanguages([]);
333+
$this->setRightAssertion($fullHeader);
334+
$this->assertEquals([], $this->seoMeta->getAlternateLanguages());
335+
}
336+
273337
public function test_set_reset()
274338
{
275339
$expected = "<title>It's Over 9000!</title>";

0 commit comments

Comments
 (0)