Skip to content

Commit c0ca382

Browse files
authored
feat(altlang): utility for fetching all alternative languages on page (#580)
1 parent 48c0775 commit c0ca382

File tree

5 files changed

+194
-0
lines changed

5 files changed

+194
-0
lines changed
+135
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,137 @@
1+
<link rel="alternate" hreflang="en-us" href="https://www.ibm.com/us-en/">
2+
<link rel="alternate" hreflang="x-default" href="https://www.ibm.com">
3+
<link rel="alternate" hreflang="en-af" href="https://www.ibm.com/af-en">
4+
<link rel="alternate" hreflang="fr-dz" href="https://www.ibm.com/dz-fr">
5+
<link rel="alternate" hreflang="pt-ao" href="https://www.ibm.com/ao-pt">
6+
<link rel="alternate" hreflang="en-ai" href="https://www.ibm.com/ai-en">
7+
<link rel="alternate" hreflang="en-ag" href="https://www.ibm.com/ag-en">
8+
<link rel="alternate" hreflang="es-ar" href="https://www.ibm.com/ar-es">
9+
<link rel="alternate" hreflang="en-aw" href="https://www.ibm.com/aw-en">
10+
<link rel="alternate" hreflang="en-au" href="https://www.ibm.com/au-en">
11+
<link rel="alternate" hreflang="de-at" href="https://www.ibm.com/at-de">
12+
<link rel="alternate" hreflang="en-bs" href="https://www.ibm.com/bs-en">
13+
<link rel="alternate" hreflang="en-bh" href="https://www.ibm.com/bh-en">
14+
<link rel="alternate" hreflang="en-bd" href="https://www.ibm.com/bd-en">
15+
<link rel="alternate" hreflang="en-bb" href="https://www.ibm.com/bb-en">
16+
<link rel="alternate" hreflang="en-be" href="https://www.ibm.com/be-en">
17+
<link rel="alternate" hreflang="en-bm" href="https://www.ibm.com/bm-en">
18+
<link rel="alternate" hreflang="es-bo" href="https://www.ibm.com/bo-es">
19+
<link rel="alternate" hreflang="en-bw" href="https://www.ibm.com/bw-en">
20+
<link rel="alternate" hreflang="pt-br" href="https://www.ibm.com/br-pt">
21+
<link rel="alternate" hreflang="en-vg" href="https://www.ibm.com/vg-en">
22+
<link rel="alternate" hreflang="en-bn" href="https://www.ibm.com/bn-en">
23+
<link rel="alternate" hreflang="en-bg" href="https://www.ibm.com/bg-en">
24+
<link rel="alternate" hreflang="fr-bf" href="https://www.ibm.com/bf-fr">
25+
<link rel="alternate" hreflang="en-kh" href="https://www.ibm.com/kh-en">
26+
<link rel="alternate" hreflang="fr-cm" href="https://www.ibm.com/cm-fr">
27+
<link rel="alternate" hreflang="en-ca" href="https://www.ibm.com/ca-en">
28+
<link rel="alternate" hreflang="fr-ca" href="https://www.ibm.com/ca-fr">
29+
<link rel="alternate" hreflang="en-ky" href="https://www.ibm.com/ky-en">
30+
<link rel="alternate" hreflang="fr-td" href="https://www.ibm.com/td-fr">
31+
<link rel="alternate" hreflang="es-cl" href="https://www.ibm.com/cl-es">
32+
<link rel="alternate" hreflang="zh-cn" href="https://www.ibm.com/cn-zh">
33+
<link rel="alternate" hreflang="es-co" href="https://www.ibm.com/co-es">
34+
<link rel="alternate" hreflang="fr-cd" href="https://www.ibm.com/cd-fr">
35+
<link rel="alternate" hreflang="fr-cg" href="https://www.ibm.com/cg-fr">
36+
<link rel="alternate" hreflang="es-cr" href="https://www.ibm.com/cr-es">
37+
<link rel="alternate" hreflang="en-hr" href="https://www.ibm.com/hr-en">
38+
<link rel="alternate" hreflang="en-cw" href="https://www.ibm.com/cw-en">
39+
<link rel="alternate" hreflang="en-cy" href="https://www.ibm.com/cy-en">
40+
<link rel="alternate" hreflang="en-cz" href="https://www.ibm.com/cz-en">
41+
<link rel="alternate" hreflang="en-dm" href="https://www.ibm.com/dm-en">
42+
<link rel="alternate" hreflang="en-dk" href="https://www.ibm.com/dk-en">
43+
<link rel="alternate" hreflang="es-ec" href="https://www.ibm.com/ec-es">
44+
<link rel="alternate" hreflang="en-eg" href="https://www.ibm.com/eg-en">
45+
<link rel="alternate" hreflang="en-ee" href="https://www.ibm.com/ee-en">
46+
<link rel="alternate" hreflang="en-et" href="https://www.ibm.com/et-en">
47+
<link rel="alternate" hreflang="en-fi" href="https://www.ibm.com/fi-en">
48+
<link rel="alternate" hreflang="fr-fr" href="https://www.ibm.com/fr-fr">
49+
<link rel="alternate" hreflang="fr-ga" href="https://www.ibm.com/ga-fr">
50+
<link rel="alternate" hreflang="de-de" href="https://www.ibm.com/de-de">
51+
<link rel="alternate" hreflang="en-gh" href="https://www.ibm.com/gh-en">
52+
<link rel="alternate" hreflang="en-gr" href="https://www.ibm.com/gr-en">
53+
<link rel="alternate" hreflang="en-gd" href="https://www.ibm.com/gd-en">
54+
<link rel="alternate" hreflang="en-gy" href="https://www.ibm.com/gy-en">
55+
<link rel="alternate" hreflang="en-hk" href="https://www.ibm.com/hk-en">
56+
<link rel="alternate" hreflang="en-hu" href="https://www.ibm.com/hu-en">
57+
<link rel="alternate" hreflang="en-in" href="https://www.ibm.com/in-en">
58+
<link rel="alternate" hreflang="en-id" href="https://www.ibm.com/id-en">
59+
<link rel="alternate" hreflang="en-iq" href="https://www.ibm.com/iq-en">
60+
<link rel="alternate" hreflang="en-ie" href="https://www.ibm.com/ie-en">
61+
<link rel="alternate" hreflang="en-il" href="https://www.ibm.com/il-en">
62+
<link rel="alternate" hreflang="it-it" href="https://www.ibm.com/it-it">
63+
<link rel="alternate" hreflang="fr-ci" href="https://www.ibm.com/ci-fr">
64+
<link rel="alternate" hreflang="en-jm" href="https://www.ibm.com/jm-en">
65+
<link rel="alternate" hreflang="ja-jp" href="https://www.ibm.com/jp-ja">
66+
<link rel="alternate" hreflang="en-jo" href="https://www.ibm.com/jo-en">
67+
<link rel="alternate" hreflang="en-kz" href="https://www.ibm.com/kz-en">
68+
<link rel="alternate" hreflang="en-ke" href="https://www.ibm.com/ke-en">
69+
<link rel="alternate" hreflang="ko-kr" href="https://www.ibm.com/kr-ko">
70+
<link rel="alternate" hreflang="en-kw" href="https://www.ibm.com/kw-en">
71+
<link rel="alternate" hreflang="en-lv" href="https://www.ibm.com/lv-en">
72+
<link rel="alternate" hreflang="en-lb" href="https://www.ibm.com/lb-en">
73+
<link rel="alternate" hreflang="en-ly" href="https://www.ibm.com/ly-en">
74+
<link rel="alternate" hreflang="en-lt" href="https://www.ibm.com/lt-en">
75+
<link rel="alternate" hreflang="en-mw" href="https://www.ibm.com/mw-en">
76+
<link rel="alternate" hreflang="en-my" href="https://www.ibm.com/my-en">
77+
<link rel="alternate" hreflang="fr-mu" href="https://www.ibm.com/mu-fr">
78+
<link rel="alternate" hreflang="es-mx" href="https://www.ibm.com/mx-es">
79+
<link rel="alternate" hreflang="en-ms" href="https://www.ibm.com/ms-en">
80+
<link rel="alternate" hreflang="fr-ma" href="https://www.ibm.com/ma-fr">
81+
<link rel="alternate" hreflang="pt-mz" href="https://www.ibm.com/mz-pt">
82+
<link rel="alternate" hreflang="en-na" href="https://www.ibm.com/na-en">
83+
<link rel="alternate" hreflang="en-np" href="https://www.ibm.com/np-en">
84+
<link rel="alternate" hreflang="en-nl" href="https://www.ibm.com/nl-en">
85+
<link rel="alternate" hreflang="en-nz" href="https://www.ibm.com/nz-en">
86+
<link rel="alternate" hreflang="fr-ne" href="https://www.ibm.com/ne-fr">
87+
<link rel="alternate" hreflang="en-ng" href="https://www.ibm.com/ng-en">
88+
<link rel="alternate" hreflang="en-no" href="https://www.ibm.com/no-en">
89+
<link rel="alternate" hreflang="en-om" href="https://www.ibm.com/om-en">
90+
<link rel="alternate" hreflang="en-pk" href="https://www.ibm.com/pk-en">
91+
<link rel="alternate" hreflang="es-py" href="https://www.ibm.com/py-es">
92+
<link rel="alternate" hreflang="es-pe" href="https://www.ibm.com/pe-es">
93+
<link rel="alternate" hreflang="en-ph" href="https://www.ibm.com/ph-en">
94+
<link rel="alternate" hreflang="pl-pl" href="https://www.ibm.com/pl-pl">
95+
<link rel="alternate" hreflang="en-pt" href="https://www.ibm.com/pt-en">
96+
<link rel="alternate" hreflang="en-qa" href="https://www.ibm.com/qa-en">
97+
<link rel="alternate" hreflang="en-ro" href="https://www.ibm.com/ro-en">
98+
<link rel="alternate" hreflang="ru-ru" href="https://www.ibm.com/ru-ru">
99+
<link rel="alternate" hreflang="en-kn" href="https://www.ibm.com/kn-en">
100+
<link rel="alternate" hreflang="en-lc" href="https://www.ibm.com/lc-en">
101+
<link rel="alternate" hreflang="en-vc" href="https://www.ibm.com/vc-en">
102+
<link rel="alternate" hreflang="en-sa" href="https://www.ibm.com/sa-en">
103+
<link rel="alternate" hreflang="fr-sn" href="https://www.ibm.com/sn-fr">
104+
<link rel="alternate" hreflang="en-rs" href="https://www.ibm.com/rs-en">
105+
<link rel="alternate" hreflang="fr-sc" href="https://www.ibm.com/sc-fr">
106+
<link rel="alternate" hreflang="en-sl" href="https://www.ibm.com/sl-en">
107+
<link rel="alternate" hreflang="en-sg" href="https://www.ibm.com/sg-en">
108+
<link rel="alternate" hreflang="en-sk" href="https://www.ibm.com/sk-en">
109+
<link rel="alternate" hreflang="en-si" href="https://www.ibm.com/si-en">
110+
<link rel="alternate" hreflang="en-za" href="https://www.ibm.com/za-en">
111+
<link rel="alternate" hreflang="es-es" href="https://www.ibm.com/es-es">
112+
<link rel="alternate" hreflang="en-lk" href="https://www.ibm.com/lk-en">
113+
<link rel="alternate" hreflang="en-sr" href="https://www.ibm.com/sr-en">
114+
<link rel="alternate" hreflang="en-se" href="https://www.ibm.com/se-en">
115+
<link rel="alternate" hreflang="fr-ch" href="https://www.ibm.com/ch-fr">
116+
<link rel="alternate" hreflang="de-ch" href="https://www.ibm.com/ch-de">
117+
<link rel="alternate" hreflang="zh-tw" href="https://www.ibm.com/tw-zh">
118+
<link rel="alternate" hreflang="en-tz" href="https://www.ibm.com/tz-en">
119+
<link rel="alternate" hreflang="en-th" href="https://www.ibm.com/th-en">
120+
<link rel="alternate" hreflang="en-tt" href="https://www.ibm.com/tt-en">
121+
<link rel="alternate" hreflang="fr-tn" href="https://www.ibm.com/tn-fr">
122+
<link rel="alternate" hreflang="tr-tr" href="https://www.ibm.com/tr-tr">
123+
<link rel="alternate" hreflang="en-ye" href="https://www.ibm.com/ye-en">
124+
<link rel="alternate" hreflang="en-tc" href="https://www.ibm.com/tc-en">
125+
<link rel="alternate" hreflang="en-ua" href="https://www.ibm.com/ua-en">
126+
<link rel="alternate" hreflang="en-ug" href="https://www.ibm.com/ug-en">
127+
<link rel="alternate" hreflang="en-ae" href="https://www.ibm.com/ae-en">
128+
<link rel="alternate" hreflang="en-gb" href="https://www.ibm.com/uk-en">
129+
<link rel="alternate" hreflang="es-uy" href="https://www.ibm.com/uy-es">
130+
<link rel="alternate" hreflang="en-uz" href="https://www.ibm.com/uz-en">
131+
<link rel="alternate" hreflang="es-ve" href="https://www.ibm.com/ve-es">
132+
<link rel="alternate" hreflang="en-vn" href="https://www.ibm.com/vn-en">
133+
<link rel="alternate" hreflang="en-zm" href="https://www.ibm.com/zm-en">
134+
<link rel="alternate" hreflang="en-zw" href="https://www.ibm.com/zw-en">
135+
1136
<!-- IBM Tag Management and Site Analytics -->
2137
<script src="//1.www.s81c.com/common/stats/ibm-common.js"></script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { altlangs } from '../';
2+
3+
describe('alternative languages utility', () => {
4+
it('should get all available languages on the page', () => {
5+
document.body.innerHTML = `<link rel="alternate" hreflang="en-us" href="https://www.ibm.com/us-en/">
6+
<link rel="alternate" hreflang="x-default" href="https://www.ibm.com">
7+
<link rel="alternate" hreflang="en-af" href="https://www.ibm.com/af-en">
8+
<link rel="alternate" hreflang="fr-dz" href="https://www.ibm.com/dz-fr">
9+
<link rel="alternate" hreflang="pt-ao" href="https://www.ibm.com/ao-pt">`;
10+
11+
const output = altlangs();
12+
const expected = {
13+
'en-us': 'https://www.ibm.com/us-en/',
14+
'x-default': 'https://www.ibm.com',
15+
'en-af': 'https://www.ibm.com/af-en',
16+
'fr-dz': 'https://www.ibm.com/dz-fr',
17+
'pt-ao': 'https://www.ibm.com/ao-pt',
18+
};
19+
expect(output).toEqual(expected);
20+
});
21+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import root from 'window-or-global';
2+
3+
/**
4+
* Utility to grab all alternative languages on the page. this scrapes the page
5+
* of all <link rel="alternate" hreflang="" href="" /> elements and returns
6+
* as a readable object
7+
*
8+
* @example
9+
* import { altlangs } from '@carbon/ibmdotcom-utilities';
10+
*
11+
* const langs = altlangs();
12+
*
13+
* console.log(langs); // { 'us-en': 'https://www.ibm.com/us-en', ... }
14+
*
15+
* @returns {object} object of available languages and corresponding URLs
16+
*
17+
*/
18+
function altlangs() {
19+
const links = root.document.querySelectorAll('link[rel="alternate"]');
20+
const langs = {};
21+
22+
links.forEach(link => {
23+
langs[link.getAttribute('hreflang')] = link.getAttribute('href');
24+
});
25+
26+
return langs;
27+
}
28+
29+
export default altlangs;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* Copyright IBM Corp. 2016, 2018
3+
*
4+
* This source code is licensed under the Apache-2.0 license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
export { default as altlangs } from './altlangs';

packages/utilities/src/utilities/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
export * from './altlangs';
89
export * from './escaperegexp';
910
export * from './featureflag';
1011
export * from './geolocation';

0 commit comments

Comments
 (0)