phetsims / chipper

Tools for developing and building PhET interactive simulations.
MIT License
11 stars 14 forks source link

strip leading/trailing space from string values #619

Open phet-steele opened 6 years ago

phet-steele commented 6 years ago

@pixelzoom has pointed this out. Using a string value like "____Basics" for the title of a screen will place the string wildly out of place. (github DOES strip spaces, so I had to use underscores to show spaces 😠)

@ariel-phet please assign for someone to address.

pixelzoom commented 6 years ago

Also... If anyone is writing layout code that is relying on leading/trailing spaces in translated strings, that's a bad practice. If the translator doesn't provide identical leading/trailing spaces, your layout will be hosed. Similarly if the translator accidentally adds leading/trailing space, your layout will be hosed. And Rosetta currently provides no support for either scenario.

pixelzoom commented 6 years ago

I see 3 places in string.js where .value is being used to lookup the value of a string. Lines 63, 174, 181.

samreid commented 6 years ago

One possibility would be to put an assertion like

                  if ( parsedStrings[ key ] !== undefined ) {
                    var stringValue = window.phet.chipper.mapString( parsedStrings[ key ].value, stringTest );
                    assert && assert(stringValue.length===stringValue.trim().length,'untrimmed string: '+stringValue);
                    onload( stringValue );
                  }

I tested it on several sims and haven't seen a problem yet.

UPDATE: My point is that rather than gracefully handling trailing/leading whitespace we should identify it and flag it as an error so it can be corrected.

pixelzoom commented 6 years ago

Identifying leading/trailing whitespace is useful for the English (fallback) strings, which we can then fix. But we currently have no control over the strings for other locales. So stripping leading/trailing whitespace is (imo) the robust solution.

samreid commented 6 years ago

We should add a trim on the rosetta side (before strings are committed). Then to address existing trailing/leading whitespace we could either (a) strip whitespace on the sim side as proposed or (b) do one pass through all existing strings and fix any that are problematic.

pixelzoom commented 6 years ago

Yes, we could (should?) add a trim in Rosetta, and make a pass through all existing strings. But we still need a trim at the point where the strings are read from the file. In general, anytime you read a string from an external source (user input, file,...), and that string is not supposed to have leading/trailing whitespace, one should defensively trim the string. And that's the case with the string plugin.

pixelzoom commented 6 years ago

11/9/17 dev meeting: • Start by trimming in string plugin, @pixelzoom will handle • @jbphet will create an issue for Rosetta to trim there

jbphet commented 6 years ago

The issue in rosetta for trimming strings provided by translators is https://github.com/phetsims/rosetta/issues/163.

pixelzoom commented 6 years ago

Presumably this can be addressed by adding trim immediately before any call to ChipperStringUtils.addDirectionalFormatting.

pixelzoom commented 6 years ago

I found 2 calls to ChipperStringUtils.addDirectionalFormatting (string.js, getStringMap.js) and put a trim immediately before each of them. All looks good in requirejs and built modes - I verified that leading/trailing whitespace is stripped.

But with ?strings=..., I'm still seeing leading/trailing whitespace - which means there's no trim and no ChipperStringUtils.addDirectionalFormatting. Since Rosetta is using ?strings, I'm wondering if it's adding the directional formatting. @jbphet?

pixelzoom commented 6 years ago

If Rosetta is indeed adding directional formatting, then it will also need to trim before doing so, since the directional formatting will surround any leading/trailing whitespace.

In the meantime, I'm going to trim the values provided via query parameter, to handle the general use case.

pixelzoom commented 6 years ago

Doing the trim in requirejs mode would be a reasonable change in string.js:

168 if ( queryParameterStringValue ) {
169   onload( queryParameterStringValue.trim() );
170 }

Handling it in built mode is way ugly. It would involve changing sim.hmtl line 68, like this:

60 var stringOverrides = JSON.parse( phet.chipper.queryParameters.strings || '{}' );
68 return stringOverrides[ key ].trim() || window.phet.chipper.mapString( window.phet.chipper.strings[ window.phet.chipper.locale ][ key ], stringTest );

Chatting about this with @jonathanolson on Slack, we're considering not trimming the values provided via ?strings since (presumably?) it's for use by Rosetta and developers. But my concern with not trimming ?strings is 2-fold: (1) it introduces a special case where string values are not trimmed, (2) ?strings may be used by third-parties in the future and we might forget to trim.

A more general concern about this entire exercise... It's disconcerting how this responsibility is spread out, over multiple files (string.js, getStringMap.js, sim.html,.. others?), build tools, Rosetta,…Something as simple as trimming the string value should not be this difficult, or involve touching this many files.

pixelzoom commented 6 years ago

Slack developer channel:

@pixelzoom: JB: It appears that strings provided via the “strings” query parameter do not have directional formatting added. Is that expected? Is Rosetta adding the formatting?

@jbphet I just tested an RTL language in rosetta using the test feature, and I can see that the strings look right, but I'd have to spend some time on it to see if the embedding marks are in the query param and, if so, where and how they are added in the code.

Assigning to @jbphet to determine where directional formatting is coming from when ?strings is used with Rosetta, and whether Rosetta also needs to trim.

pixelzoom commented 6 years ago

@jbphet in Slack, re the 'strings' query parameter:

AFAIK, it's only used by rosetta and devs, and is not otherwise a public query parameter.

pixelzoom commented 6 years ago

To maintain momentum on this, I poked around in rosetta myself. After searching for various things ('directional', 'RTL',...) I finally found 'rtl' in a couple of comments -- which I've changed to 'RTL' in the above commit.

In translate-sim.js, it does look like directional formatting is being added on line 84:

          // add RTL embedding markers for RTL strings
          if ( rtl ) {
            translation = '\u202b' + translation + '\u202c';
          }
          else {
            translation = '\u202a' + translation + '\u202c';
          }

Changes that need to be made in Rosetta:

(1) Replace the above code with:

translation = ChipperStringUtils.addDirectionalFormatting( translation, rtl );

... so that (a) build process and Rosetta are using the same code to add directional formatting, and (b) it's easier to locate directional formatting in the future (as was the problem in this issue).

(2) Immediately before the above code, trim whitespace by adding:

// remove leading/trailing whitespace, see chipper#619. Do this before adding directional formatting.
translation = translation.trim();

(3) Verify that whitespace is trimmed when English strings are displayed. If that's not happening, make it so.

(4) Verify that whitespace is trimmed when translated strings are saved. If that's not happening, make it so.

@jbphet Do you agree?

pixelzoom commented 6 years ago

I don't feel comfortable making Rosetta changes, since I'm not familiar with how to test and deploy. Discussed with @ariel-phet and he said to assign to @jbphet to (1) make Rosetta changes and (2) verify the changes that I made to build tools in https://github.com/phetsims/chipper/commit/f7be23c15c5fa8943c5bc14fb6d3016a1e806bf7. Let me know if I can help.

pixelzoom commented 6 years ago

@jbphet Check with @ariel-phet on priority. Rosetta will currently show leading/trailing whitespace, while requirejs/built sims will trim it. So what the translator sees doesn't match what will be deployed.

jbphet commented 6 years ago

Okay, I'll set the priority and hopefully address during the upcoming chipper:2.0 effort.

zepumph commented 5 years ago

@samreid and I ran into this in regards to https://github.com/phetsims/chipper/issues/779 and (more generally https://github.com/phetsims/rosetta/issues/193). I think it would be good to work on this as part of that work. Assigning to myself for some investigation so I don't forget.

zepumph commented 5 years ago

Identifying leading/trailing whitespace is useful for the English (fallback) strings, which we can then fix.

+1 for an assertion for english strings!

zepumph commented 5 years ago

I decided to do this work on the a11ystring-plugin branch because it has a bunch of string plugin work already done. I was able to make the assertion for english strings in the below patch. I didn't commit it though because in friction (the a11y strings example I converted into the en json), I have some trailing spaces in the a11y descriptions. That will be fixed in https://github.com/phetsims/friction/issues/182. Until then I will keep this issue assigned to me. Even if in the future we can't apply this patch perfectly, it will be a good starting point.

@jbphet I see https://github.com/phetsims/rosetta/issues/163, so I don't think you need to be assigned here. Let me know if that changes.

```diff Index: js/common/ChipperStringUtils.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/common/ChipperStringUtils.js (date 1569546824000) +++ js/common/ChipperStringUtils.js (date 1569547303062) @@ -120,11 +120,15 @@ * Recurse through a string file and format each string value appropriately * @param {StringMap} stringMap * @param {boolean} isRTL - is right to left language + * @param {boolean} [assertNoWhitespace] - when true, assert that trimming each string value doesn't change the string. * @public */ - formatStringValues: function( stringMap, isRTL ) { + formatStringValues: function( stringMap, isRTL, assertNoWhitespace ) { ChipperStringUtils.forEachString( stringMap, ( key, stringObject ) => { + assert && assertNoWhitespace && assert( stringObject.value === stringObject.value.trim(), + `String should not have whitespace: ${stringObject.value}` ); + // remove leading/trailing whitespace, see chipper#619. Do this before addDirectionalFormatting stringObject.value = stringObject.value.trim(); stringObject.value = ChipperStringUtils.addDirectionalFormatting( stringObject.value, isRTL ); Index: js/requirejs-plugins/string.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/requirejs-plugins/string.js (date 1569546824000) +++ js/requirejs-plugins/string.js (date 1569547318001) @@ -47,8 +47,9 @@ * @param {string} url path for the string * @param {function} callback callback when the check succeeds, returning the parsed JSON object * @param {function} errorBack callback for when an error occurred + * @param {boolean} [assertNoWhitespace] - when true, assert that trimming each string value doesn't change the string. */ - const getWithCache = ( url, callback, errorBack ) => { + const getWithCache = ( url, callback, errorBack, assertNoWhitespace ) => { // Check for cache hit, see discussion in https://github.com/phetsims/chipper/issues/730 if ( cache[ url ] ) { @@ -69,7 +70,7 @@ const parsed = JSON.parse( loadedText ); const isRTL = localeInfo[ phet.chipper.queryParameters.locale ].direction === 'rtl'; - ChipperStringUtils.formatStringValues( parsed, isRTL ); + ChipperStringUtils.formatStringValues( parsed, isRTL, assertNoWhitespace ); cache[ url ] = parsed; // clear the entries added during the async loading process @@ -179,7 +180,8 @@ const queryParameterStrings = JSON.parse( phet.chipper.queryParameters.strings || '{}' ); const locale = phet.chipper.queryParameters.locale; const fallbackSpecificPath = `${repositoryPath}/${getFilenameForLocale( ChipperConstants.FALLBACK_LOCALE )}`; - const localeSpecificPath = ( locale === ChipperConstants.FALLBACK_LOCALE ) ? + const isFallbackLocale = locale === ChipperConstants.FALLBACK_LOCALE; + const localeSpecificPath = isFallbackLocale ? fallbackSpecificPath : `${repositoryPath}/../babel/${repositoryName}/${getFilenameForLocale( locale )}`; @@ -213,8 +215,8 @@ // Running in the browser (dynamic requirejs mode) and couldn't find the string file. Use the fallbacks. console.log( `no string file for ${localeSpecificPath}` ); onload( getStringFromFileContents( parsedFallbackStrings, key ) ); - } ); - }, onload.error ); + }, isFallbackLocale ); // if the main strings file is the fallback, then assert no surrounding whitespace + }, onload.error, true ); } } },
zepumph commented 5 years ago

https://github.com/phetsims/friction/issues/182 sorta became an issue to do this conversion in more repos than just friction (oops). And so now there don't seem to be any trailing/leading whitespace in a11y strings, and after adding the assertion in, I don't see any in the en json files either. I feel good about committing this to the branch. We will know for certain when it is merged to master. I'll keep myself assigned until then.

zepumph commented 4 years ago

After merging to master, I ran aqua tests and found one error (https://github.com/phetsims/masses-and-springs/issues/350). I'm going to close this now that it is on master.

zepumph commented 3 years ago

So I just ran back into this over in https://github.com/phetsims/friction/issues/237. Even though I added the assertion, it is never run, because we aren't running things with assertNoWhitespace.

When I apply this patch, I see quite a bit of issue in our strings printed out when building just friction. I worry about what it will mean to actually limit our trailing/leading whitespace. It seems like we either need to tighten down on this, and potentially change a lot of translations, or discover another way forward. Maybe we don't care about this that much anymore?

Patch ```diff Index: js/common/ChipperStringUtils.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/js/common/ChipperStringUtils.js b/js/common/ChipperStringUtils.js --- a/js/common/ChipperStringUtils.js (revision dbec1678d6dcab1b74728c354fbe9b62b4b1bdfe) +++ b/js/common/ChipperStringUtils.js (date 1632324311230) @@ -10,7 +10,13 @@ /* eslint-env node */ -const assert = require( 'assert' ); +// const assert = require( 'assert' ); + +const assert = ( x, m ) => { + if ( !x ) { + console.log( m ); + } +}; const _ = require( 'lodash' ); // eslint-disable-line require-statement-match // What divides the repo prefix from the rest of the string key, like `FRICTION/friction.title` @@ -113,7 +119,7 @@ * @param {boolean} [assertNoWhitespace] - when true, assert that trimming each string value doesn't change the string. * @public */ - formatStringValues: function( stringMap, isRTL, assertNoWhitespace ) { + formatStringValues: function( stringMap, isRTL, assertNoWhitespace = true ) { ChipperStringUtils.forEachString( stringMap, ( key, stringObject ) => { assert && assertNoWhitespace && assert( stringObject.value === stringObject.value.trim(), ```
Many strings with lots of whitespace trailing or leading ``` String should not have trailing or leading whitespace, key: a11y.amountOfAtoms.sentence, value: "Chemistry book has {{comparisonAmount}} jiggling atoms as {{breakAwayAmount}} have broken away. " String should not have trailing or leading whitespace, key: a11y.temperature.thermometer, value: "thermometer " String should not have trailing or leading whitespace, key: a11y.lightly, value: "lightly " String should not have trailing or leading whitespace, key: moveBookHeader, value: "पुस्तक हिलाएं " String should not have trailing or leading whitespace, key: moveBook, value: "पुस्तक हिलाएं " String should not have trailing or leading whitespace, key: moveInSmallerSteps, value: "पुस्तक धीरे धीरे हिलाएं " String should not have trailing or leading whitespace, key: moveBook, value: "Pohyb " String should not have trailing or leading whitespace, key: bookTitle, value: "Ìwé " String should not have trailing or leading whitespace, key: moveBookHeader, value: "Gbe Ìwé " String should not have trailing or leading whitespace, key: moveBook, value: " Gbe Ìwé tabi
Ìwé ṣàmúgbòrò si" String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: " موقع PhET الالكتروني" String should not have trailing or leading whitespace, key: updates.checking, value: " بحث عن تحديثات …" String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "أحداث المدخلات والمخرجات " String should not have trailing or leading whitespace, key: menuItem.submitInputEventsLog, value: "إرسل المدخلات " String should not have trailing or leading whitespace, key: adaptedFrom, value: "مقتبس من " String should not have trailing or leading whitespace, key: versionPattern, value: " versiya {0}" String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "Снимка на екрана " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: " Използвани авторски права" String should not have trailing or leading whitespace, key: updates.offline, value: " Не може да се обнови" String should not have trailing or leading whitespace, key: updates.yourCurrentVersion, value: " Настоящата версия: {0}" String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "Izlazni dnevnik " String should not have trailing or leading whitespace, key: updates.offline, value: "Nije moguće provjeriti ažuriranja. " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Übersetzt von " String should not have trailing or leading whitespace, key: queryParametersWarningDialog.invalidQueryParameters, value: "Parametro de Consulta Inválido " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: "ایمیل رخدادنامۀ رویدادهای ورودی " String should not have trailing or leading whitespace, key: credits.soundDesign, value: " {0} : طراحی صوت" String should not have trailing or leading whitespace, key: credits.title, value: "ફાળો આપનાર " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "ફૂલ સ્ક્રીન " String should not have trailing or leading whitespace, key: keyboardShortcuts.title, value: "કીબોર્ડ શોર્ટકટ " String should not have trailing or leading whitespace, key: updates.noThanks, value: "ના આભાર " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "સ્ક્રિનશોટ " String should not have trailing or leading whitespace, key: credits.softwareDevelopment, value: "સોફ્ટવેર નિર્માણ: {0} " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "શરતો, ગોપનીયતા  અને  લાયસન્સ " String should not have trailing or leading whitespace, key: credits.thanks, value: "આભાર " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "અન્ય વ્યક્તિઓનો ફાળો " String should not have trailing or leading whitespace, key: credits.translation, value: "ભાષાંતર " String should not have trailing or leading whitespace, key: translation.credits.link, value: "ભાષાંતર કરનાર " String should not have trailing or leading whitespace, key: updates.offline, value: "અપડેટ ચેક કરી શકતા નથી " String should not have trailing or leading whitespace, key: done, value: "પૂર્ણ " String should not have trailing or leading whitespace, key: title.settings, value: "સેટિંગ " String should not have trailing or leading whitespace, key: showPointers, value: "પોઈન્ટર બતાવો " String should not have trailing or leading whitespace, key: credits.title, value: "श्रेय " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "पूर्ण स्क्रीन " String should not have trailing or leading whitespace, key: keyboardShortcuts.title, value: "कीबोर्ड शॉर्टकट " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "स्क्रीनशॉट " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "शर्त , गोपनीयता और अनुज्ञापन " String should not have trailing or leading whitespace, key: credits.thanks, value: "धन्यवाद " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "तीसरे पक्ष का श्रेय " String should not have trailing or leading whitespace, key: updates.upToDate, value: "यह सिमुलेशन अद्यतित है " String should not have trailing or leading whitespace, key: credits.translation, value: "भाषांतर " String should not have trailing or leading whitespace, key: translation.credits.link, value: "भाषांतर का श्रेय " String should not have trailing or leading whitespace, key: updates.offline, value: "अद्यतन जांच करने में असमर्थ " String should not have trailing or leading whitespace, key: done, value: "पूर्ण हुआ " String should not have trailing or leading whitespace, key: showPointers, value: "पॉइंटर्स दिखाएँ " String should not have trailing or leading whitespace, key: projectorMode, value: "प्रक्षेप्य मोड " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "Kredi Twazyèm-pati " String should not have trailing or leading whitespace, key: ieErrorPage.platformError, value: "Erè Platfòm " String should not have trailing or leading whitespace, key: credits.translation, value: "Terjemahan " String should not have trailing or leading whitespace, key: keyboardShortcuts.toGetStarted, value: "бастау үшін" String should not have trailing or leading whitespace, key: showPointers, value: "ಪಾಯಿಂಟರ್ಸ್ ತೋರಿಸು " String should not have trailing or leading whitespace, key: updates.checking, value: "업데이트 확인 중 " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: "메일 입력 이벤트 입장 " String should not have trailing or leading whitespace, key: credits.team, value: "팀: {0} " String should not have trailing or leading whitespace, key: adaptedFrom, value: " (으)로부터 개조됨" String should not have trailing or leading whitespace, key: ieErrorPage.ieIsNotSupported, value: "ບໍ່ຮັບຮອງ ໂປຼແກຼມ Internet Explorer " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "ເວບໄຊສ໌ຂອງ PhET " String should not have trailing or leading whitespace, key: updates.outOfDate, value: "Kua Rite Te Putanga Hou " String should not have trailing or leading whitespace, key: menuItem.getUpdate, value: "अपडेट आहे की नाही हे तपासा " String should not have trailing or leading whitespace, key: updates.checking, value: "अपडेट आहे की नाही हे तपासले जात आहे . . .  " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: " आलेल्या मेल ची घटना तालिका " String should not have trailing or leading whitespace, key: menuItem.options, value: "पर्याय . . . " String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "आउट्पूट इनपूट  घटना तालिका " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "PhET संस्थळ… " String should not have trailing or leading whitespace, key: ieErrorPage.useDifferentBrowser, value: "कृपया या सीम्युलेशनसाठी यापेक्षा वेगळा ब्राऊझर वापरा  " String should not have trailing or leading whitespace, key: credits.qualityAssurance, value: " गुणवत्ता अभिवचन: {0} " String should not have trailing or leading whitespace, key: menuItem.reportAProblem, value: "अडचण नोंदवा " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: " अटी, गोपनियता आणि अनुज्ञापन" String should not have trailing or leading whitespace, key: keyboardShortcuts.toGetStarted, value: "सुरू करण्यासाठी " String should not have trailing or leading whitespace, key: preferences.tabs.visual.interactiveHighlightsDescription, value: "Adicione destaques visuais para mouse e toque conforme você interage. " String should not have trailing or leading whitespace, key: preferences.tabs.audio.sounds.description, value: "Toque sonificações e efeitos sonoros enquanto você interage. " String should not have trailing or leading whitespace, key: preferences.tabs.general.moreAccessibility, value: "Para encontrar outras simulações com recursos de acessibilidade, vá para a página de filtro de simulação no portal do PhET e filtre por recurso de acessibilidade. " String should not have trailing or leading whitespace, key: preferences.tabs.input.gestureControls.description, value: "Use o toque com deslizamentos e toques personalizados. Nenhum toque direto com o controle por gestos ativado. " String should not have trailing or leading whitespace, key: preferences.tabs.general.accessibilityIntro, value: "Estamos adicionando recursos às nossas simulações para torná-las mais inclusivas. Alguns desses recursos oferecem acessibilidade para alunos com necessidades diversas e em ambientes diversos. Explore as guias neste menu para revisar ou alterar as configurações de apresentação padrão. " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "සම්පූර්ණ තිරය " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "තෙවන පාර්ශ්වීය ගෞරවය   " String should not have trailing or leading whitespace, key: updates.upToDate, value: "මෙම අනුරූපනය යාවත්කාලීනය. " String should not have trailing or leading whitespace, key: versionPattern, value: "අනුවාදය  {0} " String should not have trailing or leading whitespace, key: adaptedFrom, value: "...ගෙන් අනුවර්තිත " String should not have trailing or leading whitespace, key: ieErrorPage.ieIsNotSupported, value: "Internet Explorer nie je podporovaný. " String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "Излазни дневник " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Владан Ал. Младеновић " String should not have trailing or leading whitespace, key: credits.contributors, value: "Bidragsgivare: {0} " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Översättning, " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "Picha " String should not have trailing or leading whitespace, key: updates.outOfDate, value: " புதிய பதிப்பு கிடைக்கும்" String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "விதிமுறைகள், அந்தரங்கம் மற்றும் உரிமம் " String should not have trailing or leading whitespace, key: simTitleWithScreenNamePattern, value: " {{simName}} — {{screenName}}" String should not have trailing or leading whitespace, key: adaptedFrom, value: "இருந்து எடுக்கப்பட்டது " String should not have trailing or leading whitespace, key: options.title, value: "ఎంపికలు " String should not have trailing or leading whitespace, key: credits.team, value: "ทีมผู้ร่วมพัฒนา: {0} " String should not have trailing or leading whitespace, key: ieErrorPage.platformError, value: "Platform Hatası " String should not have trailing or leading whitespace, key: preferences.tabs.general.accessibilityIntro, value: "Simülasyonlarımızı daha kapsayıcı hale getirmek için özellikler ekliyoruz. Bu özelliklerden bazıları, farklı ihtiyaçları olan ve farklı ortamlarda bulunan öğrenciler için erişilebilirliği destekler. Varsayılan sunum ayarlarını gözden geçirmek veya değiştirmek için bu menüdeki sekmeleri keşfedin. " String should not have trailing or leading whitespace, key: credits.graphicArts, value: "Графіка: {0} " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "Вебсайт PhET... " String should not have trailing or leading whitespace, key: done, value: " Bajarildi" String should not have trailing or leading whitespace, key: credits.leadDesign, value: " Loyiha yetakchisi:{0}" String should not have trailing or leading whitespace, key: updates.newVersionAvailable, value: " Yangi versiyasi mavjud: {0}" String should not have trailing or leading whitespace, key: updates.checking, value: "Kiểm tra phiên bản... " String should not have trailing or leading whitespace, key: credits.graphicArts, value: "Đồ hoạ: {0} " String should not have trailing or leading whitespace, key: queryParametersWarningDialog.theSimulationWillStart, value: "Mô phỏng sẽ bắt đầu với giá trị mặc định đối với
tham số được yêu cầu " String should not have trailing or leading whitespace, key: preferences.tabs.general.moreAccessibility, value: "Để tìm các mô phỏng khác bao gồm các tính chất, hãy tìm trong phần Truy cập và Bao gồm trên trang lọc các mô phỏng và lọc theo tính chất đó. " String should not have trailing or leading whitespace, key: a11y.keyboardHelpDialog.comboBox.chooseNewPatternDescription, value: " Choose new {{thingSingular}} with Enter key." String should not have trailing or leading whitespace, key: a11y.keyboardHelpDialog.comboBox.closeWithoutChangingDescription, value: " Close list without changing with Escape key." String should not have trailing or leading whitespace, key: keyboardHelpDialog.hyphen, value: "- " String should not have trailing or leading whitespace, key: keyboardHelpDialog.grabOrReleaseLabelPattern, value: " Greife oder setze {{thing}}" String should not have trailing or leading whitespace, key: frequencyUnitsPattern, value: " {{frequency}} THz" String should not have trailing or leading whitespace, key: keyboardHelpDialog.exitADialog, value: "Salir " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItemOrGroup, value: "mover al elemento o grupo anterior " String should not have trailing or leading whitespace, key: keyboardHelpDialog.comboBox.closeWithoutChanging, value: "4. Cerrar la lista sin hacer cambios " String should not have trailing or leading whitespace, key: keyboardHelpDialog.adjust, value: "Ajustar " String should not have trailing or leading whitespace, key: keyboardHelpDialog.maximum, value: "máximo " String should not have trailing or leading whitespace, key: keyboardHelpDialog.sliderControls, value: "Controles del Deslizador " String should not have trailing or leading whitespace, key: ten, value: "diez " String should not have trailing or leading whitespace, key: keyboardHelpDialog.verbInLargerStepsPattern, value: " {{verb}} en pasos grandes" String should not have trailing or leading whitespace, key: keyboardHelpDialog.verbInSmallerStepsPattern, value: " {{verb}} en pasos pequeños" String should not have trailing or leading whitespace, key: speed.fast, value: "Rápido " String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: "para Agarrar o Soltar  " String should not have trailing or leading whitespace, key: webglWarning.contextLossFailure, value: "متاسفیم، یک اشکال گرافیکی پیش آمد. " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL فعال نشده یا در دسترس نیست. برای اطلاعات بیشتر کلیک کنید. " String should not have trailing or leading whitespace, key: keyboardHelpDialog.toggleCheckboxes, value: "ચેક બોક્ષ અદલ બદલ કરો " String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: " ને લો અથવા છોડો" String should not have trailing or leading whitespace, key: webglWarning.contextLossReload, value: "ફરી લોડ કરો " String should not have trailing or leading whitespace, key: shortCircuit, value: "શોર્ટ સર્કીટ " String should not have trailing or leading whitespace, key: key.alt, value: "Alt " String should not have trailing or leading whitespace, key: key.enter, value: "एंटर " String should not have trailing or leading whitespace, key: key.k, value: "K " String should not have trailing or leading whitespace, key: key.l, value: "L " String should not have trailing or leading whitespace, key: keyboardHelpDialog.or, value: "या " String should not have trailing or leading whitespace, key: key.pageDown, value: "पेज  नीचे " String should not have trailing or leading whitespace, key: key.pageUp, value: "पेज  ऊपर " String should not have trailing or leading whitespace, key: webglWarning.contextLossReload, value: "पुनः लोड करें " String should not have trailing or leading whitespace, key: key.shift, value: "शिफ्ट " String should not have trailing or leading whitespace, key: key.space, value: "स्पेस " String should not have trailing or leading whitespace, key: key.tab, value: "टैब " String should not have trailing or leading whitespace, key: speed.normal, value: "सामान्य " String should not have trailing or leading whitespace, key: speed.slow, value: "धीमा " String should not have trailing or leading whitespace, key: symbol.resistivity, value: " ρ" String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: cool, value: "ठंडा " String should not have trailing or leading whitespace, key: heat, value: "ऊष्मा " String should not have trailing or leading whitespace, key: keyboardHelpDialog.exitADialog, value: "बाहर निकले " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToNextItem, value: "अगले वस्तु  पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToNextItemOrGroup, value: "अगले वस्तु या समूह पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItem, value: "पिछले वस्तु पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItemOrGroup, value: "पिछले वस्तु या समूह पर जाएँ " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGLಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ ಅಥವಾ ಲಭ್ಯವಿಲ್ಲ.   ಹೆಚ್ಚು ತಿಳಿಯಲು ಕ್ಲಿಕ್ ಮಾಡಿ. " String should not have trailing or leading whitespace, key: webglWarning.title, value: "ಕಡಿಮೆ ಗುಣಮಟ್ಟದ ಗ್ರಾಫಿಕ್ಸ್ ಚಾಲನೆಯಲ್ಲಿದೆ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.grabOrReleaseHeadingPattern, value: " {{thing}}을 잡거나 놓으시오." String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL을 사용할 수 없습니다. 더 자세한 내용을 보시려면 클릭하세요 " String should not have trailing or leading whitespace, key: key.enter, value: "एन्टर " String should not have trailing or leading whitespace, key: speed.fast, value: "जलद " String should not have trailing or leading whitespace, key: speed.normal, value: "सामान्य " String should not have trailing or leading whitespace, key: speed.slow, value: "संथ " String should not have trailing or leading whitespace, key: key.space, value: "स्पेस बार " String should not have trailing or leading whitespace, key: keyboardHelpDialog.adjustSlider, value: "स्लाइडर " String should not have trailing or leading whitespace, key: keyboardHelpDialog.basicActions, value: "मूळ कृती " String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: keyboardHelpDialog.basicActions, value: "Grunnleggende " String should not have trailing or leading whitespace, key: keyboardHelpDialog.comboBox.chooseNewPattern, value: " 3. Escolher nova {{thingSingular}}" String should not have trailing or leading whitespace, key: keyboardHelpDialog.jumpToMaximumPattern, value: " Saltar até {{maximum}}" String should not have trailing or leading whitespace, key: keyboardHelpDialog.jumpToMinimumPattern, value: " Saltar até {{minimum}}" String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL не активирован или не установлен. Нажмите здесь чтобы узнать больше. " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL සක්‍රිය කර නැත හෝ ලබාගත නොහැකිය. වැඩිදුර දැනගැනීමට ක්ලික් කරන්න " String should not have trailing or leading whitespace, key: webglWarning.ie11StencilBody, value: "නිර්දේශිත Windows Update patches භාවිත කර Internet Explorer යාවත්කාලීන කරන්න. " String should not have trailing or leading whitespace, key: key.pageUp, value: " Pg Up" String should not have trailing or leading whitespace, key: seven, value: "sedem " String should not have trailing or leading whitespace, key: six, value: "šesť " String should not have trailing or leading whitespace, key: keyboardHelpDialog.toggleCheckboxes, value: "Prepnutie začiarkavacieho políčka " String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: " Ухвати или Пусти" String should not have trailing or leading whitespace, key: webglWarning.body, value: "  WebGL није омогућен или није доступан. Кликните да бисте сазнали више." String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL இயக்கநிலை படுத்தப்படவில்லை அல்லது கிடைக்கக் கூடியதாயில்லை. மேலும் அறிய கிளிக் செய்க " String should not have trailing or leading whitespace, key: webglWarning.ie11StencilBody, value: "பரிந்துரைக்கப்பட்டWindows தற்காலப்படுத்தல் ஒட்டுகளை நிறுவுதன் மூலம் இணைய ஆய்வியை இற்றைப் படுத்தவும் " String should not have trailing or leading whitespace, key: webglWarning.title, value: " తక్కువ నాణ్యత గల గ్రాఫిక్స్ తో నడుస్తున్నది" >> Unused string: key=a11y.temperature.nowWarm, value=now warm >> Unused string: key=a11y.temperature.nowHot, value=now hot >> Unused string: key=a11y.temperature.dropping, value=dropping >> Unused string: key=a11y.screenSummary.moveChemistryBookExplore, value=Move Chemistry book down to explore friction. >> Unused string: key=a11y.capitalizedAFew, value=A few >> Unused string: key=a11y.capitalizedMore, value=More >> Production minification complete: 19309ms (1545751 bytes) >> Debug minification complete: 15490ms (1831097 bytes) >> No client guides found at ../phet-io-client-guides/friction/, no guides being built. Message from sim: |‪lightly‬| Message from sim: ‪Chemistry book rests ‪lightly‬on top of a Physics book, and is ready to be rubbed against it.‬ Message from sim: |‪lightly‬| Message from sim: ‪Chemistry book rests ‪lightly‬on top of a Physics book, and is ready to be rubbed against it.‬ Building brand: phet >> Webpack build complete: 2281ms String should not have trailing or leading whitespace, key: a11y.amountOfAtoms.sentence, value: "Chemistry book has {{comparisonAmount}} jiggling atoms as {{breakAwayAmount}} have broken away. " String should not have trailing or leading whitespace, key: a11y.temperature.thermometer, value: "thermometer " String should not have trailing or leading whitespace, key: a11y.lightly, value: "lightly " String should not have trailing or leading whitespace, key: moveBookHeader, value: "पुस्तक हिलाएं " String should not have trailing or leading whitespace, key: moveBook, value: "पुस्तक हिलाएं " String should not have trailing or leading whitespace, key: moveInSmallerSteps, value: "पुस्तक धीरे धीरे हिलाएं " String should not have trailing or leading whitespace, key: moveBook, value: "Pohyb " String should not have trailing or leading whitespace, key: bookTitle, value: "Ìwé " String should not have trailing or leading whitespace, key: moveBookHeader, value: "Gbe Ìwé " String should not have trailing or leading whitespace, key: moveBook, value: " Gbe Ìwé tabi
Ìwé ṣàmúgbòrò si" String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: " موقع PhET الالكتروني" String should not have trailing or leading whitespace, key: updates.checking, value: " بحث عن تحديثات …" String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "أحداث المدخلات والمخرجات " String should not have trailing or leading whitespace, key: menuItem.submitInputEventsLog, value: "إرسل المدخلات " String should not have trailing or leading whitespace, key: adaptedFrom, value: "مقتبس من " String should not have trailing or leading whitespace, key: versionPattern, value: " versiya {0}" String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "Снимка на екрана " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: " Използвани авторски права" String should not have trailing or leading whitespace, key: updates.offline, value: " Не може да се обнови" String should not have trailing or leading whitespace, key: updates.yourCurrentVersion, value: " Настоящата версия: {0}" String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "Izlazni dnevnik " String should not have trailing or leading whitespace, key: updates.offline, value: "Nije moguće provjeriti ažuriranja. " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Übersetzt von " String should not have trailing or leading whitespace, key: queryParametersWarningDialog.invalidQueryParameters, value: "Parametro de Consulta Inválido " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: "ایمیل رخدادنامۀ رویدادهای ورودی " String should not have trailing or leading whitespace, key: credits.soundDesign, value: " {0} : طراحی صوت" String should not have trailing or leading whitespace, key: credits.title, value: "ફાળો આપનાર " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "ફૂલ સ્ક્રીન " String should not have trailing or leading whitespace, key: keyboardShortcuts.title, value: "કીબોર્ડ શોર્ટકટ " String should not have trailing or leading whitespace, key: updates.noThanks, value: "ના આભાર " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "સ્ક્રિનશોટ " String should not have trailing or leading whitespace, key: credits.softwareDevelopment, value: "સોફ્ટવેર નિર્માણ: {0} " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "શરતો, ગોપનીયતા  અને  લાયસન્સ " String should not have trailing or leading whitespace, key: credits.thanks, value: "આભાર " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "અન્ય વ્યક્તિઓનો ફાળો " String should not have trailing or leading whitespace, key: credits.translation, value: "ભાષાંતર " String should not have trailing or leading whitespace, key: translation.credits.link, value: "ભાષાંતર કરનાર " String should not have trailing or leading whitespace, key: updates.offline, value: "અપડેટ ચેક કરી શકતા નથી " String should not have trailing or leading whitespace, key: done, value: "પૂર્ણ " String should not have trailing or leading whitespace, key: title.settings, value: "સેટિંગ " String should not have trailing or leading whitespace, key: showPointers, value: "પોઈન્ટર બતાવો " String should not have trailing or leading whitespace, key: credits.title, value: "श्रेय " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "पूर्ण स्क्रीन " String should not have trailing or leading whitespace, key: keyboardShortcuts.title, value: "कीबोर्ड शॉर्टकट " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "स्क्रीनशॉट " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "शर्त , गोपनीयता और अनुज्ञापन " String should not have trailing or leading whitespace, key: credits.thanks, value: "धन्यवाद " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "तीसरे पक्ष का श्रेय " String should not have trailing or leading whitespace, key: updates.upToDate, value: "यह सिमुलेशन अद्यतित है " String should not have trailing or leading whitespace, key: credits.translation, value: "भाषांतर " String should not have trailing or leading whitespace, key: translation.credits.link, value: "भाषांतर का श्रेय " String should not have trailing or leading whitespace, key: updates.offline, value: "अद्यतन जांच करने में असमर्थ " String should not have trailing or leading whitespace, key: done, value: "पूर्ण हुआ " String should not have trailing or leading whitespace, key: showPointers, value: "पॉइंटर्स दिखाएँ " String should not have trailing or leading whitespace, key: projectorMode, value: "प्रक्षेप्य मोड " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "Kredi Twazyèm-pati " String should not have trailing or leading whitespace, key: ieErrorPage.platformError, value: "Erè Platfòm " String should not have trailing or leading whitespace, key: credits.translation, value: "Terjemahan " String should not have trailing or leading whitespace, key: keyboardShortcuts.toGetStarted, value: "бастау үшін" String should not have trailing or leading whitespace, key: showPointers, value: "ಪಾಯಿಂಟರ್ಸ್ ತೋರಿಸು " String should not have trailing or leading whitespace, key: updates.checking, value: "업데이트 확인 중 " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: "메일 입력 이벤트 입장 " String should not have trailing or leading whitespace, key: credits.team, value: "팀: {0} " String should not have trailing or leading whitespace, key: adaptedFrom, value: " (으)로부터 개조됨" String should not have trailing or leading whitespace, key: ieErrorPage.ieIsNotSupported, value: "ບໍ່ຮັບຮອງ ໂປຼແກຼມ Internet Explorer " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "ເວບໄຊສ໌ຂອງ PhET " String should not have trailing or leading whitespace, key: updates.outOfDate, value: "Kua Rite Te Putanga Hou " String should not have trailing or leading whitespace, key: menuItem.getUpdate, value: "अपडेट आहे की नाही हे तपासा " String should not have trailing or leading whitespace, key: updates.checking, value: "अपडेट आहे की नाही हे तपासले जात आहे . . .  " String should not have trailing or leading whitespace, key: menuItem.mailInputEventsLog, value: " आलेल्या मेल ची घटना तालिका " String should not have trailing or leading whitespace, key: menuItem.options, value: "पर्याय . . . " String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "आउट्पूट इनपूट  घटना तालिका " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "PhET संस्थळ… " String should not have trailing or leading whitespace, key: ieErrorPage.useDifferentBrowser, value: "कृपया या सीम्युलेशनसाठी यापेक्षा वेगळा ब्राऊझर वापरा  " String should not have trailing or leading whitespace, key: credits.qualityAssurance, value: " गुणवत्ता अभिवचन: {0} " String should not have trailing or leading whitespace, key: menuItem.reportAProblem, value: "अडचण नोंदवा " String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: " अटी, गोपनियता आणि अनुज्ञापन" String should not have trailing or leading whitespace, key: keyboardShortcuts.toGetStarted, value: "सुरू करण्यासाठी " String should not have trailing or leading whitespace, key: preferences.tabs.visual.interactiveHighlightsDescription, value: "Adicione destaques visuais para mouse e toque conforme você interage. " String should not have trailing or leading whitespace, key: preferences.tabs.audio.sounds.description, value: "Toque sonificações e efeitos sonoros enquanto você interage. " String should not have trailing or leading whitespace, key: preferences.tabs.general.moreAccessibility, value: "Para encontrar outras simulações com recursos de acessibilidade, vá para a página de filtro de simulação no portal do PhET e filtre por recurso de acessibilidade. " String should not have trailing or leading whitespace, key: preferences.tabs.input.gestureControls.description, value: "Use o toque com deslizamentos e toques personalizados. Nenhum toque direto com o controle por gestos ativado. " String should not have trailing or leading whitespace, key: preferences.tabs.general.accessibilityIntro, value: "Estamos adicionando recursos às nossas simulações para torná-las mais inclusivas. Alguns desses recursos oferecem acessibilidade para alunos com necessidades diversas e em ambientes diversos. Explore as guias neste menu para revisar ou alterar as configurações de apresentação padrão. " String should not have trailing or leading whitespace, key: menuItem.fullscreen, value: "සම්පූර්ණ තිරය " String should not have trailing or leading whitespace, key: thirdParty.credits.link, value: "තෙවන පාර්ශ්වීය ගෞරවය   " String should not have trailing or leading whitespace, key: updates.upToDate, value: "මෙම අනුරූපනය යාවත්කාලීනය. " String should not have trailing or leading whitespace, key: versionPattern, value: "අනුවාදය  {0} " String should not have trailing or leading whitespace, key: adaptedFrom, value: "...ගෙන් අනුවර්තිත " String should not have trailing or leading whitespace, key: ieErrorPage.ieIsNotSupported, value: "Internet Explorer nie je podporovaný. " String should not have trailing or leading whitespace, key: menuItem.outputInputEventsLog, value: "Излазни дневник " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Владан Ал. Младеновић " String should not have trailing or leading whitespace, key: credits.contributors, value: "Bidragsgivare: {0} " String should not have trailing or leading whitespace, key: translation.credits.link, value: "Översättning, " String should not have trailing or leading whitespace, key: menuItem.screenshot, value: "Picha " String should not have trailing or leading whitespace, key: updates.outOfDate, value: " புதிய பதிப்பு கிடைக்கும்" String should not have trailing or leading whitespace, key: termsPrivacyAndLicensing, value: "விதிமுறைகள், அந்தரங்கம் மற்றும் உரிமம் " String should not have trailing or leading whitespace, key: simTitleWithScreenNamePattern, value: " {{simName}} — {{screenName}}" String should not have trailing or leading whitespace, key: adaptedFrom, value: "இருந்து எடுக்கப்பட்டது " String should not have trailing or leading whitespace, key: options.title, value: "ఎంపికలు " String should not have trailing or leading whitespace, key: credits.team, value: "ทีมผู้ร่วมพัฒนา: {0} " String should not have trailing or leading whitespace, key: ieErrorPage.platformError, value: "Platform Hatası " String should not have trailing or leading whitespace, key: preferences.tabs.general.accessibilityIntro, value: "Simülasyonlarımızı daha kapsayıcı hale getirmek için özellikler ekliyoruz. Bu özelliklerden bazıları, farklı ihtiyaçları olan ve farklı ortamlarda bulunan öğrenciler için erişilebilirliği destekler. Varsayılan sunum ayarlarını gözden geçirmek veya değiştirmek için bu menüdeki sekmeleri keşfedin. " String should not have trailing or leading whitespace, key: credits.graphicArts, value: "Графіка: {0} " String should not have trailing or leading whitespace, key: menuItem.phetWebsite, value: "Вебсайт PhET... " String should not have trailing or leading whitespace, key: done, value: " Bajarildi" String should not have trailing or leading whitespace, key: credits.leadDesign, value: " Loyiha yetakchisi:{0}" String should not have trailing or leading whitespace, key: updates.newVersionAvailable, value: " Yangi versiyasi mavjud: {0}" String should not have trailing or leading whitespace, key: updates.checking, value: "Kiểm tra phiên bản... " String should not have trailing or leading whitespace, key: credits.graphicArts, value: "Đồ hoạ: {0} " String should not have trailing or leading whitespace, key: queryParametersWarningDialog.theSimulationWillStart, value: "Mô phỏng sẽ bắt đầu với giá trị mặc định đối với
tham số được yêu cầu " String should not have trailing or leading whitespace, key: preferences.tabs.general.moreAccessibility, value: "Để tìm các mô phỏng khác bao gồm các tính chất, hãy tìm trong phần Truy cập và Bao gồm trên trang lọc các mô phỏng và lọc theo tính chất đó. " String should not have trailing or leading whitespace, key: a11y.keyboardHelpDialog.comboBox.chooseNewPatternDescription, value: " Choose new {{thingSingular}} with Enter key." String should not have trailing or leading whitespace, key: a11y.keyboardHelpDialog.comboBox.closeWithoutChangingDescription, value: " Close list without changing with Escape key." String should not have trailing or leading whitespace, key: keyboardHelpDialog.hyphen, value: "- " String should not have trailing or leading whitespace, key: keyboardHelpDialog.grabOrReleaseLabelPattern, value: " Greife oder setze {{thing}}" String should not have trailing or leading whitespace, key: frequencyUnitsPattern, value: " {{frequency}} THz" String should not have trailing or leading whitespace, key: keyboardHelpDialog.exitADialog, value: "Salir " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItemOrGroup, value: "mover al elemento o grupo anterior " String should not have trailing or leading whitespace, key: keyboardHelpDialog.comboBox.closeWithoutChanging, value: "4. Cerrar la lista sin hacer cambios " String should not have trailing or leading whitespace, key: keyboardHelpDialog.adjust, value: "Ajustar " String should not have trailing or leading whitespace, key: keyboardHelpDialog.maximum, value: "máximo " String should not have trailing or leading whitespace, key: keyboardHelpDialog.sliderControls, value: "Controles del Deslizador " String should not have trailing or leading whitespace, key: ten, value: "diez " String should not have trailing or leading whitespace, key: keyboardHelpDialog.verbInLargerStepsPattern, value: " {{verb}} en pasos grandes" String should not have trailing or leading whitespace, key: keyboardHelpDialog.verbInSmallerStepsPattern, value: " {{verb}} en pasos pequeños" String should not have trailing or leading whitespace, key: speed.fast, value: "Rápido " String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: "para Agarrar o Soltar  " String should not have trailing or leading whitespace, key: webglWarning.contextLossFailure, value: "متاسفیم، یک اشکال گرافیکی پیش آمد. " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL فعال نشده یا در دسترس نیست. برای اطلاعات بیشتر کلیک کنید. " String should not have trailing or leading whitespace, key: keyboardHelpDialog.toggleCheckboxes, value: "ચેક બોક્ષ અદલ બદલ કરો " String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: " ને લો અથવા છોડો" String should not have trailing or leading whitespace, key: webglWarning.contextLossReload, value: "ફરી લોડ કરો " String should not have trailing or leading whitespace, key: shortCircuit, value: "શોર્ટ સર્કીટ " String should not have trailing or leading whitespace, key: key.alt, value: "Alt " String should not have trailing or leading whitespace, key: key.enter, value: "एंटर " String should not have trailing or leading whitespace, key: key.k, value: "K " String should not have trailing or leading whitespace, key: key.l, value: "L " String should not have trailing or leading whitespace, key: keyboardHelpDialog.or, value: "या " String should not have trailing or leading whitespace, key: key.pageDown, value: "पेज  नीचे " String should not have trailing or leading whitespace, key: key.pageUp, value: "पेज  ऊपर " String should not have trailing or leading whitespace, key: webglWarning.contextLossReload, value: "पुनः लोड करें " String should not have trailing or leading whitespace, key: key.shift, value: "शिफ्ट " String should not have trailing or leading whitespace, key: key.space, value: "स्पेस " String should not have trailing or leading whitespace, key: key.tab, value: "टैब " String should not have trailing or leading whitespace, key: speed.normal, value: "सामान्य " String should not have trailing or leading whitespace, key: speed.slow, value: "धीमा " String should not have trailing or leading whitespace, key: symbol.resistivity, value: " ρ" String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: cool, value: "ठंडा " String should not have trailing or leading whitespace, key: heat, value: "ऊष्मा " String should not have trailing or leading whitespace, key: keyboardHelpDialog.exitADialog, value: "बाहर निकले " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToNextItem, value: "अगले वस्तु  पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToNextItemOrGroup, value: "अगले वस्तु या समूह पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItem, value: "पिछले वस्तु पर जाएँ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.moveToPreviousItemOrGroup, value: "पिछले वस्तु या समूह पर जाएँ " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGLಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ ಅಥವಾ ಲಭ್ಯವಿಲ್ಲ.   ಹೆಚ್ಚು ತಿಳಿಯಲು ಕ್ಲಿಕ್ ಮಾಡಿ. " String should not have trailing or leading whitespace, key: webglWarning.title, value: "ಕಡಿಮೆ ಗುಣಮಟ್ಟದ ಗ್ರಾಫಿಕ್ಸ್ ಚಾಲನೆಯಲ್ಲಿದೆ " String should not have trailing or leading whitespace, key: keyboardHelpDialog.grabOrReleaseHeadingPattern, value: " {{thing}}을 잡거나 놓으시오." String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL을 사용할 수 없습니다. 더 자세한 내용을 보시려면 클릭하세요 " String should not have trailing or leading whitespace, key: key.enter, value: "एन्टर " String should not have trailing or leading whitespace, key: speed.fast, value: "जलद " String should not have trailing or leading whitespace, key: speed.normal, value: "सामान्य " String should not have trailing or leading whitespace, key: speed.slow, value: "संथ " String should not have trailing or leading whitespace, key: key.space, value: "स्पेस बार " String should not have trailing or leading whitespace, key: keyboardHelpDialog.adjustSlider, value: "स्लाइडर " String should not have trailing or leading whitespace, key: keyboardHelpDialog.basicActions, value: "मूळ कृती " String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: keyboardHelpDialog.basicActions, value: "Grunnleggende " String should not have trailing or leading whitespace, key: keyboardHelpDialog.comboBox.chooseNewPattern, value: " 3. Escolher nova {{thingSingular}}" String should not have trailing or leading whitespace, key: keyboardHelpDialog.jumpToMaximumPattern, value: " Saltar até {{maximum}}" String should not have trailing or leading whitespace, key: keyboardHelpDialog.jumpToMinimumPattern, value: " Saltar até {{minimum}}" String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL не активирован или не установлен. Нажмите здесь чтобы узнать больше. " String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL සක්‍රිය කර නැත හෝ ලබාගත නොහැකිය. වැඩිදුර දැනගැනීමට ක්ලික් කරන්න " String should not have trailing or leading whitespace, key: webglWarning.ie11StencilBody, value: "නිර්දේශිත Windows Update patches භාවිත කර Internet Explorer යාවත්කාලීන කරන්න. " String should not have trailing or leading whitespace, key: key.pageUp, value: " Pg Up" String should not have trailing or leading whitespace, key: seven, value: "sedem " String should not have trailing or leading whitespace, key: six, value: "šesť " String should not have trailing or leading whitespace, key: keyboardHelpDialog.toggleCheckboxes, value: "Prepnutie začiarkavacieho políčka " String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: key.toGrabOrRelease, value: " Ухвати или Пусти" String should not have trailing or leading whitespace, key: webglWarning.body, value: "  WebGL није омогућен или није доступан. Кликните да бисте сазнали више." String should not have trailing or leading whitespace, key: symbol.ohms, value: " Ω" String should not have trailing or leading whitespace, key: webglWarning.body, value: "WebGL இயக்கநிலை படுத்தப்படவில்லை அல்லது கிடைக்கக் கூடியதாயில்லை. மேலும் அறிய கிளிக் செய்க " String should not have trailing or leading whitespace, key: webglWarning.ie11StencilBody, value: "பரிந்துரைக்கப்பட்டWindows தற்காலப்படுத்தல் ஒட்டுகளை நிறுவுதன் மூலம் இணைய ஆய்வியை இற்றைப் படுத்தவும் " String should not have trailing or leading whitespace, key: webglWarning.title, value: " తక్కువ నాణ్యత గల గ్రాఫిక్స్ తో నడుస్తున్నది" ```

Reopening to discuss at developer meeting.

samreid commented 3 years ago

We discussed this at today's dev meeting:

SR: Should we add assertions that the english strings don't have leading/trailing strings? SR: Should rosetta trim strings before storing them? SR: If there are no leading/trailing strings in the english, does that mean we can safely strip them out of the translations? JG: Perhaps one translator is just in a habit of adding trailing whitespace, and ....? JB: Does the whitespace actually change the bounds? JO: It does slightly change the text rendering, so it changes the layout. JB: Yes, but it doesn't seem like a big deal, but would be nice to fix when there's time.

We agreed the pattern in https://github.com/phetsims/friction/commit/b62a8d8d6b6d5deeea75b91292352af7b29fccbf is what not to do. You should have a template pattern that inserts space between sentences, not relying on sentences to have their own trailing whitespace.

SR: Is this a rosetta problem, or more about templating a11y strings? JB: Perhaps it is the latter. I recommend requesting the a11y team to use more maintainable patterns for templating around whitespace. JG: That pattern is not widely used, but it should be improved.

We decided this is at least 3 problems:

Let's touch base with @zepumph, who was not present for this discussion.

zepumph commented 3 years ago

We discussed this more and decided two things.

  1. For spaces, it is better to duplicate the sentence entirely than to fill in an adjective that has a space in it.
  2. We are quite a bit of work away from having a11y strings support i18n, so let's talk to higher ups about this and get some resources to save on technical debt here.

For the actual assertion mentioned in https://github.com/phetsims/chipper/issues/619#issuecomment-925040123, I will test all sims and see how many cases there are with white space. I will note them in https://github.com/phetsims/rosetta/issues/270.

I will report back to a subgroup of @jbphet, and @jonathanolson.

Thanks!