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 » Feed" href="https://hdsoft.fi/feed/" /> 46<link rel="alternate" type="application/rss+xml" title="HD SofT Oy » 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&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&display=swap&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&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>“Mikä oli viime kuun kokonaismyynti?”</em> tai <em>“Onko CRM:ssä käyttäjä John Smith?”</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>“Näytä asiakkaat, joilla on viimeaikaista myyntiä”</em> tai <em>“Etsi projektit, joilla on myöhästyneitä tehtäviä”</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">© 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, '"'); 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(/’/g, "'").replace(/&/g, '&') 687 .replace(/–/g, 'â').replace(/—/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.