PageSourceSearch

https://hdsoft.fi/projektit/ai-universal-search/

html hdsoft.fi collected 2026-10-02 00:35:41 UTC 105,035 bytes, 728 lines download raw bytes

1<!DOCTYPE html>
2<html lang="fi-FI" dir="ltr">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1">
6<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
7<!-- HD SofT — Consent Mode v2 -oletukset (kaikki ei-välttämätön estetty) -->
8<script id="hdsoft-consent-default">
9window.dataLayer = window.dataLayer || [];
10function gtag(){dataLayer.push(arguments);}
11gtag('consent', 'default', {
12  ad_storage: 'denied',
13  ad_user_data: 'denied',
14  ad_personalization: 'denied',
15  analytics_storage: 'denied',
16  functionality_storage: 'denied',
17  personalization_storage: 'denied',
18  security_storage: 'granted',
19  wait_for_update: 500
20});
21gtag('set', 'ads_data_redaction', true);
22gtag('set', 'url_passthrough', false);
23</script>
23
24
25	<!-- This site is optimized with the Yoast SEO plugin v28.3 - https://yoast.com/product/yoast-seo-wordpress/ -->
26	<title>AI Universal Search for Odoo | HD SofT</title>
27	<meta name="description" content="AI Universal Search for Odoo — HD SofT:n AI-haku Odoo-järjestelmään. Löydä asiakkaat, tilaukset ja tuotteet luonnollisella kielellä." />
28	<link rel="canonical" href="https://hdsoft.fi/projektit/ai-universal-search/" />
29	<meta property="og:locale" content="fi_FI" />
30	<meta property="og:type" content="website" />
31	<meta property="og:title" content="AI Universal Search for Odoo" />
32	<meta property="og:description" content="AI Universal Search for Odoo — HD SofT:n AI-haku Odoo-järjestelmään. Löydä asiakkaat, tilaukset ja tuotteet luonnollisella kielellä." />
33	<meta property="og:url" content="https://hdsoft.fi/projektit/ai-universal-search/" />
34	<meta property="og:site_name" content="HD SofT Oy" />
35	<meta property="article:modified_time" content="2026-07-30T18:16:39+00:00" />
36	<meta name="twitter:card" content="summary_large_image" />
37	<meta name="twitter:title" content="AI Universal Search for Odoo" />
38	<meta name="twitter:description" content="AI Universal Search for Odoo — HD SofT:n AI-haku Odoo-järjestelmään. Löydä asiakkaat, tilaukset ja tuotteet luonnollisella kielellä." />
39	<meta name="twitter:image" content="https://hdsoft.fi/wp-content/uploads/2026/05/hdsoft-og-banner.png" />
40	
40<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/hdsoft.fi\/projektit\/ai-universal-search\/","url":"https:\/\/hdsoft.fi\/projektit\/ai-universal-search\/","name":"AI Universal Search for Odoo | HD SofT","isPartOf":{"@id":"https:\/\/hdsoft.fi\/#website"},"datePublished":"2026-05-02T18:27:10+00:00","dateModified":"2026-07-30T18:16:39+00:00","description":"AI Universal Search for Odoo — HD SofT:n AI-haku Odoo-järjestelmään. Löydä asiakkaat, tilaukset ja tuotteet luonnollisella kielellä.","breadcrumb":{"@id":"https:\/\/hdsoft.fi\/projektit\/ai-universal-search\/#breadcrumb"},"inLanguage":"fi-FI","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hdsoft.fi\/projektit\/ai-universal-search\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/hdsoft.fi\/projektit\/ai-universal-search\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hdsoft.fi\/"},{"@type":"ListItem","position":2,"name":"Projektit","item":"https:\/\/hdsoft.fi\/projektit\/"},{"@type":"ListItem","position":3,"name":"AI Universal Search for Odoo"}]},{"@type":"WebSite","@id":"https:\/\/hdsoft.fi\/#website","url":"https:\/\/hdsoft.fi\/","name":"HD SofT Oy","description":"Älykkäät ratkaisut huomisen tarpeisiin","publisher":{"@id":"https:\/\/hdsoft.fi\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hdsoft.fi\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fi-FI"},{"@type":"Organization","@id":"https:\/\/hdsoft.fi\/#organization","name":"HD SofT Oy","alternateName":"HD SofT","url":"https:\/\/hdsoft.fi\/","logo":{"@type":"ImageObject","inLanguage":"fi-FI","@id":"https:\/\/hdsoft.fi\/#\/schema\/logo\/image\/","url":"https:\/\/hdsoft.fi\/wp-content\/uploads\/2026\/04\/HD-SofT-logo.webp","contentUrl":"https:\/\/hdsoft.fi\/wp-content\/uploads\/2026\/04\/HD-SofT-logo.webp","width":500,"height":500,"caption":"HD SofT Oy"},"image":{"@id":"https:\/\/hdsoft.fi\/#\/schema\/logo\/image\/"}}]}</script>
40
41	<!-- / Yoast SEO plugin. -->
42
43
44<link rel='dns-prefetch' href='//fonts.googleapis.com' />
45<link rel="alternate" type="application/rss+xml" title="HD SofT Oy &raquo; Feed" href="https://hdsoft.fi/feed/" />
46<link rel="alternate" type="application/rss+xml" title="HD SofT Oy &raquo; Comments Feed" href="https://hdsoft.fi/comments/feed/" />
47<meta property="og:image" content="https://hdsoft.fi/wp-content/uploads/2026/05/hdsoft-og-banner.png" />
48<meta property="og:image:width" content="1200" />
49<meta property="og:image:height" content="630" />
50
51<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://hdsoft.fi/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fhdsoft.fi%2Fprojektit%2Fai-universal-search%2F" />
52<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://hdsoft.fi/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fhdsoft.fi%2Fprojektit%2Fai-universal-search%2F&#038;format=xml" />
53<!-- Bing Webmaster verification -->
54<meta name="msvalidate.01" content="7399B9B2448E67D1FBA3C66629A03471" />
55<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin><style id="wp-img-auto-sizes-contain-inline-css">
56img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
57/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
58</style>
59<style id="wp-emoji-styles-inline-css">
60
61	img.wp-smiley, img.emoji {
62		display: inline !important;
63		border: none !important;
64		box-shadow: none !important;
65		height: 1em !important;
66		width: 1em !important;
67		margin: 0 0.07em !important;
68		vertical-align: -0.1em !important;
69		background: none !important;
70		padding: 0 !important;
71	}
72/*# sourceURL=wp-emoji-styles-inline-css */
73</style>
74<style id="classic-theme-styles-inline-css">
75/*! This file is auto-generated */
76.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
77/*# sourceURL=/wp-includes/css/classic-themes.min.css */
78</style>
79
80<style id="global-styles-inline-css">
81:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
81--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
81.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
82/*# sourceURL=global-styles-inline-css */
83</style>
84
85<link rel='stylesheet' id='bricks-frontend-css' href='https://hdsoft.fi/wp-content/themes/bricks/assets/css/frontend-layer.min.css?ver=1785440761' media='all' />
86<style id="bricks-frontend-inline-css">
87body .tox.tox-silver-sink.tox-tinymce-aux, body .tox.tox-tinymce-aux, body .tox-shadowhost { z-index: 10001; }
88/*# sourceURL=bricks-frontend-inline-css */
89</style>
90<link rel='stylesheet' id='bricks-style-manager-css' href='https://hdsoft.fi/wp-content/uploads/bricks/css/style-manager.min.css?ver=1777736595' media='all' />
91<style id="bricks-frontend-inline-inline-css">
92:root {--brxw-max-screen-width: 1440px;--brxw-min-screen-width: 320px;--brxw-card-title-size: var(--brxw-text-l);--brxw-text-width-s: 20ch;--brxw-text-width-m: 45ch;--brxw-title-width-s: 20ch;--brxw-text-width-l: 65ch;--brxw-title-width-m: 25ch;--brxw-title-width-l: 35ch;--brxw-line-height-body: calc(8px + 2ex);--brxw-line-height-heading: calc(6px + 2ex);--brxw-container-gap: var(--brxw-space-3xl);--brxw-grid-gap: var(--brxw-space-l);--brxw-content-gap: var(--brxw-space-m);--brxw-section-space-horizontal: var(--brxw-space-m);--brxw-section-space-vertical: var(--brxw-space-3xl);--brxw-grid-1: minmax(0,1fr);--brxw-grid-2: repeat(2, minmax(0, 1fr));--brxw-grid-3: repeat(3, minmax(0, 1fr));--brxw-grid-4: repeat(4, minmax(0, 1fr));--brxw-grid-5: repeat(5, minmax(0, 1fr));--brxw-grid-6: repeat(6, minmax(0, 1fr));--brxw-grid-7: repeat(7, minmax(0, 1fr));--brxw-grid-8: repeat(8, minmax(0, 1fr));--brxw-grid-9: repeat(9, minmax(0, 1fr));--brxw-grid-10: repeat(10, minmax(0, 1fr));--brxw-grid-11: repeat(11, minmax(0, 1fr));--brxw-grid-12: repeat(12, minmax(0, 1fr));--brxw-grid-1-2: minmax(0, 1fr) minmax(0, 2fr);--brxw-grid-1-3: minmax(0, 1fr) minmax(0, 3fr);--brxw-grid-1-4: minmax(0, 1fr) minmax(0, 4fr);--brxw-grid-2-1: minmax(0, 2fr) minmax(0, 1fr);--brxw-grid-4-1: minmax(0, 4fr) minmax(0, 1fr);--brxw-grid-2-3: minmax(0, 2fr) minmax(0, 3fr);--brxw-grid-3-1: minmax(0, 3fr) minmax(0, 1fr);--brxw-grid-3-2: minmax(0, 3fr) minmax(0, 2fr);--brxw-container-width: 140rem;--brxw-width-10: 10rem;--brxw-width-20: 20rem;--brxw-width-30: 30rem;--brxw-width-40: 40rem;--brxw-width-50: 50rem;--brxw-width-70: 70rem;--brxw-width-60: 60rem;--brxw-width-80: 80rem;--brxw-width-90: 90rem;--brxw-width-100: 100rem;--brxw-width-110: 110rem;--brxw-width-120: 120rem;--brxw-width-130: 130rem;--brxw-width-140: 140rem;--brxw-screen-height: 100vh;--brxw-screen-width: 100vw;--brxw-radius-xs: clamp(0.4rem, calc(0vw + 0.4rem), 0.4rem);--brxw-radius-s: clamp(0.6rem, calc(-0.18vw + 0.86rem), 0.8rem);--brxw-radius-m: clamp(1rem, calc(-0.18vw + 1.26rem), 1.2rem);--brxw-radius-l: clamp(1.6rem, calc(-0.36vw + 2.11rem), 2rem);--brxw-radius-xl: clamp(2.4rem, calc(-0.71vw + 3.43rem), 3.2rem);--brxw-radius-full: 1e5px;--brxw-shadow-xs: 0 1px 2px var(--shadow-primary);--brxw-shadow-s: 0 1.5px 3px var(--shadow-primary);--brxw-shadow-m: 0 2px 6px var(--shadow-primary);--brxw-shadow-l: 0 3px 12px var(--shadow-primary);--brxw-shadow-xl: 0 6px 48px var(--shadow-primary);--brxw-ratio-square: 1;--brxw-ratio-landscape: 4/3;--brxw-ratio-portrait: 3/4;--brxw-ratio-classic: 3/2;--brxw-ratio-classic-portrait: 2/3;--brxw-ratio-widescreen: 16/9;--brxw-ratio-ultrawide: 18/5;--brxw-ratio-golden: 1.6180/1;--brxw-ratio-default: var(--brxw-ratio-landscape);--brxw-transition-s: .2s;--brxw-transition-m: .35s;--brxw-transition-l: .5s;
92--brxw-color-neutral-25: hsla(0, 0%, 94.9%, 1);--brxw-color-neutral-50: hsla(0, 0%, 87.45%, 1);--brxw-color-neutral-100: hsla(0, 0%, 79.61%, 1);--brxw-color-neutral-200: hsla(0, 0%, 71.76%, 1);--brxw-color-neutral-300: hsla(0, 0%, 64.31%, 1);--brxw-color-neutral-400: hsla(0, 0%, 56.47%, 1);--brxw-color-neutral-500: hsla(0, 0%, 48.63%, 1);--brxw-color-neutral-600: hsla(0, 0%, 40.78%, 1);--brxw-color-neutral-700: hsla(0, 0%, 32.94%, 1);--brxw-color-neutral-800: hsla(0, 0%, 25.49%, 1);--brxw-color-neutral-900: hsla(0, 0%, 18.04%, 1);--brxw-color-neutral-950: hsla(0, 0%, 10.98%, 1);--brxw-color-neutral-trans-10: hsla(0, 0%, 10.98%, 0.1);--brxw-color-neutral-trans-20: hsla(0, 0%, 10.98%, 0.2);--brxw-color-neutral-trans-30: hsla(0, 0%, 10.98%, 0.3);--brxw-color-neutral-trans-40: hsla(0, 0%, 10.98%, 0.4);--brxw-color-neutral-trans-50: hsla(0, 0%, 10.98%, 0.5);--brxw-color-neutral-trans-60: hsla(0, 0%, 10.98%, 0.6);--brxw-color-neutral-trans-70: hsla(0, 0%, 10.98%, 0.7);--brxw-color-neutral-trans-80: hsla(0, 0%, 10.98%, 0.8);--brxw-color-neutral-trans-90: hsla(0, 0%, 10.98%, 0.9);--brxw-color-overlay: hsla(0, 0%, 10.98%, 0.5);--brxw-text-xs: var(--brxw-text-fluid-xs);--brxw-text-s: var(--brxw-text-fluid-s);--brxw-text-m: var(--brxw-text-fluid-m);--brxw-text-l: var(--brxw-text-fluid-l);--brxw-text-xl: var(--brxw-text-fluid-xl);--brxw-text-2xl: var(--brxw-text-fluid-2xl);--brxw-text-3xl: var(--brxw-text-fluid-3xl);--brxw-text-4xl: var(--brxw-text-fluid-4xl);--brxw-text-5xl: var(--brxw-text-fluid-5xl);--brxw-space-3xs: var(--brxw-space-fluid-3xs);--brxw-space-2xs: var(--brxw-space-fluid-2xs);--brxw-space-xs: var(--brxw-space-fluid-xs);--brxw-space-s: var(--brxw-space-fluid-s);--brxw-space-m: var(--brxw-space-fluid-m);--brxw-space-l: var(--brxw-space-fluid-l);--brxw-space-xl: var(--brxw-space-fluid-xl);--brxw-space-2xl: var(--brxw-space-fluid-2xl);--brxw-space-3xl: var(--brxw-space-fluid-3xl);--brxw-space-4xl: var(--brxw-space-fluid-4xl);--brxw-space-5xl: var(--brxw-space-fluid-5xl);--brxw-text-fluid-xs: clamp(1.02rem, calc(-0.00010427528675703867 * (100vw - 32rem) + 1.02rem), 1.01rem);--brxw-text-fluid-s: clamp(1.28rem, calc(0.0007299270072992707 * (100vw - 32rem) + 1.28rem), 1.35rem);--brxw-text-fluid-m: clamp(1.6rem, calc(0.0020855057351407713 * (100vw - 32rem) + 1.6rem), 1.8rem);--brxw-text-fluid-l: clamp(2rem, calc(0.0041710114702815425 * (100vw - 32rem) + 2rem), 2.4rem);--brxw-text-fluid-xl: clamp(2.5rem, calc(0.007299270072992702 * (100vw - 32rem) + 2.5rem), 3.2rem);--brxw-text-fluid-2xl: clamp(3.13rem, calc(0.011783107403545358 * (100vw - 32rem) + 3.13rem), 4.26rem);--brxw-text-fluid-3xl: clamp(3.91rem, calc(0.018456725755995825 * (100vw - 32rem) + 3.91rem), 5.68rem);--brxw-text-fluid-4xl: clamp(4.88rem, calc(0.028154327424400417 * (100vw - 32rem) + 4.88rem), 7.58rem);--brxw-text-fluid-5xl: clamp(6.1rem, calc(0.04171011470281543 * (100vw - 32rem) + 6.1rem), 10.1rem);--brxw-space-fluid-3xs: clamp(0.66rem, calc(-0.0002678571428571431 * (100vw - 32rem) + 0.66rem), 0.63rem);--brxw-space-fluid-2xs: clamp(0.82rem, calc(0.00017857142857142873 * (100vw - 32rem) + 0.82rem), 0.84rem);--brxw-space-fluid-xs: clamp(1.02rem, calc(0.0009821428571428561 * (100vw - 32rem) + 1.02rem), 1.13rem);--brxw-space-fluid-s: clamp(1.28rem, calc(0.001964285714285714 * (100vw - 32rem) + 1.28rem), 1.5rem);--brxw-space-fluid-m: clamp(1.6rem, calc(0.0035714285714285704 * (100vw - 32rem) + 1.6rem), 2rem);--brxw-space-fluid-l: clamp(2rem, calc(0.005982142857142857 * (100vw - 32rem) + 2rem), 2.67rem);--brxw-space-fluid-xl: clamp(2.5rem, calc(0.009374999999999998 * (100vw - 32rem) + 2.5rem), 3.55rem);--brxw-space-fluid-2xl: clamp(3.13rem, calc(0.014375000000000002 * (100vw - 32rem) + 3.13rem), 4.74rem);--brxw-space-fluid-3xl: clamp(3.91rem, calc(0.021428571428571425 * (100vw - 32rem) + 3.91rem), 6.31rem);--brxw-space-fluid-4xl: clamp(4.88rem, calc(0.031607142857142854 * (100vw - 32rem) + 4.88rem), 8.42rem);--brxw-space-fluid-5xl: clamp(6.1rem, calc(0.04571428571428572 * (100vw - 32rem) + 6.1rem), 11.22rem);--min-viewport: 360;--max-viewport: 1600;--base-font: 10;--clamp-unit: 1vw;}.brxe-block.stack-m { display: flex; flex-direction: column; gap: var(--brxw-content-gap); }.brxe-block.stack-m.center { align-items: center; text-align: center; }.brxe-block.stack-s { display: flex; flex-direction: column; gap: var(--brxw-space-xs); }.brxe-block.card-content { flex-grow: 1; }.brxe-block.card-content > .brxe-text-link:last-child { margin-top: auto; }
92.brxe-heading { overflow-wrap: anywhere; hyphens: auto; }.brxe-text a, .brxe-text-basic a, .brxe-rich-text a { color: var(--primary); text-decoration: underline; }main table { border-collapse: collapse; margin: 1.5em 0; width: 100%; }main table th, main table td { border: 1px solid #ddd; padding: 0.5rem 0.75rem; text-align: left; vertical-align: top; }main table th { background-color: var(--light); font-weight: 600; }main table tr:nth-child(even) td { background-color: #fafafa; }.hdsoft-langswitch { margin-left: var(--brxw-space-s); }@media (max-width: 991px) { .hdsoft-langswitch { margin-left: auto; margin-right: var(--brxw-space-s); order: 1; flex-shrink: 0; } .hdsoft-langswitch__current { white-space: nowrap; } .brxw-header-01__inner { flex-wrap: wrap; gap: var(--brxw-space-s); }}@media (min-width: 992px) {  .brxw-header-01__inner.brxe-container { position: relative; flex-direction: column !important; align-items: center !important; gap: var(--brxw-space-s); } .hdsoft-langswitch { position: absolute !important; top: var(--brxw-space-s); right: var(--brxw-space-m); margin: 0; } .brxw-header-01__logo .bricks-site-logo { height: var(--brxw-space-2xl); width: auto; }}.hdsoft-langswitch { position: relative; }.hdsoft-langswitch__current { display: inline-flex; align-items: center; gap: var(--brxw-space-3xs); padding: var(--brxw-space-3xs) var(--brxw-space-xs); border: 1px solid var(--brxw-color-neutral-300); border-radius: var(--brxw-radius-s); background: #fff; color: var(--dark); font-size: var(--brxw-text-s); line-height: 1.2; cursor: pointer;}.hdsoft-langswitch__current:hover { border-color: var(--primary); color: var(--primary); }.hdsoft-langswitch__menu { position: absolute; top: calc(100% + var(--brxw-space-3xs)); right: 0; z-index: 100; min-width: 16rem; max-height: 60vh; overflow-y: auto; margin: 0; padding: var(--brxw-space-3xs) 0; list-style: none; background: #fff; border: 1px solid var(--brxw-color-neutral-300); border-radius: var(--brxw-radius-s);  box-shadow: 0 2px 6px var(--brxw-color-neutral-trans-20);}.hdsoft-langswitch__menu[hidden] { display: none; }.hdsoft-langswitch__menu li { margin: 0; list-style: none; }.hdsoft-langswitch__menu a { display: block; padding: var(--brxw-space-3xs) var(--brxw-space-xs); color: var(--dark); font-size: var(--brxw-text-s); text-decoration: none; white-space: nowrap;}.hdsoft-langswitch__menu a:hover { background: var(--light); color: var(--primary); }.hdsoft-langswitch__menu a[aria-current="true"] { font-weight: 600; color: var(--primary); }[dir="rtl"] .hdsoft-langswitch__menu { right: auto; left: 0; } body {font-family: "Inter"} h1, h2, h3, h4, h5, h6 {font-family: "Montserrat"; font-weight: 600} h5 {font-family: "Montserrat"; font-weight: 600} .brxe-section {padding-right: var(--brxw-section-space-horizontal); padding-left: var(--brxw-section-space-horizontal)}.brxw-header-01.brxe-section {padding-top: var(--brxw-space-m); padding-bottom: var(--brxw-space-m); background-color: var(--brxw-color-neutral-100)}.brxw-header-01__inner.brxe-container {flex-direction: row; justify-content: space-between; align-items: center}.brxw-header-01__logo.brxe-logo .bricks-site-logo {height: var(--brxw-space-xl); width: auto}.brxw-header-01__nav-menu.brxe-nav-menu .bricks-nav-menu > li {margin-left: 0}.brxw-header-01__nav-menu.brxe-nav-menu .bricks-nav-menu {gap: var(--brxw-content-gap)}.brxw-header-01__nav-menu .bricks-nav-menu { align-items: center;}.brxw-footer-03.brxe-section {background-color: var(--brxw-color-neutral-100); overflow: hidden}.brxw-footer-03__inner-top.brxe-container {display: grid; align-items: initial; grid-gap: var(--brxw-grid-gap); grid-template-columns: var(--brxw-grid-2-3)}@media (max-width: 991px) {.brxw-footer-03__inner-top.brxe-container {grid-template-columns: var(--brxw-grid-1)}}.brxw-footer-03__content-wrapper.brxe-block {row-gap: var(--brxw-content-gap)}.brxw-footer-03__logo.brxe-logo .bricks-site-logo {height: var(--brxw-space-l); width: auto}.brxw-footer-03__nav-row.brxe-block {display: flex; flex-direction: row; justify-content: space-between; column-gap: var(--brxw-grid-gap); row-gap: var(--brxw-grid-gap)}@media (max-width: 767px) {.brxw-footer-03__nav-row.brxe-block {grid-template-columns: var(--brxw-grid-2)}}@media (max-width: 478px) {.brxw-footer-03__nav-row.brxe-block {grid-template-columns: var(--brxw-grid-1)}}.brxw-footer-03__nav-col.brxe-div {row-gap: var(--brxw-content-gap); display: flex; flex-direction: column}.brxw-footer-03__title.brxe-text-basic {font-size: var(--brxw-text-l); font-weight: 700}.brxw-footer-03__nav-menu.brxe-nav-menu .bricks-nav-menu > li {margin-left: 0}.brxw-footer-03__nav-menu.brxe-nav-menu .bricks-nav-menu {flex-direction: column; gap: calc(var(--brxw-content-gap) / 2)}:root {--bricks-color-grey-100: #f5f5f5;--bricks-color-grey-300: #e0e0e0;--bricks-color-grey-500: #9e9e9e;--bricks-color-grey-700: #616161;--bricks-color-grey-800: #424242;--bricks-color-grey-900: #212121;--bricks-color-yellow: #ffeb3b;--bricks-color-amber: #ffc107;--bricks-color-orange: #ff9800;--bricks-color-deep-orange: #ff5722;--bricks-color-red: #f44336;--bricks-color-purple: #9c27b0;--bricks-color-blue: #2196f3;--bricks-color-light-blue: #03a9f4;--bricks-color-sky-blue: #81D4FA;--bricks-color-green: #4caf50;--bricks-color-light-green: #8bc34a;--bricks-color-lime: #cddc39;--primary: #1684B8;--secondary: #14A5DC;--light: #F5F5F5;--dark: #58585A;--accent: #F4BA6C;}#brxe-sbcdfo {max-width: 100%}@layer bricks {@media (max-width: 767px) {#brxe-e42f6f .bricks-nav-menu-wrapper { display: none; }#brxe-e42f6f .bricks-mobile-menu-toggle { display: block; }}}#brxe-e42f6f {color: hsl(0, 0%, 100%)}#brxe-855f88 {background-image: url("https://hdsoft.fi/wp-content/uploads/2026/05/HD-SofT-Oy-1024x256.png"); background-size: cover}#brxe-eswzva {width: 100%}#brxe-ywfsal {padding-top: var(--brxw-section-space-vertical); padding-right: var(--brxw-section-space-horizontal); padding-bottom: var(--brxw-section-space-vertical); padding-left: var(--brxw-section-space-horizontal)}#brxe-sjqrsu {width: 100%}#brxe-fdfjdg {padding-top: var(--brxw-section-space-vertical); padding-right: var(--brxw-section-space-horizontal); padding-bottom: var(--brxw-section-space-vertical); padding-left: var(--brxw-section-space-horizontal); background-color: var(--light)}#brxe-iqelve {color: #FFFFFF}#brxe-lumyuc {color: #FFFFFF}#brxe-lumyuc a {color: #FFFFFF; font-size: inherit}#brxe-gwrtua {width: 100%}#brxe-nalwvs {padding-top: var(--brxw-section-space-vertical); padding-right: var(--brxw-section-space-horizontal); padding-bottom: var(--brxw-section-space-vertical); padding-left: var(--brxw-section-space-horizontal); background-color: var(--primary)}#brxe-e1b676 {padding-left: 1px}#brxe-3f865c {color: hsl(0, 0%, 100%); padding-top: 20px}#brxe-eeaced {background-color: #000000; padding-top: 0} .brxe-text a, .brxe-text-basic a, .brxe-rich-text a { color: var(--primary); text-decoration: underline; }
93/*# sourceURL=bricks-frontend-inline-inline-css */
94</style>
95<link rel='stylesheet' id='bricks-google-fonts-css' href='https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&#038;display=swap&#038;family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&#038;display=swap' media='all' />
96<script id="bricks-dl-mode-js-after">
97(function() {
98				let savedTheme = localStorage.getItem("brx_mode");
99				let defaultMode = "light";
100				let currentTheme = savedTheme || defaultMode;
101
102				if (currentTheme === "auto") {
103					let prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)").matches;
104						document.documentElement.dataset.brxTheme = prefersDarkScheme ? "dark" : "light";
105				} else {
106					document.documentElement.dataset.brxTheme = currentTheme;
107				}
108		})();
109//# sourceURL=bricks-dl-mode-js-after
110</script>
110
111<link rel="https://api.w.org/" href="https://hdsoft.fi/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://hdsoft.fi/wp-json/wp/v2/pages/204" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://hdsoft.fi/xmlrpc.php?rsd" />
112<meta name="generator" content="WordPress 7.1.2" />
113<link rel='shortlink' href='https://hdsoft.fi/?p=204' />
114<!-- HD SofT — evästebanneri (Silktide Consent Manager, MIT) -->
115<link rel="stylesheet" href="/wp-content/mu-plugins/consent/silktide-consent-manager.css?v=1790664887">
116<link rel="stylesheet" href="/wp-content/mu-plugins/consent/hdsoft-consent-theme.css?v=1790664887">
117<script src="/wp-content/mu-plugins/consent/silktide-consent-manager.js?v=1790664887"></script>
vendor: 1 bytes, line 117
117
118<script id="hdsoft-consent-init">
119(function(){
120  if (!window.silktideConsentManager) return;
121  var CFG = {"consentTypes":[{"id":"essential","label":"Välttämättömät","description":"Tarvitaan sivuston toimintaan, esimerkiksi evästevalintasi muistamiseen. Näitä ei voi kytkeä pois.","required":true},{"id":"analytics","label":"Analytiikka","description":"Google Analytics kertoo, mitkä sivut kiinnostavat ja mistä kävijät tulevat. Tiedot ovat tilastollisia.","defaultValue":false,"gtag":"analytics_storage","scripts":[{"url":"https://www.googletagmanager.com/gtag/js?id=G-1B5T8EHNHR","load":"async"}]},{"id":"marketing","label":"Markkinointi ja liidit","description":"Lead Feeder tunnistaa vierailevan yrityksen IP-osoitteen perusteella, jotta voimme ottaa yhteyttä kiinnostuneisiin yrityksiin.","defaultValue":false,"gtag":["ad_storage","ad_user_data","ad_personalization"],"scripts":[{"url":"https://sc.lfeeder.com/lftracker_v1_kn9Eq4RqOw07RlvP.js","load":"async"}]}],"text":{"prompt":{"description":"<p>Käytämme evästeitä sivuston käytön mittaamiseen ja kävijäyritysten tunnistamiseen. Välttämättömät evästeet ovat aina käytössä, muut vain suostumuksellasi.</p>","acceptAllButtonText":"Hyväksy kaikki","acceptAllButtonAccessibleLabel":"Hyväksy kaikki","rejectNonEssentialButtonText":"Vain välttämättömät","rejectNonEssentialButtonAccessibleLabel":"Vain välttämättömät","preferencesButtonText":"Asetukset","preferencesButtonAccessibleLabel":"Evästeasetukset"},"preferences":{"title":"Evästeasetukset","description":"<p>Valitse, mitä evästeitä sivusto saa käyttää. Voit muuttaa valintaa milloin tahansa sivun alakulmassa olevasta kuvakkeesta.</p>","saveButtonText":"Tallenna valinnat","saveButtonAccessibleLabel":"Tallenna valinnat"}},"prompt":{"position":"bottomLeft"},"icon":{"position":"bottomLeft"},"backdrop":{"show":false}};
122  var GA4 = "G-1B5T8EHNHR";
123  var IS404 = false;
124
125  // Suostumuksen peruminen ei saa jättää vanhoja evästeitä koneelle.
126  // Consent Mode estää niiden KÄYTÖN, mutta jäljelle jäävä _ga on silti
127  // tallennettua dataa, jolle ei enää ole perustetta. Silktide ei siivoa
128  // evästeitä itse — se osaa vain injektoida skriptejä, ei perua niiden
129  // sivuvaikutuksia.
130  //
131  // Poisto vaatii saman domainin ja polun kuin asetus. Emme tiedä kumpi
132  // varianttia kauppa käytti, joten kokeillaan kaikki: host, .host ja
133  // rekisteröitävä domain.
134  function forget(names, storageKeys){
135    var host = location.hostname;
136    var parts = host.split('.');
137    var domains = ['', host, '.' + host];
138    if (parts.length > 2) {
139      var root = parts.slice(-2).join('.');
140      domains.push(root, '.' + root);
141    }
142    names.forEach(function(name){
143      document.cookie.split(';').forEach(function(c){
144        var n = c.trim().split('=')[0];
145        if (n !== name && n.indexOf(name) !== 0) return;
146        domains.forEach(function(d){
147          document.cookie = n + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/'
148            + (d ? '; domain=' + d : '');
149        });
150      });
151    });
152    (storageKeys || []).forEach(function(k){
153      try { localStorage.removeItem(k); } catch(e){}
154    });
155  }
156
157  // GA4:n käynnistys ajetaan vasta kun analytiikka on hyväksytty. Silktide on
158  // jo injektoinut gtag.js:n tässä vaiheessa, mutta järjestyksellä ei ole väliä:
159  // gtag-kutsut jonottavat dataLayerissa kunnes skripti latautuu.
160  CFG.consentTypes[1].onAccept = function(){
161    if (!GA4) return;
162    gtag('js', new Date());
163    gtag('config', GA4);
164    if (IS404) {
165      gtag('event', 'page_not_found', {
166        page_location: window.location.href,
167        page_referrer: document.referrer || '(direct)',
168        page_path: window.location.pathname
169      });
170    }
171  };
172
173  // Analytiikan peruminen: GA4:n omat evästeet pois. Nimet ovat
174  // `_ga`, `_ga_<mittaustunnus>` sekä vanhemmat `_gid` ja `_gat`.
175  CFG.consentTypes[1].onReject = function(){
176    forget(['_ga', '_gid', '_gat']);
177  };
178
179  // Lead Feederin oma snippet määrittelee jonofunktion ennen skriptin latausta.
180  // Skriptin lataa Silktide; tässä vain jono, jotta varhaiset kutsut eivät katoa.
181  CFG.consentTypes[2].onAccept = function(){
182    window.ldfdr = window.ldfdr || function(){
183      (ldfdr._q = ldfdr._q || []).push([].slice.call(arguments));
184    };
185  };
186
187  // Lead Feeder tallentaa sekä evästeen että localStorage-avaimet.
188  CFG.consentTypes[2].onReject = function(){
189    forget(['_lfa'], ['_lfa', '_lfa_expiry']);
190  };
191
192  window.silktideConsentManager.init(CFG);
193})();
194</script>
194
195<link rel="icon" href="https://hdsoft.fi/wp-content/uploads/2026/04/HD-SofT-logo-150x150.webp" sizes="32x32" />
196<link rel="icon" href="https://hdsoft.fi/wp-content/uploads/2026/04/HD-SofT-logo-300x300.webp" sizes="192x192" />
197<link rel="apple-touch-icon" href="https://hdsoft.fi/wp-content/uploads/2026/04/HD-SofT-logo-300x300.webp" />
198<meta name="msapplication-TileImage" content="https://hdsoft.fi/wp-content/uploads/2026/04/HD-SofT-logo-300x300.webp" />
199
200<script type="application/ld+json">
201{
202    "@context": "https://schema.org",
203    "@type": "CreativeWork",
204    "@id": "https://hdsoft.fi/projektit/ai-universal-search/#project",
205    "name": "AI Universal Search for Odoo",
206    "description": "AI Universal Search for Odoo — HD SofT:n AI-haku Odoo-järjestelmään. Löydä asiakkaat, tilaukset ja tuotteet luonnollisella kielellä.",
207    "url": "https://hdsoft.fi/projektit/ai-universal-search/",
208    "inLanguage": "fi-FI",
209    "creator": {
210        "@id": "https://hdsoft.fi/#organization"
211    },
212    "genre": "AI / Odoo Integration"
213}
214</script>
214
215<link rel="alternate" hreflang="tr-TR" href="https://hdsoft.fi/tr/projeler/ai-universal-search/" />
216<link rel="alternate" hreflang="fr-FR" href="https://hdsoft.fi/fr/projets/ai-universal-search/" />
217<link rel="alternate" hreflang="en-US" href="https://hdsoft.fi/en/projects/ai-universal-search/" />
218<link rel="alternate" hreflang="hi-IN" href="https://hdsoft.fi/hi/projects/ai-universal-search/" />
219<link rel="alternate" hreflang="es-ES" href="https://hdsoft.fi/es/proyectos/ai-universal-search/" />
220<link rel="alternate" hreflang="pl-PL" href="https://hdsoft.fi/pl/projekty/ai-universal-search/" />
221<link rel="alternate" hreflang="pt-PT" href="https://hdsoft.fi/pt/projetos/ai-universal-search/" />
222<link rel="alternate" hreflang="de-DE" href="https://hdsoft.fi/de/projekte/ai-universal-search/" />
223<link rel="alternate" hreflang="ro-RO" href="https://hdsoft.fi/ro/proiecte/ai-universal-search/" />
224<link rel="alternate" hreflang="fa-IR" href="https://hdsoft.fi/fa/projects/ai-universal-search/" />
225<link rel="alternate" hreflang="ko-KR" href="https://hdsoft.fi/ko/projects/ai-universal-search/" />
226<link rel="alternate" hreflang="ar-SA" href="https://hdsoft.fi/ar/projects/ai-universal-search/" />
227<link rel="alternate" hreflang="fi-FI" href="https://hdsoft.fi/projektit/ai-universal-search/" />
228<link rel="alternate" hreflang="x-default" href="https://hdsoft.fi/projektit/ai-universal-search/" />
229
230
231
232
233
234
235</head>
236
237<body  class="wp-singular page-template-default page page-id-204 page-child parent-pageid-47 wp-theme-bricks brx-body bricks-is-frontend wp-embed-responsive">		<a class="skip-link" href="#brx-content">Skip to main content</a>
238
239					<a class="skip-link" href="#brx-footer">Skip to footer</a>
240			<header id="brx-header"><section id="brxe-sbcdfo" class="brxe-section bricks-lazy-hidden"></section><section id="brxe-855f88" class="brxe-section brxw-header-01 bricks-lazy-hidden"><div id="brxe-c75b94" class="brxe-container brxw-header-01__inner bricks-lazy-hidden"><a id="brxe-e5e249" class="brxe-logo brxw-header-01__logo" href="https://hdsoft.fi"><img width="1024" height="212" src="https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02-1024x212.webp" class="bricks-site-logo css-filter" alt="HD SofT Oy" loading="eager" decoding="async" fetchpriority="high" srcset="https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02-1024x212.webp 1024w, https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02-300x62.webp 300w, https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02-768x159.webp 768w, https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02-1536x318.webp 1536w, https://hdsoft.fi/wp-content/uploads/2026/04/Logo-02.webp 1893w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><div id="brxe-e42f6f" data-script-id="e42f6f" class="brxe-nav-menu brxw-header-01__nav-menu"><nav class="bricks-nav-menu-wrapper mobile_landscape"><ul id="menu-paavalikko" class="bricks-nav-menu"><li id="menu-item-233" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-233 bricks-menu-item"><a href="https://hdsoft.fi/">Etusivu</a></li>
241<li id="menu-item-235" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-235 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/palvelut/">Palvelut</a><button aria-expanded="false" aria-label="Palvelut Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
242<ul class="sub-menu">
243	<li id="menu-item-240" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-240 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehitys/">Ohjelmistokehitys</a></li>
244	<li id="menu-item-237" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-237 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/koodarivalitys/">Koodarivälitys</a></li>
245	<li id="menu-item-241" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-241 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/verkkokauppaohjelmisto/">Verkkokauppaohjelmisto</a></li>
246	<li id="menu-item-238" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-238 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/odoo/">Odoo-palvelut</a></li>
247	<li id="menu-item-236" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-236 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/digimarkkinointi/">Digimarkkinointi</a></li>
248	<li id="menu-item-239" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-239 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehittajille/">Ohjelmistokehittäjille</a></li>
249</ul>
250</li>
251<li id="menu-item-246" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-246 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/tuotteet/">Tuotteet</a><button aria-expanded="false" aria-label="Tuotteet Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
252<ul class="sub-menu">
253	<li id="menu-item-247" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-247 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easy-ip-tv/">Easy IP TV</a></li>
254	<li id="menu-item-248" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-248 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easyphotoplayer/">Easy Photo Player</a></li>
255	<li id="menu-item-249" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-249 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/klassik-solitaire/">Klassik Solitaire</a></li>
256	<li id="menu-item-250" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-250 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/multi-page-print-master/">Multi Page Print Master</a></li>
257</ul>
258</li>
259<li id="menu-item-242" class="menu-item menu-item-type-post_type menu-item-object-page current-page-ancestor current-menu-ancestor current-menu-parent current-page-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-242 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/projektit/">Projektit</a><button aria-expanded="false" aria-label="Projektit Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
260<ul class="sub-menu">
261	<li id="menu-item-243" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-243 bricks-menu-item"><a href="https://hdsoft.fi/projektit/ai-summary/">AI Summary</a></li>
262	<li id="menu-item-244" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-204 current_page_item menu-item-244 bricks-menu-item"><a href="https://hdsoft.fi/projektit/ai-universal-search/" aria-current="page">AI Universal Search for Odoo</a></li>
263	<li id="menu-item-245" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-245 bricks-menu-item"><a href="https://hdsoft.fi/projektit/porssisahkon-hinta/">Pörssisähkön hinta</a></li>
264</ul>
265</li>
266<li id="menu-item-252" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-252 bricks-menu-item"><a href="https://hdsoft.fi/blogi/">Blogi</a></li>
267<li id="menu-item-234" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-234 bricks-menu-item"><a href="https://hdsoft.fi/meista/">Meistä</a></li>
268<li id="menu-item-251" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-251 bricks-menu-item"><a href="https://hdsoft.fi/yhteydenotto/">Yhteydenotto</a></li>
269</ul></nav>			<button class="bricks-mobile-menu-toggle" aria-haspopup="true" aria-label="Open mobile menu" aria-expanded="false">
270				<span class="bar-top"></span>
271				<span class="bar-center"></span>
272				<span class="bar-bottom"></span>
273			</button>
274			<nav class="bricks-mobile-menu-wrapper left"><ul id="menu-paavalikko-1" class="bricks-mobile-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-233 bricks-menu-item"><a href="https://hdsoft.fi/">Etusivu</a></li>
275<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-235 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/palvelut/">Palvelut</a><button aria-expanded="false" aria-label="Palvelut Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
276<ul class="sub-menu">
277	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-240 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehitys/">Ohjelmistokehitys</a></li>
278	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-237 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/koodarivalitys/">Koodarivälitys</a></li>
279	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-241 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/verkkokauppaohjelmisto/">Verkkokauppaohjelmisto</a></li>
280	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-238 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/odoo/">Odoo-palvelut</a></li>
281	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-236 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/digimarkkinointi/">Digimarkkinointi</a></li>
282	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-239 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehittajille/">Ohjelmistokehittäjille</a></li>
283</ul>
284</li>
285<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-246 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/tuotteet/">Tuotteet</a><button aria-expanded="false" aria-label="Tuotteet Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
286<ul class="sub-menu">
287	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-247 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easy-ip-tv/">Easy IP TV</a></li>
288	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-248 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easyphotoplayer/">Easy Photo Player</a></li>
289	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-249 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/klassik-solitaire/">Klassik Solitaire</a></li>
290	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-250 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/multi-page-print-master/">Multi Page Print Master</a></li>
291</ul>
292</li>
293<li class="menu-item menu-item-type-post_type menu-item-object-page current-page-ancestor current-menu-ancestor current-menu-parent current-page-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-242 bricks-menu-item"><div class="brx-submenu-toggle icon-right"><a href="https://hdsoft.fi/projektit/">Projektit</a><button aria-expanded="false" aria-label="Projektit Sub menu"><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="none" class="menu-item-icon"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5" stroke="currentcolor"></path></svg></button></div>
294<ul class="sub-menu">
295	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-243 bricks-menu-item"><a href="https://hdsoft.fi/projektit/ai-summary/">AI Summary</a></li>
296	<li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-204 current_page_item menu-item-244 bricks-menu-item"><a href="https://hdsoft.fi/projektit/ai-universal-search/" aria-current="page">AI Universal Search for Odoo</a></li>
297	<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-245 bricks-menu-item"><a href="https://hdsoft.fi/projektit/porssisahkon-hinta/">Pörssisähkön hinta</a></li>
298</ul>
299</li>
300<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-252 bricks-menu-item"><a href="https://hdsoft.fi/blogi/">Blogi</a></li>
301<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-234 bricks-menu-item"><a href="https://hdsoft.fi/meista/">Meistä</a></li>
302<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-251 bricks-menu-item"><a href="https://hdsoft.fi/yhteydenotto/">Yhteydenotto</a></li>
303</ul></nav><div class="bricks-mobile-menu-overlay"></div></div></div></section></header><main id="brx-content"><section id="brxe-ywfsal" class="brxe-section bricks-lazy-hidden"><div id="brxe-jsubhd" class="brxe-container bricks-lazy-hidden"><div id="brxe-eswzva" class="brxe-block bricks-lazy-hidden stack-m center">
303<h1 id="brxe-vxdoiy" class="brxe-heading">AI Universal Search for Odoo</h1><div id="brxe-ktovps" class="brxe-text"><p>AI-pohjainen luonnollisen kielen haku Odoo 18.0:lle. Kysy mitä tahansa, mistä tahansa moduulista — virallisista, kolmansien osapuolten tai omista.</p>
304</div><a id="brxe-frgial" class="brxe-button bricks-button bricks-background-primary" href="https://apps.odoo.com/apps/modules/18.0/ai_universal_search">Asenna Odoo Apps Storesta</a></div></div></section><section id="brxe-fdfjdg" class="brxe-section bricks-lazy-hidden"><div id="brxe-wtffun" class="brxe-container bricks-lazy-hidden"><div id="brxe-sjqrsu" class="brxe-block bricks-lazy-hidden stack-m"><h2 id="brxe-dwkoud" class="brxe-heading">Tausta</h2><div id="brxe-wfmqsa" class="brxe-text"><p>Odoo-lisäosa, joka tuo AI-pohjaisen hakupalkin, jolla käyttäjät voivat kysellä mitä tahansa Odoo-instanssin dataa luonnollisella kielellä. Tukee kaikkia asennettuja moduuleja: virallisia, kolmansien osapuolten ja räätälöityjä.</p>
305<h3>Avainominaisuudet</h3>
306<ul>
307<li><strong>Luonnollisen kielen haku</strong> — kysy tavalliseen tapaan, esim. <em>&#8220;Mikä oli viime kuun kokonaismyynti?&#8221;</em> tai <em>&#8220;Onko CRM:ssä käyttäjä John Smith?&#8221;</em></li>
308<li><strong>Automaattinen mallien ja kenttien tunnistus</strong> — järjestelmä yhdistää Odoon tietokantamallit ja kentät automaattisesti tarkkaan ja nopeaan tiedonhakuun</li>
309<li><strong>Turvallinen ORM-suoritus</strong> — kaikki kyselyt ajetaan Odoon ORM:n kautta, estää SQL-injektiohyökkäykset</li>
310<li><strong>Konfiguraatiopohjainen API-hallinta</strong> — OpenRouterin ja muiden AI-palveluiden API-avaimet hallitaan suoraan Odoon asetuksista</li>
311<li><strong>Multi-Model-haku</strong> — yhdistä dataa useista malleista yhdellä kyselyllä, esim. <em>&#8220;Näytä asiakkaat, joilla on viimeaikaista myyntiä&#8221;</em> tai <em>&#8220;Etsi projektit, joilla on myöhästyneitä tehtäviä&#8221;</em></li>
312</ul>
313<h3>Tekninen toteutus</h3>
314<p>Lisäosa löytää dynaamisesti asennetut mallit ja niiden kentät, käyttää AI:ta luonnollisen kielen kyselyiden tulkintaan ja muuntaa ne turvallisiksi ORM-operaatioiksi. Käyttäjäoikeudet huomioidaan ja integraatio Odoon käyttöliittymään on saumaton.</p>
315<h3>Yhteensopivuus</h3>
316<p>Erityisesti suunniteltu Odoo 18.0:lle, hyödyntää uuden ohjelmistokehyksen ominaisuuksia. Saatavilla Odoo Online-, Odoo.sh- ja On Premise -ympäristöihin.</p>
317<p><strong>Huom:</strong> OpenRouterin tai muun AI-palvelun API-avain pitää konfiguroida asetuksiin ennen hakuominaisuuden käyttöä.</p>
318<p>Versio 0.3.2 · Lisenssi LGPL-3</p>
319</div></div></div></section><section id="brxe-nalwvs" class="brxe-section bricks-lazy-hidden"><div id="brxe-jrzqzc" class="brxe-container bricks-lazy-hidden"><div id="brxe-gwrtua" class="brxe-block bricks-lazy-hidden stack-m center"><h2 id="brxe-iqelve" class="brxe-heading">Lisätietoja?</h2><div id="brxe-lumyuc" class="brxe-text"><p>Kysy meiltä lisää tai katso lähdekoodi.</p>
320</div><a id="brxe-zgucvx" class="brxe-button bricks-button bricks-background-primary" href="/yhteydenotto/">Ota yhteyttä</a></div></div></section></main><footer id="brx-footer"><section id="brxe-oozzin" class="brxe-section bricks-lazy-hidden"></section><section id="brxe-eeaced" class="brxe-section brxw-footer-03 bricks-lazy-hidden"><div id="brxe-3f865c" class="brxe-container brxw-footer-03__inner-top bricks-lazy-hidden"><div id="brxe-36ce2a" class="brxe-block brxw-footer-03__content-wrapper bricks-lazy-hidden"><a id="brxe-820859" class="brxe-logo brxw-footer-03__logo" href="https://hdsoft.fi"><img width="1024" height="212" src="https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02-1024x212.png" class="bricks-site-logo css-filter" alt="HD SofT Oy" loading="eager" decoding="async" srcset="https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02-1024x212.png 1024w, https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02-300x62.png 300w, https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02-768x159.png 768w, https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02-1536x318.png 1536w, https://hdsoft.fi/wp-content/uploads/2026/05/Logo-02.png 1893w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><p id="brxe-ipibrn" class="brxe-text-basic">&copy; 2026 HD SofT Oy. Kaikki oikeudet pidätetään.</p><a id="brxe-dlzwza" class="brxe-text-link" href="/tietosuojaseloste">Tietosuojaseloste</a></div><nav id="brxe-79107e" class="brxe-block brxw-footer-03__nav-row bricks-lazy-hidden"><div id="brxe-7cc07a" class="brxe-div brxw-footer-03__nav-col bricks-lazy-hidden"><span id="brxe-e1b676" class="brxe-text-basic brxw-footer-03__title">Palvelut</span><div id="brxe-8c6184" data-script-id="8c6184" class="brxe-nav-menu brxw-footer-03__nav-menu"><nav class="bricks-nav-menu-wrapper never"><ul id="menu-footer-palvelut" class="bricks-nav-menu"><li id="menu-item-258" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-258 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehitys/">Ohjelmistokehitys</a></li>
321<li id="menu-item-257" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-257 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/koodarivalitys/">Koodarivälitys</a></li>
322<li id="menu-item-256" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-256 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/verkkokauppaohjelmisto/">Verkkokauppaohjelmisto</a></li>
323<li id="menu-item-255" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-255 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/odoo/">Odoo-palvelut</a></li>
324<li id="menu-item-254" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-254 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/digimarkkinointi/">Digimarkkinointi</a></li>
325<li id="menu-item-253" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-253 bricks-menu-item"><a href="https://hdsoft.fi/palvelut/ohjelmistokehittajille/">Ohjelmistokehittäjille</a></li>
326</ul></nav></div></div><div id="brxe-cb6055" class="brxe-div brxw-footer-03__nav-col bricks-lazy-hidden"><span id="brxe-796e17" class="brxe-text-basic brxw-footer-03__title">Tuotteet</span><div id="brxe-1ce144" data-script-id="1ce144" class="brxe-nav-menu brxw-footer-03__nav-menu"><nav class="bricks-nav-menu-wrapper never"><ul id="menu-footer-tuotteet" class="bricks-nav-menu"><li id="menu-item-262" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-262 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easy-ip-tv/">Easy IP TV</a></li>
327<li id="menu-item-261" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-261 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/klassik-solitaire/">Klassik Solitaire</a></li>
328<li id="menu-item-260" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-260 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/easyphotoplayer/">Easy Photo Player</a></li>
329<li id="menu-item-259" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-259 bricks-menu-item"><a href="https://hdsoft.fi/tuotteet/multi-page-print-master/">Multi Page Print Master</a></li>
330</ul></nav></div></div><div id="brxe-c32403" class="brxe-div brxw-footer-03__nav-col bricks-lazy-hidden"><span id="brxe-d9af4e" class="brxe-text-basic brxw-footer-03__title">Yritys</span><div id="brxe-860eb7" data-script-id="860eb7" class="brxe-nav-menu brxw-footer-03__nav-menu"><nav class="bricks-nav-menu-wrapper never"><ul id="menu-footer-yritys" class="bricks-nav-menu"><li id="menu-item-264" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-264 bricks-menu-item"><a href="https://hdsoft.fi/meista/">Meistä</a></li>
331<li id="menu-item-263" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-263 bricks-menu-item"><a href="https://hdsoft.fi/blogi/">Blogi</a></li>
332<li id="menu-item-265" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-265 bricks-menu-item"><a href="https://hdsoft.fi/yhteydenotto/">Yhteydenotto</a></li>
333</ul></nav></div></div></nav></div></section></footer>
334<script id="hdsoft-i18n-nav-data">window.HDSOFT_I18N={"nav":{"fi":[{"t":"Etusivu","u":"/"},{"t":"Palvelut","u":"/palvelut/"},{"t":"Tuotteet","u":"/tuotteet/"},{"t":"Projektit","u":"/projektit/"},{"t":"Blogi","u":"/blogi/"},{"t":"Meistä","u":"/meista/"},{"t":"Yhteydenotto","u":"/yhteydenotto/"}],"en":[{"t":"Home","u":"/en/"},{"t":"Services","u":"/en/services/"},{"t":"Products","u":"/en/products/"},{"t":"Projects","u":"/en/projects/"},{"t":"Blog","u":"/en/blog/"},{"t":"About","u":"/en/about/"},{"t":"Contact","u":"/en/contact/"}],"de":[{"t":"Startseite","u":"/de/"},{"t":"Dienstleistungen","u":"/de/dienstleistungen/"},{"t":"Produkte","u":"/de/produkte/"},{"t":"Projekte","u":"/de/projekte/"},{"t":"Blog","u":"/de/blog/"},{"t":"Über uns","u":"/de/ueber-uns/"},{"t":"Kontakt","u":"/de/kontakt/"}],"fr":[{"t":"Accueil","u":"/fr/"},{"t":"Services","u":"/fr/services/"},{"t":"Produits","u":"/fr/produits/"},{"t":"Projets","u":"/fr/projets/"},{"t":"Blog","u":"/fr/blog/"},{"t":"À propos","u":"/fr/a-propos/"},{"t":"Contact","u":"/fr/contact/"}],"es":[{"t":"Inicio","u":"/es/"},{"t":"Servicios","u":"/es/servicios/"},{"t":"Productos","u":"/es/productos/"},{"t":"Proyectos","u":"/es/proyectos/"},{"t":"Blog","u":"/es/blog/"},{"t":"Sobre nosotros","u":"/es/sobre-nosotros/"},{"t":"Contacto","u":"/es/contacto/"}],"pt":[{"t":"Início","u":"/pt/"},{"t":"Serviços","u":"/pt/servicos/"},{"t":"Produtos","u":"/pt/produtos/"},{"t":"Projetos","u":"/pt/projetos/"},{"t":"Blog","u":"/pt/blog/"},{"t":"Sobre nós","u":"/pt/sobre-nos/"},{"t":"Contato","u":"/pt/contato/"}],"pl":[{"t":"Strona główna","u":"/pl/"},{"t":"Usługi","u":"/pl/uslugi/"},{"t":"Produkty","u":"/pl/produkty/"},{"t":"Projekty","u":"/pl/projekty/"},{"t":"Blog","u":"/pl/blog/"},{"t":"O nas","u":"/pl/o-nas/"},{"t":"Kontakt","u":"/pl/kontakt/"}],"ro":[{"t":"Acasă","u":"/ro/"},{"t":"Servicii","u":"/ro/servicii/"},{"t":"Produse","u":"/ro/produse/"},{"t":"Proiecte","u":"/ro/proiecte/"},{"t":"Blog","u":"/ro/blog/"},{"t":"Despre noi","u":"/ro/despre-noi/"},{"t":"Contact","u":"/ro/contact/"}],"tr":[{"t":"Ana sayfa","u":"/tr/"},{"t":"Hizmetler","u":"/tr/hizmetler/"},{"t":"Ürünler","u":"/tr/urunler/"},{"t":"Projeler","u":"/tr/projeler/"},{"t":"Blog","u":"/tr/blog/"},{"t":"Hakkımızda","u":"/tr/hakkimizda/"},{"t":"İletişim","u":"/tr/iletisim/"}],"ko":[{"t":"홈","u":"/ko/"},{"t":"서비스","u":"/ko/services/"},{"t":"제품","u":"/ko/products/"},{"t":"프로젝트","u":"/ko/projects/"},{"t":"블로그","u":"/ko/blog/"},{"t":"회사 소개","u":"/ko/about/"},{"t":"문의","u":"/ko/contact/"}],"hi":[{"t":"होम","u":"/hi/"},{"t":"सेवाएँ","u":"/hi/services/"},{"t":"उत्पाद","u":"/hi/products/"},{"t":"प्रोजेक्ट्स","u":"/hi/projects/"},{"t":"ब्लॉग","u":"/hi/blog/"},{"t":"हमारे बारे में","u":"/hi/about/"},{"t":"संपर्क करें","u":"/hi/contact/"}],"ar":[{"t":"الرئيسية","u":"/ar/"},{"t":"الخدمات","u":"/ar/services/"},{"t":"المنتجات","u":"/ar/products/"},{"t":"المشاريع","u":"/ar/projects/"},{"t":"المدونة","u":"/ar/blog/"},{"t":"من نحن","u":"/ar/about/"},{"t":"تواصل معنا","u":"/ar/contact/"}],"fa":[{"t":"خانه","u":"/fa/"},{"t":"خدمات","u":"/fa/services/"},{"t":"محصولات","u":"/fa/products/"},{"t":"پروژه‌ها","u":"/fa/projects/"},{"t":"وبلاگ","u":"/fa/blog/"},{"t":"درباره ما","u":"/fa/about/"},{"t":"تماس با ما","u":"/fa/contact/"}]},"footer":{"fi":{"titles":["Palvelut","Tuotteet","Yritys"],"svc":[{"t":"Ohjelmistokehitys","u":"/palvelut/ohjelmistokehitys/"},{"t":"Koodarivälitys","u":"/palvelut/koodarivalitys/"},{"t":"Verkkokauppaohjelmisto","u":"/palvelut/verkkokauppaohjelmisto/"},{"t":"Odoo-palvelut","u":"/palvelut/odoo/"},{"t":"Digimarkkinointi","u":"/palvelut/digimarkkinointi/"},{"t":"Ohjelmistokehittäjille","u":"/palvelut/ohjelmistokehittajille/"}],"prd":[{"t":"Klassik Sanahaku","u":"/tuotteet/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/tuotteet/klassik-mahjong/"},{"t":"ZLocator","u":"/tuotteet/zlocator/"},{"t":"Sankki","u":"/tuotteet/sankki/"},{"t":"Easy IP TV","u":"/tuotteet/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/tuotteet/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/tuotteet/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/tuotteet/multi-page-print-master/"},{"t":"Klassik Puupalat","u":"/tuotteet/klassik-puupalat/"}],"cmp":[{"t":"Meistä","u":"/meista/"},{"t":"Blogi","u":"/blogi/"},{"t":"Yhteydenotto","u":"/yhteydenotto/"}],"priv":"Tietosuojaseloste","copy":"Kaikki oikeudet pidätetään."},"pl":{"titles":["Usługi","Produkty","Firma"],"svc":[{"t":"Tworzenie oprogramowania","u":"/pl/uslugi/tworzenie-oprogramowania/"},{"t":"Rekrutacja programistów","u":"/pl/uslugi/rekrutacja-programistow/"},{"t":"Oprogramowanie e-commerce","u":"/pl/uslugi/e-commerce/"},{"t":"Usługi Odoo","u":"/pl/uslugi/odoo/"},{"t":"Marketing cyfrowy","u":"/pl/uslugi/marketing-cyfrowy/"},{"t":"Dla programistów","u":"/pl/uslugi/dla-programistow/"}],"prd":[{"t":"Klassik Sanahaku","u":"/pl/produkty/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/pl/produkty/klassik-mahjong/"},{"t":"ZLocator","u":"/pl/produkty/zlocator/"},{"t":"Sankki","u":"/pl/produkty/sankki/"},{"t":"Easy IP TV","u":"/pl/produkty/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/pl/produkty/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/pl/produkty/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/pl/produkty/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/pl/produkty/klassik-puupalat/"}],"cmp":[{"t":"O nas","u":"/pl/o-nas/"},{"t":"Blog","u":"/pl/blog/"},{"t":"Kontakt","u":"/pl/kontakt/"}],"priv":"Prywatność","copy":"Wszelkie prawa zastrzeżone."},"fa":{"titles":["خدمات","محصولات","شرکت"],"svc":[{"t":"توسعه نرم‌افزار","u":"/fa/services/software-development/"},{"t":"تأمین توسعه‌دهنده","u":"/fa/services/developer-recruitment/"},{"t":"نرم‌افزار فروشگاه آنلاین","u":"/fa/services/ecommerce/"},{"t":"خدمات Odoo","u":"/fa/services/odoo/"},{"t":"بازاریابی دیجیتال","u":"/fa/services/digital-marketing/"},{"t":"برای توسعه‌دهندگان","u":"/fa/services/for-developers/"}],"prd":[{"t":"Klassik Sanahaku","u":"/fa/products/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/fa/products/klassik-mahjong/"},{"t":"ZLocator","u":"/fa/products/zlocator/"},{"t":"Sankki","u":"/fa/products/sankki/"},{"t":"Easy IP TV","u":"/fa/products/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/fa/products/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/fa/products/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/fa/products/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/fa/products/klassik-puupalat/"}],"cmp":[{"t":"درباره ما","u":"/fa/about/"},{"t":"وبلاگ","u":"/fa/blog/"},{"t":"تماس با ما","u":"/fa/contact/"}],"priv":"حریم خصوصی","copy":"کلیه حقوق محفوظ است."}
334,"hi":{"titles":["सेवाएँ","उत्पाद","कंपनी"],"svc":[{"t":"सॉफ़्टवेयर डेवलपमेंट","u":"/hi/services/software-development/"},{"t":"डेवलपर रिक्रूटमेंट","u":"/hi/services/developer-recruitment/"},{"t":"ई-कॉमर्स सॉफ़्टवेयर","u":"/hi/services/ecommerce/"},{"t":"Odoo सेवाएँ","u":"/hi/services/odoo/"},{"t":"डिजिटल मार्केटिंग","u":"/hi/services/digital-marketing/"},{"t":"डेवलपर्स के लिए","u":"/hi/services/for-developers/"}],"prd":[{"t":"Klassik Sanahaku","u":"/hi/products/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/hi/products/klassik-mahjong/"},{"t":"ZLocator","u":"/hi/products/zlocator/"},{"t":"Sankki","u":"/hi/products/sankki/"},{"t":"Easy IP TV","u":"/hi/products/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/hi/products/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/hi/products/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/hi/products/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/hi/products/klassik-puupalat/"}],"cmp":[{"t":"हमारे बारे में","u":"/hi/about/"},{"t":"ब्लॉग","u":"/hi/blog/"},{"t":"संपर्क करें","u":"/hi/contact/"}],"priv":"गोपनीयता नीति","copy":"सर्वाधिकार सुरक्षित."},"ar":{"titles":["الخدمات","المنتجات","الشركة"],"svc":[{"t":"تطوير البرمجيات","u":"/ar/services/software-development/"},{"t":"توفير المطورين","u":"/ar/services/developer-recruitment/"},{"t":"برمجيات التجارة الإلكترونية","u":"/ar/services/ecommerce/"},{"t":"خدمات Odoo","u":"/ar/services/odoo/"},{"t":"التسويق الرقمي","u":"/ar/services/digital-marketing/"},{"t":"للمطورين","u":"/ar/services/for-developers/"}],"prd":[{"t":"Klassik Sanahaku","u":"/ar/products/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/ar/products/klassik-mahjong/"},{"t":"ZLocator","u":"/ar/products/zlocator/"},{"t":"Sankki","u":"/ar/products/sankki/"},{"t":"Easy IP TV","u":"/ar/products/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/ar/products/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/ar/products/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/ar/products/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/ar/products/klassik-puupalat/"}],"cmp":[{"t":"من نحن","u":"/ar/about/"},{"t":"المدونة","u":"/ar/blog/"},{"t":"تواصل معنا","u":"/ar/contact/"}],"priv":"سياسة الخصوصية","copy":"جميع الحقوق محفوظة."},"fr":{"titles":["Services","Produits","Société"],"svc":[{"t":"Développement logiciel","u":"/fr/services/developpement-logiciel/"},{"t":"Placement de développeurs","u":"/fr/services/placement-developpeurs/"},{"t":"Logiciel e-commerce","u":"/fr/services/e-commerce/"},{"t":"Services Odoo","u":"/fr/services/odoo/"},{"t":"Marketing digital","u":"/fr/services/marketing-digital/"},{"t":"Pour développeurs","u":"/fr/services/pour-developpeurs/"}],"prd":[{"t":"Klassik Sanahaku","u":"/fr/produits/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/fr/produits/klassik-mahjong/"},{"t":"ZLocator","u":"/fr/produits/zlocator/"},{"t":"Sankki","u":"/fr/produits/sankki/"},{"t":"Easy IP TV","u":"/fr/produits/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/fr/produits/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/fr/produits/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/fr/produits/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/fr/produits/klassik-puupalat/"}],"cmp":[{"t":"À propos","u":"/fr/a-propos/"},{"t":"Blog","u":"/fr/blog/"},{"t":"Contact","u":"/fr/contact/"}],"priv":"Confidentialité","copy":"Tous droits réservés."},"de":{"titles":["Dienstleistungen","Produkte","Unternehmen"],"svc":[{"t":"Softwareentwicklung","u":"/de/dienstleistungen/softwareentwicklung/"},{"t":"Entwicklervermittlung","u":"/de/dienstleistungen/entwickler-vermittlung/"},{"t":"E-Commerce","u":"/de/dienstleistungen/e-commerce/"},{"t":"Odoo-Dienstleistungen","u":"/de/dienstleistungen/odoo/"},{"t":"Digitales Marketing","u":"/de/dienstleistungen/digitales-marketing/"},{"t":"Für Entwickler","u":"/de/dienstleistungen/fuer-entwickler/"}],"prd":[{"t":"Klassik Sanahaku","u":"/de/produkte/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/de/produkte/klassik-mahjong/"},{"t":"ZLocator","u":"/de/produkte/zlocator/"},{"t":"Sankki","u":"/de/produkte/sankki/"},{"t":"Easy IP TV","u":"/de/produkte/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/de/produkte/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/de/produkte/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/de/produkte/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/de/produkte/klassik-puupalat/"}],"cmp":[{"t":"Über uns","u":"/de/ueber-uns/"},{"t":"Blog","u":"/de/blog/"},{"t":"Kontakt","u":"/de/kontakt/"}],"priv":"Datenschutz","copy":"Alle Rechte vorbehalten."},"es":{"titles":["Servicios","Productos","Empresa"],"svc":[{"t":"Desarrollo de softw
334are","u":"/es/servicios/desarrollo-de-software/"},{"t":"Reclutamiento de desarrolladores","u":"/es/servicios/reclutamiento-desarrolladores/"},{"t":"Software de e-commerce","u":"/es/servicios/e-commerce/"},{"t":"Servicios Odoo","u":"/es/servicios/odoo/"},{"t":"Marketing digital","u":"/es/servicios/marketing-digital/"},{"t":"Para desarrolladores","u":"/es/servicios/para-desarrolladores/"}],"prd":[{"t":"Klassik Sanahaku","u":"/es/productos/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/es/productos/klassik-mahjong/"},{"t":"ZLocator","u":"/es/productos/zlocator/"},{"t":"Sankki","u":"/es/productos/sankki/"},{"t":"Easy IP TV","u":"/es/productos/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/es/productos/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/es/productos/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/es/productos/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/es/productos/klassik-puupalat/"}],"cmp":[{"t":"Sobre nosotros","u":"/es/sobre-nosotros/"},{"t":"Blog","u":"/es/blog/"},{"t":"Contacto","u":"/es/contacto/"}],"priv":"Privacidad","copy":"Todos los derechos reservados."},"ro":{"titles":["Servicii","Produse","Companie"],"svc":[{"t":"Dezvoltare software","u":"/ro/servicii/dezvoltare-software/"},{"t":"Recrutare dezvoltatori","u":"/ro/servicii/recrutare-dezvoltatori/"},{"t":"Software pentru e-commerce","u":"/ro/servicii/e-commerce/"},{"t":"Servicii Odoo","u":"/ro/servicii/odoo/"},{"t":"Marketing digital","u":"/ro/servicii/marketing-digital/"},{"t":"Pentru dezvoltatori","u":"/ro/servicii/pentru-dezvoltatori/"}],"prd":[{"t":"Klassik Sanahaku","u":"/ro/produse/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/ro/produse/klassik-mahjong/"},{"t":"ZLocator","u":"/ro/produse/zlocator/"},{"t":"Sankki","u":"/ro/produse/sankki/"},{"t":"Easy IP TV","u":"/ro/produse/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/ro/produse/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/ro/produse/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/ro/produse/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/ro/produse/klassik-puupalat/"}],"cmp":[{"t":"Despre noi","u":"/ro/despre-noi/"},{"t":"Blog","u":"/ro/blog/"},{"t":"Contact","u":"/ro/contact/"}],"priv":"Confidențialitate","copy":"Toate drepturile rezervate."},"tr":{"titles":["Hizmetler","Ürünler","Şirket"],"svc":[{"t":"Yazılım geliştirme","u":"/tr/hizmetler/yazilim-gelistirme/"},{"t":"Geliştirici istihdamı","u":"/tr/hizmetler/gelistirici-istihdami/"},{"t":"E-ticaret yazılımı","u":"/tr/hizmetler/e-ticaret/"},{"t":"Odoo hizmetleri","u":"/tr/hizmetler/odoo/"},{"t":"Dijital pazarlama","u":"/tr/hizmetler/dijital-pazarlama/"},{"t":"Geliştiriciler için","u":"/tr/hizmetler/gelistiriciler-icin/"}],"prd":[{"t":"Klassik Sanahaku","u":"/tr/urunler/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/tr/urunler/klassik-mahjong/"},{"t":"ZLocator","u":"/tr/urunler/zlocator/"},{"t":"Sankki","u":"/tr/urunler/sankki/"},{"t":"Easy IP TV","u":"/tr/urunler/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/tr/urunler/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/tr/urunler/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/tr/urunler/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/tr/urunler/klassik-puupalat/"}],"cmp":[{"t":"Hakkımızda","u":"/tr/hakkimizda/"},{"t":"Blog","u":"/tr/blog/"},{"t":"İletişim","u":"/tr/iletisim/"}],"priv":"Gizlilik","copy":"Tüm hakları saklıdır."},"en":{"titles":["Services","Products","Company"],"svc":[{"t":"Software development","u":"/en/services/software-development/"},{"t":"Developer recruitment","u":"/en/services/developer-recruitment/"},{"t":"E-commerce software","u":"/en/services/ecommerce/"},{"t":"Odoo services","u":"/en/services/odoo/"},{"t":"Digital marketing","u":"/en/services/digital-marketing/"},{"t":"For developers","u":"/en/services/for-developers/"}],"prd":[{"t":"Klassik Sanahaku","u":"/en/products/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/en/products/klassik-mahjong/"},{"t":"ZLocator","u":"/en/products/zlocator/"},{"t":"Sankki","u":"/en/products/sankki/"},{"t":"Easy IP TV","u":"/en/products/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/en/products/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/en/products/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/en/products/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/en/products/klassik-puupalat/"}],"cmp":[{"t":"About","u":"/en/about/"},{"t":"Blog","u":"/en/blog/"},{"t":"Contact","u":"/en/contact/"}],"priv":"Privacy Policy","copy":"All rights reserved."},"ko":{"titles":["서비스","제품","회사"],"svc":[{"t":"소프트웨어 개발","u":"/ko/services/software-development/"},{"t":"개발자 인력 중개","u":"/ko/services/developer-recruitment/"},{"t":"이커머스 소프트웨어","u":"/ko/services/ecommerce/"},{"t":"Odoo 서비스","u":"/ko/services/odoo/"},{"t":"디지털 마케팅","u":"/ko/services/digital-marketing/"},{"t":"개발자를 위해","u":"/ko/services/for-developers/"}],"prd":[{"t":"Klassik Sanahaku","u":"/ko/products/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/ko/products/klassik-mahjong/"},{"t":"ZLocator","u":"/ko/products/zlocator/"},{"t":"Sankki","u":"/ko/products/sankki/"},{"t":"Easy IP TV","u":"/ko/products/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/ko/products/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/ko/products/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/ko/products/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/ko/products/klassik-puupalat/"}],"cmp":[{"t":"회사 소개","u":"/ko/about/"},{"t":"블로그","u":"/ko/blog/"},{"t":"문의","u":"/ko/contact/"}],"priv":"개인정보 처리방침","copy":"모든 권리 보유."},"pt":{"titles":["Serviços","Produtos","Empresa"],"svc":[{"t":"Desenvolvimento de softw
334are","u":"/pt/servicos/desenvolvimento-de-software/"},{"t":"Recrutamento de desenvolvedores","u":"/pt/servicos/recrutamento-desenvolvedores/"},{"t":"Software de e-commerce","u":"/pt/servicos/e-commerce/"},{"t":"Serviços Odoo","u":"/pt/servicos/odoo/"},{"t":"Marketing digital","u":"/pt/servicos/marketing-digital/"},{"t":"Para desenvolvedores","u":"/pt/servicos/para-desenvolvedores/"}],"prd":[{"t":"Klassik Sanahaku","u":"/pt/produtos/klassik-sanahaku/"},{"t":"Klassik Mahjong","u":"/pt/produtos/klassik-mahjong/"},{"t":"ZLocator","u":"/pt/produtos/zlocator/"},{"t":"Sankki","u":"/pt/produtos/sankki/"},{"t":"Easy IP TV","u":"/pt/produtos/easy-ip-tv/"},{"t":"Klassik Solitaire","u":"/pt/produtos/klassik-solitaire/"},{"t":"Easy Photo Player","u":"/pt/produtos/easyphotoplayer/"},{"t":"Multi Page Print Master","u":"/pt/produtos/multi-page-print-master/"},{"t":"Klassik Wood Blocks","u":"/pt/produtos/klassik-puupalat/"}],"cmp":[{"t":"Sobre nós","u":"/pt/sobre-nos/"},{"t":"Blog","u":"/pt/blog/"},{"t":"Contato","u":"/pt/contato/"}],"priv":"Privacidade","copy":"Todos os direitos reservados."}},"projects":{"fi":[{"t":"AI Summary","u":"/projektit/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/projektit/ai-universal-search/"},{"t":"Pörssisähkön hinta","u":"/projektit/porssisahkon-hinta/"}],"pl":[{"t":"AI Summary","u":"/pl/projekty/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/pl/projekty/ai-universal-search/"},{"t":"Cena energii giełdowej","u":"/pl/projekty/cena-energii/"}],"fa":[{"t":"HD SofT AI Summary","u":"/fa/projects/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/fa/projects/ai-universal-search/"},{"t":"قیمت برق در بازار","u":"/fa/projects/electricity-price/"}],"hi":[{"t":"AI Summary","u":"/hi/projects/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/hi/projects/ai-universal-search/"},{"t":"बिजली बाज़ार मूल्य","u":"/hi/projects/spot-electricity-price/"}],"ar":[{"t":"AI Summary","u":"/ar/projects/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/ar/projects/ai-universal-search/"},{"t":"سعر الكهرباء الفوري","u":"/ar/projects/electricity-spot-price/"}],"fr":[{"t":"AI Summary","u":"/fr/projets/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/fr/projets/ai-universal-search/"},{"t":"Prix spot de l'électricité","u":"/fr/projets/prix-electricite/"}],"de":[{"t":"AI Summary","u":"/de/projekte/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/de/projekte/ai-universal-search/"},{"t":"Strompreis (Spot)","u":"/de/projekte/strompreis/"}],"es":[{"t":"HD SofT AI Summary","u":"/es/proyectos/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/es/proyectos/ai-universal-search/"},{"t":"Precio de la electricidad spot","u":"/es/proyectos/precio-electricidad/"}],"ro":[{"t":"AI Summary","u":"/ro/proiecte/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/ro/proiecte/ai-universal-search/"},{"t":"Prețul electricității la bursă","u":"/ro/proiecte/pret-electricitate/"}],"tr":[{"t":"AI Summary","u":"/tr/projeler/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/tr/projeler/ai-universal-search/"},{"t":"Borsada elektrik fiyatı","u":"/tr/projeler/elektrik-fiyati/"}],"en":[{"t":"AI Summary","u":"/en/projects/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/en/projects/ai-universal-search/"},{"t":"Spot electricity price","u":"/en/projects/spot-electricity-price/"}],"ko":[{"t":"AI Summary","u":"/ko/projects/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/ko/projects/ai-universal-search/"},{"t":"전력 도매가격","u":"/ko/projects/spot-electricity-price/"}],"pt":[{"t":"AI Summary","u":"/pt/projetos/ai-summary/"},{"t":"AI Universal Search for Odoo","u":"/pt/projetos/ai-universal-search/"},{"t":"Preço da eletricidade no mercado","u":"/pt/projetos/preco-eletricidade/"}]}};</script>
vendor: 1 bytes, line 334
334
335<script id="hdsoft-i18n-nav">(function(){
336  var DATA = window.HDSOFT_I18N || {};
337  var NAV = DATA.nav || {}, FOOTER = DATA.footer || {}, PROJECTS = DATA.projects || {};
338  if (!NAV.fi) return;
339
340  var KNOWN = ['en','de','fr','es','pt','pl','ro','tr','ko','hi','ar','fa'];
341
342  var LANGS = {
343    fi:{flag:'🇫🇮',name:'Suomi'},   en:{flag:'🇬🇧',name:'English'},
344    de:{flag:'🇩🇪',name:'Deutsch'}, fr:{flag:'🇫🇷',name:'Français'},
345    es:{flag:'🇪🇸',name:'Español'}, pt:{flag:'🇵🇹',name:'Português'},
346    pl:{flag:'🇵🇱',name:'Polski'},  ro:{flag:'🇷🇴',name:'Română'},
347    tr:{flag:'🇹🇷',name:'Türkçe'},  ko:{flag:'🇰🇷',name:'한국어'},
348    hi:{flag:'🇮🇳',name:'हिन्दी'},    ar:{flag:'🇸🇦',name:'العربية'},
349    fa:{flag:'🇮🇷',name:'فارسی'}
350  };
351
352  var LABELS = {
353    fi:{related:'Aiheeseen liittyvät', prev:'EDELLINEN ARTIKKELI', next:'SEURAAVA ARTIKKELI', lang:'Kieli'},
354    en:{related:'Related posts', prev:'PREVIOUS POST', next:'NEXT POST', lang:'Language'},
355    de:{related:'Ähnliche Beiträge', prev:'VORHERIGER BEITRAG', next:'NÄCHSTER BEITRAG', lang:'Sprache'},
356    fr:{related:'Articles similaires', prev:'ARTICLE PRÉCÉDENT', next:'ARTICLE SUIVANT', lang:'Langue'},
357    es:{related:'Artículos relacionados', prev:'ANTERIOR', next:'SIGUIENTE', lang:'Idioma'},
358    pt:{related:'Artigos relacionados', prev:'ANTERIOR', next:'PRÓXIMO', lang:'Idioma'},
359    pl:{related:'Powiązane artykuły', prev:'POPRZEDNI', next:'NASTĘPNY', lang:'Język'},
360    ro:{related:'Articole similare', prev:'ANTERIOR', next:'URMĂTOR', lang:'Limbă'},
361    tr:{related:'İlgili yazılar', prev:'ÖNCEKİ', next:'SONRAKİ', lang:'Dil'},
362    ko:{related:'관련 글', prev:'이전 글', next:'다음 글', lang:'언어'},
363    hi:{related:'संबंधित लेख', prev:'पिछला लेख', next:'अगला लेख', lang:'भाषा'},
364    ar:{related:'مقالات ذات صلة', prev:'السابق', next:'التالي', lang:'اللغة'},
365    fa:{related:'نوشته‌های مرتبط', prev:'قبلی', next:'بعدی', lang:'زبان'}
366  };
367
368  var CAT_BY_LANG = {fi:6, en:7, de:8, fr:9, es:10, pt:11, pl:12, ro:13, tr:14, ko:15, hi:16, ar:17, fa:18};
369
370  // 1) URL-prefix, 2) hreflang-linkki joka osoittaa tähän sivuun, 3) fi
371  function detectLang(){
372    var seg = location.pathname.split('/').filter(Boolean)[0];
373    if (KNOWN.indexOf(seg) !== -1) return seg;
374    var links = document.querySelectorAll('link[rel="alternate"][hreflang]');
375    for (var i = 0; i < links.length; i++){
376      try {
377        var href = new URL(links[i].getAttribute('href'), location.origin).pathname;
378        if (href === location.pathname){
379          var code = (links[i].getAttribute('hreflang') || '').split('-')[0].toLowerCase();
380          if (code === 'fi') return 'fi';
381          if (KNOWN.indexOf(code) !== -1) return code;
382        }
383      } catch(e){}
384    }
385    return 'fi';
386  }
387
388  var LANG = detectLang();
389  var LAB = LABELS[LANG] || LABELS.fi;
390  // lang ja dir tulevat nykyään palvelimelta (hdsoft-jsonld.php,
391  // language_attributes-filtteri). Asetetaan silti sama arvo varmuuden vuoksi —
392  // mutta EI poisteta dir-attribuuttia, koska palvelin asettaa sen tarkoituksella.
393  document.documentElement.setAttribute('lang', LANG);
394  document.documentElement.setAttribute('dir', (LANG === 'ar' || LANG === 'fa') ? 'rtl' : 'ltr');
395
396  function navFor(l){ return NAV[l] || NAV.fi; }
397
398  // Kielenvaihtaja: kohde-URL luetaan sivun omista hreflang-linkeistä, joten
399  // vaihto vie TÄMÄN sivun käännökseen eikä kielen etusivulle. Jos käännöstä ei
400  // ole, kohteena on kielen juuri.
401  // Sivuston OMA header — ei mikä tahansa <header>.
402  //
403  // Evästemodaalissa (#stcm-wrapper, hdsoft-consent.php) on oma <header>, ja
404  // koska Silktide lisää wrapperinsa bodyn ENSIMMÄISEKSI lapseksi, se tulee
405  // dokumenttijärjestyksessä ennen sivuston headeria. `querySelector('header')`
406  // nappasi sen, ja kielenvaihtaja rakentui evästeikkunan sisään — sivuston
407  // omasta headerista se katosi kokonaan (havaittu 11.8.2026 heti bannerin
408  // käyttöönoton jälkeen).
409  //
410  // Tunnistetaan header sisällöstä eikä järjestyksestä, jotta mikään muukaan
411  // myöhemmin lisättävä widget ei voi varastaa paikkaa.
412  function siteHeader(){
413    var hs = document.querySelectorAll('header'), i;
414    for (i = 0; i < hs.length; i++){
415      if (hs[i].closest('#stcm-wrapper')) continue;
416      if (hs[i].querySelector('.bricks-nav-menu, a.brxe-logo, .brxw-header-01__inner')) return hs[i];
417    }
418    for (i = 0; i < hs.length; i++){
419      if (!hs[i].closest('#stcm-wrapper')) return hs[i];
420    }
421    return null;
422  }
423
424  function buildLangSwitch(){
425    var header = siteHeader();
426    if (!header || header.querySelector('.hdsoft-langswitch')) return;
427    var host = header.querySelector('.brxw-header-01__inner') || header.querySelector('.brxe-container') || header;
428
429    var alts = {};
430    document.querySelectorAll('link[rel="alternate"][hreflang]').forEach(function(l){
431      var code = (l.getAttribute('hreflang') || '').split('-')[0].toLowerCase();
432      if (code && code !== 'x' && !alts[code]) alts[code] = l.getAttribute('href');
433    });
434
435    var root = document.createElement('div');
436    root.className = 'hdsoft-langswitch';
437
438    var btn = document.createElement('button');
439    btn.type = 'button';
440    btn.className = 'hdsoft-langswitch__current';
441    btn.setAttribute('aria-expanded', 'false');
442    btn.setAttribute('aria-label', LAB.lang);
443    btn.innerHTML = '<span class="hdsoft-langswitch__flag"></span> ' +
444                    '<span class="hdsoft-langswitch__label"></span>';
445    btn.querySelector('.hdsoft-langswitch__flag').textContent = (LANGS[LANG] || LANGS.fi).flag;
446    btn.querySelector('.hdsoft-langswitch__label').textContent = (LANGS[LANG] || LANGS.fi).name;
447
448    var menu = document.createElement('ul');
449    menu.className = 'hdsoft-langswitch__menu';
450    menu.setAttribute('hidden', '');
451    ['fi'].concat(KNOWN).forEach(function(l){
452      var meta = LANGS[l];
453      if (!meta) return;
454      var url = alts[l] || (navFor(l)[0] && navFor(l)[0].u) || '/';
455      var li = document.createElement('li');
456      var a = document.createElement('a');
457      a.setAttribute('href', url);
458      a.setAttribute('lang', l);
459      a.textContent = meta.flag + ' ' + meta.name;
460      if (l === LANG) a.setAttribute('aria-current', 'true');
461      li.appendChild(a);
462      menu.appendChild(li);
463    });
464
465    btn.addEventListener('click', function(){
466      var closed = menu.hasAttribute('hidden');
467      if (closed) menu.removeAttribute('hidden'); else menu.setAttribute('hidden', '');
468      btn.setAttribute('aria-expanded', closed ? 'true' : 'false');
469    });
470    document.addEventListener('click', function(e){
471      if (!root.contains(e.target)){
472        menu.setAttribute('hidden', '');
473        btn.setAttribute('aria-expanded', 'false');
474      }
475    });
476
477    root.appendChild(btn);
478    root.appendChild(menu);
479    host.appendChild(root);
480  }
481
482  function headerMenu(){
483    var h = siteHeader();
484    return h ? h.querySelector('.bricks-nav-menu, nav.bricks-nav-menu') : null;
485  }
486
487  function translateHeaderNav(){
488    var wrap = headerMenu();
489    if (!wrap) return;
490    var items = navFor(LANG);
491    wrap.querySelectorAll(':scope > li').forEach(function(li, idx){
492      if (idx >= items.length) return;
493      var link = li.querySelector(':scope > a, :scope > div.brx-submenu-toggle > a, :scope > div > a');
494      if (link){
495        link.textContent = items[idx].t;
496        link.setAttribute('href', items[idx].u);
497      }
498    });
499  }
500
501  function translateDropdowns(){
502    var ftr = FOOTER[LANG] || FOOTER.fi;
503    var proj = PROJECTS[LANG] || PROJECTS.fi;
504    var dropdownData = [ftr.svc, ftr.prd, proj];
505    var wrap = headerMenu();
506    if (!wrap) return;
507    var dropdownIdx = 0;
508    wrap.querySelectorAll(':scope > li').forEach(function(li){
509      var submenu = li.querySelector(':scope > ul, :scope > .sub-menu, :scope > .brx-submenu');
510      if (!submenu) return;
511      var items = dropdownData[dropdownIdx++];
512      if (!items) return;
513      var subLis = submenu.querySelectorAll(':scope > li');
514      // Valikossa voi olla vähemmän itemejä kuin datassa (esim. uusi tuote, jota
515      // ei ole vielä lisätty WP-valikkoon) → puuttuvat lisätään loppuun.
516      subLis.forEach(function(subLi, i){
517        if (i >= items.length){ subLi.style.display = 'none'; return; }
518        var a = subLi.querySelector('a');
519        if (!a) return;
520        a.textContent = items[i].t;
521        a.setAttribute('href', items[i].u);
522      });
523      for (var i = subLis.length; i < items.length; i++){
524        var model = subLis[subLis.length - 1];
525        if (!model) break;
526        var clone = model.cloneNode(true);
527        clone.style.display = '';
528        var a = clone.querySelector('a');
529        if (a){
530          a.textContent = items[i].t;
531          a.setAttribute('href', items[i].u);
532        }
533        submenu.appendChild(clone);
534      }
535    });
536  }
537
538  function fixLogoAndLinks(){
539    var homeUrl = navFor(LANG)[0].u;
540    var h = siteHeader();
541    if (h) {
542      h.querySelectorAll('a.brxe-logo, a.bricks-site-logo, .brxw-header-01__logo a').forEach(function(a){
543        if (a.tagName === 'A') a.setAttribute('href', homeUrl);
544      });
545    }
546    document.querySelectorAll('a[target="_blank"]').forEach(function(a){
547      var href = a.getAttribute('href') || '';
548      var isInternal = href.charAt(0) === '/' || href.indexOf('hdsoft.fi') !== -1 || href.charAt(0) === '#' || href === '';
549      if (isInternal && !a.closest('#wpadminbar')){
550        a.removeAttribute('target');
551        a.removeAttribute('rel');
552      }
553    });
554  }
555
556  function translateFooter(){
557    var ftr = FOOTER[LANG] || FOOTER.fi;
558    document.querySelectorAll('footer .brxw-footer-03__title, footer h4').forEach(function(el, idx){
559      if (idx < ftr.titles.length) el.textContent = ftr.titles[idx];
560    });
561    var colData = [ftr.svc, ftr.prd, ftr.cmp];
562    document.querySelectorAll('footer .brxw-footer-03__nav-col').forEach(function(col, ci){
563      var data = colData[ci] || [];
564      var links = col.querySelectorAll('a');
565      links.forEach(function(a, li){
566        if (li < data.length){
567          a.textContent = data[li].t;
568          a.setAttribute('href', data[li].u);
569        } else {
570          a.style.display = 'none';
571        }
572      });
573      // Sama kuin dropdowneissa: datassa voi olla enemmän kuin valikossa
574      var list = links.length ? links[0].parentElement.parentElement : null;
575      for (var i = links.length; i < data.length && list; i++){
576        var model = links[links.length - 1];
577        if (!model) break;
578        var liEl = model.parentElement.cloneNode(true);
579        liEl.style.display = '';
580        var a = liEl.querySelector('a');
581        if (a){
582          a.style.display = '';
583          a.textContent = data[i].t;
584          a.setAttribute('href', data[i].u);
585        }
586        list.appendChild(liEl);
587      }
588    });
589    document.querySelectorAll('footer a[href*="tietosuojaseloste"], footer a[href*="datenschutz"], footer a[href*="privacy"], footer a[href*="confidentialite"], footer a[href*="privacidad"]').forEach(function(a){
590      a.textContent = ftr.priv;
591    });
592    document.querySelectorAll('footer p, footer .brxe-text-basic').forEach(function(el){
593      var txt = el.textContent || '';
594      if (txt.indexOf('Kaikki oikeudet pidätetään') !== -1){
595        el.textContent = txt.replace('Kaikki oikeudet pidätetään.', ftr.copy);
596      }
597    });
598  }
599
600  function translateLabels(){
601    document.querySelectorAll('h2, h3, h4').forEach(function(el){
602      var t = (el.textContent || '').trim();
603      if (t === 'Related posts' || t === 'Aiheeseen liittyvät') el.textContent = LAB.related;
604    });
605    document.querySelectorAll('.bricks-post-nav, .brxe-post-navigation, .post-navigation').forEach(function(navEl){
606      navEl.querySelectorAll('span, small, em, strong, b, p').forEach(function(el){
607        if (el.children.length) return;
608        var t = (el.textContent || '').trim().toUpperCase();
609        if (t === 'PREVIOUS POST') el.textContent = LAB.prev;
610        if (t === 'NEXT POST') el.textContent = LAB.next;
611      });
612    });
613  }
614
615  function isSinglePost(){
616    return /^\/\d{4}\/\d{2}\/\d{2}\//.test(location.pathname);
617  }
618
619  function currentSlug(){
620    var m = location.pathname.match(/\/(\d{4})\/(\d{2})\/(\d{2})\/([^\/]+)\/?$/);
621    return m ? m[4] : '';
622  }
623
624  // Related posts ja prev/next tulevat Bricksiltä koko blogista — suodatetaan
625  // saman kielen kategoriaan (cat 6–18), muuten suomenkielisen artikkelin perässä
626  // on saksankielisiä suosituksia.
627  function fixRelatedPosts(){
628    if (!isSinglePost()) return;
629    var cat = CAT_BY_LANG[LANG];
630    var rel = document.querySelector('.brxe-related-posts');
631    if (!cat || !rel) return;
632    var ul = rel.querySelector('ul.related-posts');
633    if (!ul) return;
634    var slug = currentSlug();
635    fetch('/wp-json/wp/v2/posts?categories=' + cat + '&per_page=4&_embed').then(function(r){ return r.json(); }).then(function(posts){
636      if (!Array.isArray(posts)) return;
637      var filtered = posts.filter(function(p){ return p.slug !== slug; }).slice(0, 3);
638      if (!filtered.length){ rel.style.display = 'none'; return; }
639      var locale = LANG === 'fi' ? 'fi-FI' : LANG;
640      ul.innerHTML = filtered.map(function(p){
641        var fm = p._embedded && p._embedded['wp:featuredmedia'];
642        var img = fm && fm[0] && fm[0].source_url ? fm[0].source_url : '';
643        var dateStr;
644        try { dateStr = new Date(p.date).toLocaleDateString(locale); } catch(e){ dateStr = p.date.slice(0, 10); }
645        // alt postauksen otsikosta: tyhjä alt jättäisi kuvan ruudunlukijalle
646        // nimettömäksi, ja kuva on tässä sisältöä (ei koriste)
647        var alt = String(p.title.rendered || '').replace(/<[^>]*>/g, '').replace(/"/g, '&quot;');
648        var figure = img ? '<figure><a href="' + p.link + '"><img src="' + img + '" alt="' + alt + '" loading="lazy"></a></figure>' : '';
649        return '<li class="repeater-item">' + figure + '<div><h3><a href="' + p.link + '">' + p.title.rendered +
650               '</a></h3><time datetime="' + p.date + '">' + dateStr + '</time></div></li>';
651      }).join('');
652    }).catch(function(){});
653  }
654
655  function fixPostNav(){
656    if (!isSinglePost()) return;
657    var cat = CAT_BY_LANG[LANG];
658    var navEl = document.querySelector('.bricks-post-nav, .brxe-post-navigation, .post-navigation');
659    if (!cat || !navEl) return;
660    var slug = currentSlug();
661    fetch('/wp-json/wp/v2/posts?categories=' + cat + '&per_page=100&orderby=date&order=desc&_fields=id,slug,link,date,title')
662      .then(function(r){ return r.json(); }).then(function(posts){
663      if (!Array.isArray(posts) || !posts.length){ navEl.style.display = 'none'; return; }
664      var idx = -1;
665      for (var i = 0; i < posts.length; i++){ if (posts[i].slug === slug){ idx = i; break; } }
666      if (idx === -1){ navEl.style.display = 'none'; return; }
667      var older = posts[idx + 1] || null, newer = posts[idx - 1] || null;
668      var anchors = navEl.querySelectorAll('a');
669      var prevA = navEl.querySelector('a.prev, a[class*="prev"], a[rel="prev"]') || anchors[0] || null;
670      var nextA = navEl.querySelector('a.next, a[class*="next"], a[rel="next"]') || anchors[1] || null;
671      function rewrite(a, post, label){
672        if (!a) return;
673        if (!post){ a.style.display = 'none'; return; }
674        a.style.display = '';
675        a.setAttribute('href', post.link);
676        var labelSet = false, titleSet = false;
677        a.querySelectorAll('span, p, div, h1, h2, h3, h4, h5, h6').forEach(function(s){
678          if (s.children.length) return;
679          var t = (s.textContent || '').trim().toUpperCase();
680          if (!labelSet && (t === 'PREVIOUS POST' || t === 'NEXT POST' ||
681                            t === LAB.prev.toUpperCase() || t === LAB.next.toUpperCase())){
682            s.textContent = label;
683            labelSet = true;
684          } else if (!titleSet && (s.textContent || '').trim().length > 5){
685            s.textContent = post.title.rendered
686              .replace(/&#8217;/g, "'").replace(/&amp;/g, '&')
687              .replace(/&#8211;/g, '–').replace(/&#8212;/g, '—');
688            titleSet = true;
689          }
690        });
691        if (!titleSet) a.setAttribute('aria-label', post.title.rendered);
692      }
693      rewrite(prevA, older, LAB.prev);
694      rewrite(nextA, newer, LAB.next);
695    }).catch(function(){});
696  }
697
698  function runAll(){
699    try { buildLangSwitch(); } catch(e){}
700    try { translateHeaderNav(); } catch(e){}
701    try { translateDropdowns(); } catch(e){}
702    try { fixLogoAndLinks(); } catch(e){}
703    try { translateFooter(); } catch(e){}
704    try { translateLabels(); } catch(e){}
705    try { fixRelatedPosts(); } catch(e){}
706    try { fixPostNav(); } catch(e){}
707  }
708
709  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', runAll);
710  else runAll();
711})();</script>
vendor: 1 bytes, line 711
711
712<script type="speculationrules">
713{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/bricks/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
714</script>
vendor: 1 bytes, line 714
714
715<script id="bricks-scripts-js-extra">
716var bricksData = {"debug":"","locale":"fi_FI","ajaxUrl":"https://hdsoft.fi/wp-admin/admin-ajax.php","restApiUrl":"https://hdsoft.fi/wp-json/bricks/v1/","nonce":"f24fa1a0aa","formNonce":"6567b82b7d","wpRestNonce":"c571e0b42d","postId":"204","recaptchaIds":[],"animatedTypingInstances":[],"videoInstances":[],"splideInstances":[],"tocbotInstances":[],"swiperInstances":[],"queryLoopInstances":[],"interactions":[],"filterInstances":[],"isotopeInstances":[],"activeFiltersCountInstances":[],"googleMapInstances":[],"leafletMapInstances":[],"choicesInstances":[],"facebookAppId":"","headerPosition":"top","offsetLazyLoad":"300","baseUrl":"https://hdsoft.fi/projektit/ai-universal-search/","useQueryFilter":"","pageFilters":[],"language":"","wpmlUrlFormat":"","multilangPlugin":"","i18n":{"choicesjs":{"noChoicesText":"No choices to choose from","noResultsText":"No results found","removeItemIconText":"Remove item","search":"Search"},"close":"Close","closeMobileMenu":"Close mobile menu","firstSlide":"Go to first slide","hidePassword":"Hide password","lastSlide":"Go to last slide","locationContent":"Location content","locationSubtitle":"Location subtitle","locationTitle":"Location title","nextSlide":"Next slide","noLocationsFound":"No locations found","openAccordion":"Open accordion","openMobileMenu":"Open mobile menu","pause":"Pause autoplay","play":"Start autoplay","prevSlide":"Previous slide","remove":"Remove","showPassword":"Show password","slideX":"Go to slide %s","splide":{"carousel":"carousel","select":"Select a slide to show","slide":"slide","slideLabel":"%1$s of %2$s"},"swiper":{"paginationBulletMessage":"Go to slide {{index}}","slideLabelMessage":"{{index}} / {{slidesLength}}"},"zoom":"Zoom"},"selectedFilters":[],"filterNiceNames":[],"bricksGoogleMarkerScript":"https://hdsoft.fi/wp-content/themes/bricks/assets/js/libs/bricks-google-marker.min.js?v=2.3.10","infoboxScript":"https://hdsoft.fi/wp-content/themes/bricks/assets/js/libs/infobox.min.js?v=2.3.10","markerClustererScript":"https://hdsoft.fi/wp-content/themes/bricks/assets/js/libs/markerclusterer.min.js?v=2.3.10","mainQueryId":"","activeSearchTemplate":"0","defaultMode":"light"};
717//# sourceURL=bricks-scripts-js-extra
718</script>
vendor: 1 bytes, line 718
718
719<script id="bricks-scripts-js" src="https://hdsoft.fi/wp-content/themes/bricks/assets/js/bricks.min.js?ver=1785440766"></script>
vendor: 1 bytes, line 719
719
720<script id="wp-emoji-settings" type="application/json">
721{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://hdsoft.fi/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}}
722</script>
vendor: 1 bytes, line 722
722
723<script type="module">
724/*! This file is auto-generated */
725var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
726//# sourceURL=https://hdsoft.fi/wp-includes/js/wp-emoji-loader.min.js
727</script>
727
728</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.