[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0":3,"doc-\u002Fdocs\u002Fextending\u002Ftranslations":17,"docs-nav":604,"nav-compare":677,"editor-i1gzp7":687,"editor-12wo5l1":689,"editor-yvt9hv":691,"editor-9rw8rc":693,"editor-xjikij":695,"editor-1jgayw9":697},["Island",4],{"key":5,"result":6},"SiteFooter_cLEacilcm59lTjFJjLY6mXNWLL0ETtzOIiZwIHgDpy0",{"head":7},{"style":8},[9,11,13,15],{"innerHTML":10},".site-footer[data-v-8bb1d4ae]{border-top:1px solid var(--line);background:var(--chrome);padding:var(--sp-8) var(--gutter) var(--sp-10);gap:var(--sp-6);flex-direction:column;display:flex}.links[data-v-8bb1d4ae]{gap:var(--sp-4);grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));max-width:62rem;display:grid}.links a[data-v-8bb1d4ae]{align-items:flex-start;gap:var(--sp-3);padding:var(--sp-3);border-bottom:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);border:1px solid var(--line);display:flex}.links a[data-v-8bb1d4ae]:focus-visible,.links a[data-v-8bb1d4ae]:hover{border-color:var(--line-strong)}.links[data-v-8bb1d4ae] .mark,.links[data-v-8bb1d4ae] .rf-mark{width:1.35rem;height:1.35rem;color:var(--dim);flex:none;margin-top:.1rem}.links a[data-v-8bb1d4ae]:hover .mark,.links a[data-v-8bb1d4ae]:hover .rf-mark{color:var(--red)}.links span[data-v-8bb1d4ae]{flex-direction:column;gap:2px;min-width:0;display:flex}.links b[data-v-8bb1d4ae]{font-family:var(--font-display);font-size:.85rem;font-weight:400}.links small[data-v-8bb1d4ae]{color:var(--faint);font-size:.78rem}.colophon[data-v-8bb1d4ae]{color:var(--faint);margin:0;font-size:.75rem}@supports (corner-shape:bevel){.links a[data-v-8bb1d4ae]{corner-shape:bevel}}",{"innerHTML":12},".mark[data-v-cc0d96a5]{vertical-align:-.125em;flex:none;width:1em;height:1em}",{"innerHTML":14},".mark[data-v-26f5673d]{vertical-align:-.125em;flex:none;width:1em;height:1em}",{"innerHTML":16},".rf-mark[data-v-26317b3e]{fill:currentColor;stroke:none;flex:none}",{"id":18,"title":19,"body":20,"description":596,"extension":597,"meta":598,"navigation":142,"order":152,"path":599,"section":600,"seo":601,"stem":602,"__hash__":603},"docs\u002Fdocs\u002Fextending\u002Ftranslations.md","Translating keywords",{"type":21,"value":22,"toc":589},"minimark",[23,36,39,51,56,59,82,85,89,114,126,192,206,227,231,237,254,404,419,430,433,438,457,461,464,483,486,495,511,514,517,547,556,560,568,576,585],[24,25,26,27,31,32,35],"p",{},"Browser's keyword names and documentation can be translated. ",[28,29,30],"code",{},"Click"," becomes\n",[28,33,34],{},"Klikkaa",", and the documentation your IDE shows on hover comes back in the same\nlanguage.",[24,37,38],{},"This page has two halves: using a translation that already exists, which is two\nlines, and writing one, which is a small Python package.",[40,41,42],"doc-note",{},[24,43,44,45,50],{},"Translating is a form of extending — a translation is a Python package that\nBrowser discovers through a plugin API — which is why it lives in this chapter\nrather than under ",[46,47,49],"a",{"href":48},"\u002Fdocs\u002Foperations\u002Fnode-process","Running it",".",[52,53,55],"h2",{"id":54},"using-a-translation","Using a translation",[24,57,58],{},"Install the package and name the language on import:",[60,61,66],"pre",{"className":62,"code":63,"language":64,"meta":65,"style":65},"language-robot shiki shiki-themes github-light github-dark","*** Settings ***\nLibrary    Browser    language=fi\n","robot","",[28,67,68,76],{"__ignoreMap":65},[69,70,73],"span",{"class":71,"line":72},"line",1,[69,74,75],{},"*** Settings ***\n",[69,77,79],{"class":71,"line":78},2,[69,80,81],{},"Library    Browser    language=fi\n",[24,83,84],{},"That is the whole thing. From that point the suite is written in translated\nkeyword names, and Libdoc shows the translated documentation — as do the editors\nthat read Libdoc output.",[52,86,88],{"id":87},"how-browser-finds-it","How Browser finds it",[24,90,91,92,98,99,102,103,108,109,113],{},"There is no registry and no configuration file. Browser searches the\n",[46,93,97],{"href":94,"rel":95},"https:\u002F\u002Frobotframework.org\u002Frobotframework\u002Flatest\u002FRobotFrameworkUserGuide.html#module-search-path",[96],"nofollow","module search path","\nfor installed Python packages whose name starts with\n",[28,100,101],{},"robotframework_browser_translation",", using the\n",[46,104,107],{"href":105,"rel":106},"https:\u002F\u002Fpackaging.python.org\u002Fen\u002Flatest\u002Fguides\u002Fcreating-and-discovering-plugins\u002F",[96],"Python plugin API",".\nThe naming convention ",[110,111,112],"em",{},"is"," the discovery mechanism, so the prefix is not\noptional.",[24,115,116,117,120,121,125],{},"Each package implements exactly one function, ",[28,118,119],{},"get_language",", taking no\narguments and returning a ",[122,123,124],"strong",{},"list of dicts"," — one entry per language the package\ndeclares:",[60,127,131],{"className":128,"code":129,"language":130,"meta":65,"style":65},"language-python shiki shiki-themes github-light github-dark","from pathlib import Path\n\ndef get_language() -> list:\n    here = Path(__file__).parent.absolute()\n    return [\n        {\n            \"language\": \"fi\",          # matched case-insensitively against language=\n            \"path\": here \u002F \"fi.json\",  # the translation data\n        },\n    ]\n","python",[28,132,133,138,144,150,156,162,168,174,180,186],{"__ignoreMap":65},[69,134,135],{"class":71,"line":72},[69,136,137],{},"from pathlib import Path\n",[69,139,140],{"class":71,"line":78},[69,141,143],{"emptyLinePlaceholder":142},true,"\n",[69,145,147],{"class":71,"line":146},3,[69,148,149],{},"def get_language() -> list:\n",[69,151,153],{"class":71,"line":152},4,[69,154,155],{},"    here = Path(__file__).parent.absolute()\n",[69,157,159],{"class":71,"line":158},5,[69,160,161],{},"    return [\n",[69,163,165],{"class":71,"line":164},6,[69,166,167],{},"        {\n",[69,169,171],{"class":71,"line":170},7,[69,172,173],{},"            \"language\": \"fi\",          # matched case-insensitively against language=\n",[69,175,177],{"class":71,"line":176},8,[69,178,179],{},"            \"path\": here \u002F \"fi.json\",  # the translation data\n",[69,181,183],{"class":71,"line":182},9,[69,184,185],{},"        },\n",[69,187,189],{"class":71,"line":188},10,[69,190,191],{},"    ]\n",[40,193,195],{"kind":194},"warning",[24,196,197,198,201,202,205],{},"It must be a list. Browser iterates the return value and ignores anything that\nis not a list — a bare dict is dropped ",[122,199,200],{},"silently",", with no warning, and your\nsuite runs in English as though the package were not installed. The same is true\nof a misnamed function or a ",[28,203,204],{},"language="," nobody declares.",[24,207,208,211,212,214,215,218,219,222,223,226],{},[28,209,210],{},"language"," is compared against the ",[28,213,204],{}," import parameter, ignoring case.\n",[28,216,217],{},"path"," may be a string or a ",[28,220,221],{},"Path",", and a relative one is resolved against the\nworking directory — so build it from ",[28,224,225],{},"Path(__file__).parent"," rather than writing\nit by hand.",[52,228,230],{"id":229},"the-translation-file","The translation file",[24,232,233,234,236],{},"JSON. The name and extension do not matter — ",[28,235,217],{}," says where it is.",[24,238,239,240,243,244,246,247,250,251,253],{},"The keys are ",[122,241,242],{},"method names, not keyword names",". ",[28,245,30],{}," is implemented by a\nmethod called ",[28,248,249],{},"click",", so the key is ",[28,252,249],{},". This trips people up, and it is\ndeliberate: a keyword's name is the thing being translated, so it cannot also be\nthe thing used to look the translation up.",[60,255,260],{"className":256,"code":257,"filename":258,"language":259,"meta":65,"style":65},"language-json shiki shiki-themes github-light github-dark","{\n  \"__intro__\": {\n    \"doc\": \"Selainkirjasto Robot Frameworkille.\",\n    \"sha256\": \"b1946ac92492d2347c6235b4d2611184\"\n  },\n  \"click\": {\n    \"name\": \"Klikkaa\",\n    \"doc\": \"Klikkaa elementtiä, joka vastaa valitsinta.\",\n    \"sha256\": \"3a7bd3e2360a3d29eea436fcfb7e44c7\"\n  },\n  \"fill_text\": {\n    \"name\": \"Täytä Teksti\",\n    \"doc\": \"Kirjoittaa tekstin syöttökenttään.\",\n    \"sha256\": \"9f2feb8255f4b3d1d0f2a4a3b1c7e0d9\"\n  }\n}\n","fi.json","json",[28,261,262,268,277,292,302,307,314,326,337,346,350,358,370,382,392,398],{"__ignoreMap":65},[69,263,264],{"class":71,"line":72},[69,265,267],{"class":266},"sVt8B","{\n",[69,269,270,274],{"class":71,"line":78},[69,271,273],{"class":272},"sj4cs","  \"__intro__\"",[69,275,276],{"class":266},": {\n",[69,278,279,282,285,289],{"class":71,"line":146},[69,280,281],{"class":272},"    \"doc\"",[69,283,284],{"class":266},": ",[69,286,288],{"class":287},"sZZnC","\"Selainkirjasto Robot Frameworkille.\"",[69,290,291],{"class":266},",\n",[69,293,294,297,299],{"class":71,"line":152},[69,295,296],{"class":272},"    \"sha256\"",[69,298,284],{"class":266},[69,300,301],{"class":287},"\"b1946ac92492d2347c6235b4d2611184\"\n",[69,303,304],{"class":71,"line":158},[69,305,306],{"class":266},"  },\n",[69,308,309,312],{"class":71,"line":164},[69,310,311],{"class":272},"  \"click\"",[69,313,276],{"class":266},[69,315,316,319,321,324],{"class":71,"line":170},[69,317,318],{"class":272},"    \"name\"",[69,320,284],{"class":266},[69,322,323],{"class":287},"\"Klikkaa\"",[69,325,291],{"class":266},[69,327,328,330,332,335],{"class":71,"line":176},[69,329,281],{"class":272},[69,331,284],{"class":266},[69,333,334],{"class":287},"\"Klikkaa elementtiä, joka vastaa valitsinta.\"",[69,336,291],{"class":266},[69,338,339,341,343],{"class":71,"line":182},[69,340,296],{"class":272},[69,342,284],{"class":266},[69,344,345],{"class":287},"\"3a7bd3e2360a3d29eea436fcfb7e44c7\"\n",[69,347,348],{"class":71,"line":188},[69,349,306],{"class":266},[69,351,353,356],{"class":71,"line":352},11,[69,354,355],{"class":272},"  \"fill_text\"",[69,357,276],{"class":266},[69,359,361,363,365,368],{"class":71,"line":360},12,[69,362,318],{"class":272},[69,364,284],{"class":266},[69,366,367],{"class":287},"\"Täytä Teksti\"",[69,369,291],{"class":266},[69,371,373,375,377,380],{"class":71,"line":372},13,[69,374,281],{"class":272},[69,376,284],{"class":266},[69,378,379],{"class":287},"\"Kirjoittaa tekstin syöttökenttään.\"",[69,381,291],{"class":266},[69,383,385,387,389],{"class":71,"line":384},14,[69,386,296],{"class":272},[69,388,284],{"class":266},[69,390,391],{"class":287},"\"9f2feb8255f4b3d1d0f2a4a3b1c7e0d9\"\n",[69,393,395],{"class":71,"line":394},15,[69,396,397],{"class":266},"  }\n",[69,399,401],{"class":71,"line":400},16,[69,402,403],{"class":266},"}\n",[24,405,406,407,410,411,414,415,418],{},"The ",[28,408,409],{},"sha256"," is written by the generator. It is a checksum of the ",[122,412,413],{},"English","\ndocumentation the entry was translated from — encoded as UTF-16, which is worth\nknowing only if you ever compute one yourself. Leave it alone; it is what\n",[28,416,417],{},"--compare"," uses to tell you which docs have changed since you translated them.",[24,420,421,422,425,426,429],{},"Each entry may carry ",[28,423,424],{},"name",", ",[28,427,428],{},"doc",", or both. Providing only one is valid — a\npackage can translate names without translating documentation — but translating\nboth is what makes the library actually feel native, so do both if you can.",[24,431,432],{},"Two special keys are not keywords:",[434,435],"doc-table",{":head":436,":rows":437},"[\"Key\",\"Translates\"]","[[\"`__intro__`\",\"The library's own documentation, the introduction shown at the top of the keyword reference.\"],[\"`__init__`\",\"The import parameters — what you see when you look up the `Browser` import.\"]]",[40,439,441],{"kind":440},"note",[24,442,443,446,447,450,451,453,454,456],{},[28,444,445],{},"__intro__"," and ",[28,448,449],{},"__init__"," are not keywords, so only their ",[28,452,428],{}," is used. The\ngenerator leaves their ",[28,455,424],{}," as it found it, and so should you — nothing reads\nit as a keyword name.",[52,458,460],{"id":459},"generating-the-template","Generating the template",[24,462,463],{},"Do not type the key list by hand. Browser will produce a complete, correctly\nshaped file with the English text in place, ready to translate over:",[60,465,469],{"className":466,"code":467,"language":468,"meta":65,"style":65},"language-bash shiki shiki-themes github-light github-dark","rfbrowser translation \u002Fpath\u002Fto\u002Ftranslation.json\n","bash",[28,470,471],{"__ignoreMap":65},[69,472,473,477,480],{"class":71,"line":72},[69,474,476],{"class":475},"sScJk","rfbrowser",[69,478,479],{"class":287}," translation",[69,481,482],{"class":287}," \u002Fpath\u002Fto\u002Ftranslation.json\n",[24,484,485],{},"The command translates nothing — it gives you every keyword, in the right format,\nwith nothing missing.",[24,487,488,489,491,492,494],{},"After a Browser upgrade, do not diff by hand. Every generated entry carries a\n",[28,490,409],{}," of the English documentation it was translated from, and ",[28,493,417],{},"\nuses it:",[60,496,498],{"className":466,"code":497,"language":468,"meta":65,"style":65},"rfbrowser translation --compare \u002Fpath\u002Fto\u002Ftranslation.json\n",[28,499,500],{"__ignoreMap":65},[69,501,502,504,506,509],{"class":71,"line":72},[69,503,476],{"class":475},[69,505,479],{"class":287},[69,507,508],{"class":272}," --compare",[69,510,482],{"class":287},[24,512,513],{},"It writes nothing. It prints a table of what changed: keywords missing a\ntranslation, entries whose documentation checksum no longer matches, entries\nwith no checksum at all, and keywords that have left the library. Nothing\nvalidates that checksum at runtime — it exists only for this comparison.",[24,515,516],{},"If your suites use plugins or JavaScript extensions, include their keywords too:",[60,518,520],{"className":466,"code":519,"language":468,"meta":65,"style":65},"rfbrowser translation --plugings myplugin.SomePlugin \\\n    --jsextension \u002Fpath\u002Fto\u002Fjsplugin.js \u002Fpath\u002Fto\u002Ftranslation.json\n",[28,521,522,537],{"__ignoreMap":65},[69,523,524,526,528,531,534],{"class":71,"line":72},[69,525,476],{"class":475},[69,527,479],{"class":287},[69,529,530],{"class":272}," --plugings",[69,532,533],{"class":287}," myplugin.SomePlugin",[69,535,536],{"class":272}," \\\n",[69,538,539,542,545],{"class":71,"line":78},[69,540,541],{"class":272},"    --jsextension",[69,543,544],{"class":287}," \u002Fpath\u002Fto\u002Fjsplugin.js",[69,546,482],{"class":287},[40,548,549],{"kind":194},[24,550,551,552,555],{},"The flag really is spelled ",[28,553,554],{},"--plugings",". It is a typo that shipped and now cannot\nbe corrected without breaking everyone using it.",[52,557,559],{"id":558},"a-worked-example","A worked example",[24,561,562,567],{},[46,563,566],{"href":564,"rel":565},"https:\u002F\u002Fgithub.com\u002FMarketSquare\u002Frobotframework-browser-translation-fi",[96],"robotframework-browser-translation-fi","\nis a published translation package, small enough to read in one sitting, and a\ngood model for the packaging and the JSON.",[40,569,570],{"kind":194},[24,571,572,573,575],{},"Do not copy its ",[28,574,119],{}," as it stands. It returns a bare dict, which\ncurrent Browser ignores silently — wrap the dict in a list, as above, and it\nworks.",[24,577,578,579,584],{},"If you translate Browser into a language nobody has covered, please publish it\nand tell us — ",[46,580,583],{"href":581,"rel":582},"https:\u002F\u002Fforum.robotframework.org\u002Fc\u002Flibraries\u002Fbrowser",[96],"the forum","\nis the right place, and we will link it from here.",[586,587,588],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":65,"searchDepth":78,"depth":78,"links":590},[591,592,593,594,595],{"id":54,"depth":78,"text":55},{"id":87,"depth":78,"text":88},{"id":229,"depth":78,"text":230},{"id":459,"depth":78,"text":460},{"id":558,"depth":78,"text":559},"Using a translation package to get keyword names and documentation in your language, and writing one for a language nobody has covered yet.","md",{},"\u002Fdocs\u002Fextending\u002Ftranslations","extending",{"title":19,"description":596},"docs\u002Fextending\u002Ftranslations","xBRYp08DeV1-7b8RGcr-B4Eo0zwb73OHJB_rJCCqDIw",[605,610,614,618,622,626,630,634,638,642,643,648,652,656,661,665,669,672],{"path":606,"title":607,"description":608,"section":609,"order":158},"\u002Fdocs\u002Fconcepts\u002Farchitecture","How Browser works","Python, a Node process and Playwright — what runs where, and which installation to choose.","concepts",{"path":611,"title":612,"description":613,"section":609,"order":146},"\u002Fdocs\u002Fconcepts\u002Fassertions","Assertions","Almost every getter can assert, every assertion retries, and each return type allows different operators. The complete AssertionEngine reference.",{"path":615,"title":616,"description":617,"section":609,"order":72},"\u002Fdocs\u002Fconcepts\u002Fbrowser-context-page","Browser, context and page","The three layers Playwright is built on — and why a new context is the cheapest clean slate you will ever get.",{"path":619,"title":620,"description":621,"section":609,"order":164},"\u002Fdocs\u002Fconcepts\u002Flogging","Logging and debugging","Four places Browser tells you what happened — log.html, the Playwright log, traces and coverage.",{"path":623,"title":624,"description":625,"section":609,"order":78},"\u002Fdocs\u002Fconcepts\u002Fselectors","Finding elements","Which selector strategy to reach for, why the order matters, and how to chain across iframes and shadow DOM.",{"path":627,"title":628,"description":629,"section":609,"order":152},"\u002Fdocs\u002Fconcepts\u002Fwaiting","Waiting and promises","Most waiting is already done for you. This is the rest of it — Wait For Condition, and how to run keywords in parallel with Promise To.",{"path":631,"title":632,"description":633,"section":600,"order":78},"\u002Fdocs\u002Fextending\u002Fjavascript-basics","Just enough JavaScript","The JavaScript you need to write extensions and Evaluate JavaScript, for people who write Python.",{"path":635,"title":636,"description":637,"section":600,"order":146},"\u002Fdocs\u002Fextending\u002Fjavascript-extensions","JavaScript extensions","Add keywords that run on the Node side with full Playwright access — and attach a debugger to them.",{"path":639,"title":640,"description":641,"section":600,"order":72},"\u002Fdocs\u002Fextending\u002Fpython-plugins","Python plugins","Add or replace keywords from Python, with access to the library's own API and to the Node side.",{"path":599,"title":19,"description":596,"section":600,"order":152},{"path":644,"title":645,"description":646,"section":647,"order":78},"\u002Fdocs\u002Fmobile\u002Fdevices","Emulating a device","Device descriptors, what the six or seven properties they set actually change, and the one that emulation cannot give you.","mobile",{"path":649,"title":650,"description":651,"section":647,"order":72},"\u002Fdocs\u002Fmobile\u002Fresponsive","Testing responsive pages","Why a browser at a phone-sized viewport tests responsiveness properly, what emulation cannot tell you, and where real devices actually belong.",{"path":653,"title":654,"description":655,"section":647,"order":146},"\u002Fdocs\u002Fmobile\u002Ftouch","Touch, permissions and location","Tap and why it needs hasTouch, granting camera or notifications without a dialog, faking where the user is, and the gestures Browser has no keyword for.",{"path":657,"title":658,"description":659,"section":660,"order":146},"\u002Fdocs\u002Foperations\u002Fdocker","Running in Docker","The published Browser image, the four docker run flags that matter, and why running as root breaks Chromium.","operations",{"path":662,"title":663,"description":664,"section":660,"order":152},"\u002Fdocs\u002Foperations\u002Fdocker-images","Building your own image","Extending the published image with your dependencies, the version lock between Browser and Playwright, and using it as a CI job container.",{"path":666,"title":667,"description":668,"section":660,"order":78},"\u002Fdocs\u002Foperations\u002Fenvironment-variables","Environment variables","The variables that change how Browser behaves, which of them are safe in production, and the import parameters that should usually be preferred.",{"path":48,"title":670,"description":671,"section":660,"order":72},"The Node process","Browser starts a Node process to talk to Playwright. What that costs, how to share one across parallel runs, and how to pass it Node flags.",{"path":673,"title":674,"description":675,"section":676,"order":72},"\u002Fdocs\u002Fstart\u002Fgetting-started","Getting started","Install Browser, write a first test, and run it.","start",[678,681,684],{"to":679,"label":680},"\u002Fwhy\u002Fvs-cypress","vs Cypress",{"to":682,"label":683},"\u002Fwhy\u002Fvs-playwright","vs Playwright Test",{"to":685,"label":686},"\u002Fwhy\u002Fvs-seleniumlibrary","vs SeleniumLibrary",[688],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF6B5E;font-weight:bold\">*** Settings ***\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">Library\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    Browser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">    language=fi\u003C\u002Fspan>\u003C\u002Fspan>",[690],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#C9A6E9\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">def\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> get_language\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">()\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> ->\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> list\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E2E1D7\">    here \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">=\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\"> Path\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">(\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">__file__\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">).\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\">parent\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">.\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">absolute\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#C9A6E9\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> [\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">        {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">            \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">language\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">fi\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#96A2A8;font-style:italic\">          # matched case-insensitively against language=\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">            \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">path\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#E2E1D7\"> here \u003C\u002Fspan>\u003Cspan style=\"color:#FF6B5E\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">fi.json\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003Cspan style=\"color:#96A2A8;font-style:italic\">  # the translation data\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">        },\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    ]\u003C\u002Fspan>\u003C\u002Fspan>",[692],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">{\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">__intro__\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">doc\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Selainkirjasto Robot Frameworkille.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">sha256\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">b1946ac92492d2347c6235b4d2611184\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  },\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">click\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Klikkaa\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">doc\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Klikkaa elementtiä, joka vastaa valitsinta.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">sha256\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">3a7bd3e2360a3d29eea436fcfb7e44c7\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  },\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">fill_text\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> {\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">name\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Täytä Teksti\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">doc\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">Kirjoittaa tekstin syöttökenttään.\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">,\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">    \"\u003C\u002Fspan>\u003Cspan style=\"color:#2BD9CC\">sha256\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">:\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\">9f2feb8255f4b3d1d0f2a4a3b1c7e0d9\u003C\u002Fspan>\u003Cspan style=\"color:#A9B4BA\">\"\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">  }\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#A9B4BA\">}\u003C\u002Fspan>\u003C\u002Fspan>",[694],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">rfbrowser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> translation\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> \u002Fpath\u002Fto\u002Ftranslation.json\u003C\u002Fspan>\u003C\u002Fspan>",[696],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">rfbrowser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> translation\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> --compare\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> \u002Fpath\u002Fto\u002Ftranslation.json\u003C\u002Fspan>\u003C\u002Fspan>",[698],"\u003Cspan class=\"line\">\u003Cspan style=\"color:#2BD9CC\">rfbrowser\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> translation\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> --plugings\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> myplugin.SomePlugin\u003C\u002Fspan>\u003Cspan style=\"color:#FFB86B\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E0D3A3\">    --jsextension\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> \u002Fpath\u002Fto\u002Fjsplugin.js\u003C\u002Fspan>\u003Cspan style=\"color:#E0D3A3\"> \u002Fpath\u002Fto\u002Ftranslation.json\u003C\u002Fspan>\u003C\u002Fspan>",1786734140526]