Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i18n: seo #6860

Merged
merged 32 commits into from
Feb 14, 2019
Merged

i18n: seo #6860

merged 32 commits into from
Feb 14, 2019

Conversation

exterkamp
Copy link
Member

@exterkamp exterkamp commented Dec 21, 2018

Summary
🇺🇸 🇬🇧 🇩🇪 🇮🇳 🇮🇨 🇲🇽
i18n for SEO category audits.

If you have opinions on the i18n description text please comment, I am not the best at explaining things in those also spelling is hard.


explanation = `${percentageOfFailingText}% of text is too small${disclaimer}.`;
explanation = str_(UIStrings.explanation,
{decimalProportion: percentageOfFailingText, disclaimer});
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The {disclaimer} here is nested and will not be translated. Should we look into modifying i18n to have nested translations or combinations?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this (combining) would require a few additions elsewhere in the i18n handling right? (this is where I admit I don't know how i18n works here yet)

if (visitedTextLength < totalTextLength) {
	const percentageOfVisitedText = visitedTextLength / totalTextLength * 100;
	disclaimer = str_(UIStrings.explanation, {percentage: percentageOfVisitedText.toFixed()})
}
explanation = str_(UIStrings.explanation,
    {decimalProportion: percentageOfFailingText} + disclaimer)

That, or have two separate UIStrings for cases w/ the disclaimer and w/o.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we'll have to do str_(UIStrings.explanation, {decimalProportion) + ' ' + str_(UIStrings.disclaimer, {percentage})

it's not super kosher but it's better than having a random english string

the first argument to str_ must always be a statically known value

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The i18n replacement in the end can't replace 2 lookup strings can it, the output ends up like this afaik:
"lighthouse-core/audits/seo/font-size.js | explanation # 1 lighthouse-core/audits/seo/font-size.js | disclaimer # 0."
b/c it can't lookup 2 replacements in 1 string? Should we add that, or is there an option I'm not setting/seeing?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh right we defer them to the end now, this is gonna be tricky 🤔 we might want to come up with a new format to handle this type of thing, like an I18NCombinedString object that gets replaced instead of just a normal string

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 to some concat string handling (not nesting :).

As long as the constituent strings are findable statically, the human translators will understand and replacement should work fine after concatenating. We just need to get i18n.js to handle it without adding too much complexity.

Or what's the combinatorics on this audit? We could just defer on this and include multiple (partially redundant) explanation UIStrings.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or what's the combinatorics on this audit?

It's just two. I vote for deferring.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deferred by splitting into explanation with disclaimer and without

punted 🏈

Copy link
Collaborator

@patrickhulce patrickhulce left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for these titles that describe the state like a11y I went with

This title is descriptive of the successful state and is shown to users when no user action is required.

and

This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed.

after the basic outline of what the audit did, maybe we stick with that or come up with a new strategy? the only imperative ones should be the audit opportunities, so if it was copy/paste we probably need to fix some more audits out there :)

lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/manual/mobile-friendly.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/manual/structured-data.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/meta-description.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/plugins.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/robots-txt.js Outdated Show resolved Hide resolved
const UIStrings = {
/** Title of a Lighthouse audit that tells the user their links have descriptive enough text for a search engine crawler to parse them. This is displayed in a list of audit titles that Lighthouse generates. */
title: 'Links have descriptive text',
/** Title of a Lighthouse audit that tells the user their links have descriptive enough text for a search engine crawler to parse them. This title is shown when there are links on the page without proper text to describe them. */
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if this pattern is followed elsewhere, but I personally find it a tad unclear what's going on after the first sentence since they're the same.

IMO we could flip the first sentence Title of a Lighthouse audit that tells the user their links **do not** have descriptive enough text for a search engine crawler to parse them. and then we don't need the 2nd or the 2nd could explain that it's showed in a list of other failing audit titles that lighthouse generates?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it depends on how you interpret the that clause, if it modifies audit I get it, if it modifies Title then it's not true :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do this a lot where the first sentence is shared between the title and failureTitle, but other places we don't. When I initially looked I thought this was the standard, but it seems mixed. So I'm not sure if we want to standardize one way or the other, or move forward this was or that?

/** Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This descriptive title is shown to users when the amount is acceptable and no user action is required. */
title: 'Avoids an excessive DOM size',
/** Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This imperative title is shown to users when there is a significant amount of execution time that could be reduced. */
failureTitle: 'Avoid an excessive DOM size',

/** Title of a diagnostic audit that provides detail on how long it took from starting a request to when the server started responding. This descriptive title is shown to users when the amount is acceptable and no user action is required. */
title: 'Server response times are low (TTFB)',
/** Title of a diagnostic audit that provides detail on how long it took from starting a request to when the server started responding. This imperative title is shown to users when there is a significant amount of execution time that could be reduced. */
failureTitle: 'Reduce server response times (TTFB)',

/** Title of a diagnostic audit that provides detail on the time spent executing javascript files during the load. This descriptive title is shown to users when the amount is acceptable and no user action is required. */
title: 'JavaScript execution time',
/** Title of a diagnostic audit that provides detail on the time spent executing javascript files during the load. This imperative title is shown to users when there is a significant amount of execution time that could be reduced. */
failureTitle: 'Reduce JavaScript execution time',

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh gotcha yeah if we change to match their style. i.e. that provides detail on is the first sentence and the conditions that describe pass/fail in the second sentence, I think that makes a lot more sense 👍

The "that tells the user the links have descriptive enough text" part when they don't have enough descriptive text seems like a recipe for translator confusion

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took another shot at it with the that provides detail on styling. I think it is much cleaner!

@exterkamp
Copy link
Member Author

I'm gonna make sure that the category title + description are there. Don't commit this yet.

@exterkamp exterkamp changed the title i18n: seo (WIP) i18n: seo Jan 14, 2019
@exterkamp exterkamp changed the title (WIP) i18n: seo i18n: seo Jan 29, 2019
@patrickhulce
Copy link
Collaborator

Does this mean you're ready for more review now @exterkamp ?

@exterkamp
Copy link
Member Author

Yup ready for review!

Copy link
Collaborator

@patrickhulce patrickhulce left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice @exterkamp great job on the descriptions I agree they are much easier to grok now!

I know this is all pretty tedious stuff too we're almost there 😆

lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/hreflang.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/http-status-code.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/link-text.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/manual/mobile-friendly.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/manual/structured-data.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/canonical.js Outdated Show resolved Hide resolved
'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/descriptive-link-text).',
/** [ICU Syntax] Label for the audit identifying the number of links found. */
displayValue: `{itemCount, plural,
=1 {1 link found}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are there any docs explaining how this format works

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lighthouse-core/audits/seo/robots-txt.js Outdated Show resolved Hide resolved
Copy link
Member

@brendankenny brendankenny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These comments are all on one line so github suggestions work great for them :)

Don't feel obligated to accept suggestions as they are, they're more to clarify some wording and adding qualifiers or additional descriptions. I also wrote them quite quickly :) Incorporate or reword some more.

I think this is almost there. Let's land it!

const i18n = require('../../lib/i18n/i18n.js');

const UIStrings = {
/** Title of a Lighthouse audit that provides detail on the robots.txt file on the page. This descriptive title is shown when the robots.txt file is present and configured correctly. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"on the page" doesn't really make sense here and the failureTitle below. "on the site's robots.txt file" maybe? Maybe also leave a note to not translate "robots.txt" (and we can hopefully do #6945 for real later)

lighthouse-core/audits/seo/robots-txt.js Outdated Show resolved Hide resolved
description: 'If your robots.txt file is malformed, crawlers may not be able to understand ' +
'how you want your website to be crawled or indexed.',
/** [ICU Syntax] Label for the audit identifying that the robots.txt request has returned a specific HTTP status code. */
displayValueHttpError: 'request for robots.txt returned HTTP status: {statusCode, number}',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe switch around the variable name for this (and the next one) to httpErrorDisplayValue to differentiate from lhErrors and so it's clear the thing itself isn't an error or error message, it's the display value when there was an error.

Also give more context for the variable. "statusCode will be replaced with a three-digit integer which represents the status of the HTTP connection (e.g. successful, error, redirected, etc)." or whatever

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

displayValue... for the display values var names makes more sense to me instead of prefixing with an error, all the displayValues prefix with displayValue and group them together as such. IMO

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, maybe we could use a different word than "error" then?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed this one, but I think we should keep displayValueValidationError because they literally are validation errors.

lighthouse-core/audits/seo/robots-txt.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/robots-txt.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
/** Explanatory message stating that there was a failure in an audit caused by a missing page viewport meta tag configuration. */
explanationViewport: 'Text is illegible because there\'s no viewport meta tag optimized ' +
'for mobile screens.',
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small. */
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small. "decimalProportion" will be replaced by a percentage between 0 and 100%. */

'for mobile screens.',
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small. */
explanation: '{decimalProportion, number, extendedPercent} of text is too small.',
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small, based on a sample size of text that was less than 100% of the text on the page. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small, based on a sample size of text that was less than 100% of the text on the page. */
/** Explanatory message stating that there was a failure in an audit caused by a certain percentage of the text on the page being too small, based on a sample size of text that was less than 100% of the text on the page. "decimalProportion" and "decimalProportionVisited" will be replaced by percentages between 0 and 100%. */

const UIStrings = {
/** Title of a Lighthouse audit that provides detail on the robots.txt file on the page. This descriptive title is shown when the robots.txt file is present and configured correctly. */
title: 'robots.txt is valid',
/** Descriptive title of a Lighthouse audit that provides detail on the robots.txt file on the page. This imperative title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/** Descriptive title of a Lighthouse audit that provides detail on the robots.txt file on the page. This imperative title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */
/** Title of a Lighthouse audit that provides detail on the robots.txt file on the page. This descriptive title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */

Copy link
Member

@brendankenny brendankenny left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a few more suggestions (and the existing ones in font-size.js), but otherwise LGTM!

const UIStrings = {
/** Title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This descriptive title is shown when the robots.txt file is present and configured correctly. */
title: 'robots.txt is valid',
/** Descriptive title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This imperative title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/** Descriptive title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This imperative title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */
/** Descriptive title of a Lighthouse audit that provides detail on the site's robots.txt file. Note: "robots.txt" is a canonical filename and should not be translated. This title is shown when the robots.txt file is misconfigured, which makes the page hard or impossible to scan via web crawler. */

const i18n = require('../../../lib/i18n/i18n.js');

const UIStrings = {
/** Description of a Lighthouse audit that provides detail on the structured data in a page. Structured data is standardized data on a page that helps a search engine categorize and understand its contents. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is "structured data" a specific enough term that we should ask that it should be left untranslated? I really have no idea.

We can always leave it to be translated and users can click on the links to learn more.

lighthouse-core/audits/seo/manual/structured-data.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/manual/structured-data.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/link-text.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
lighthouse-core/audits/seo/font-size.js Outdated Show resolved Hide resolved
explanationPointsElsewhere: 'Points to another hreflang location ({url})',
/** [ICU Syntax] Explanatory message stating that there was a failure in an audit caused by a URL pointing to a different domain. "url" will be replaced by the invalid URL (e.g. https://example.com). */
explanationDifferentDomain: 'Points to a different domain ({url})',
/** Explanatory message stating that the page's canonical URL was pointing to a 'root of the same origin' which is a common mistake. The canonical URL should point a different page with the same content whose URL is preferred; however, in this case the canonical URL points to the root page (which is of the same origin) i.e. http://example.com/post1?alt=true -points to-> http://example.com/ when it should point to something like http://example.com/post1. In this context "root" is the starting page of a website, and "origin" is the domain the website is registered under. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ha, this is still a bit confusing :) :)

Maybe it would be easier to define "points", "root", and "origin" rather than giving the context?

@brendankenny
Copy link
Member

@patrickhulce you still have a blocking review request if you want to take another look.

@GoogleChrome GoogleChrome deleted a comment from googlebot Feb 14, 2019
Copy link
Collaborator

@patrickhulce patrickhulce left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Sorry for the delay folks, I thought I had already dismissed my review 😅

description: 'If your robots.txt file is malformed, crawlers may not be able to understand ' +
'how you want your website to be crawled or indexed.',
/** [ICU Syntax] Label for the audit identifying that the robots.txt request has returned a specific HTTP status code. Note: "robots.txt" is a canonical filename and should not be translated. "statusCode" will be replaced with a 3 digit integer which represents the status of the HTTP connectiong for this page. */
displayValueHttpBadCode: 'request for robots.txt returned HTTP status: {statusCode, number}',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

displayValueHttpBadCode

<3 :)

@paulirish paulirish merged commit 4290080 into master Feb 14, 2019
@paulirish
Copy link
Member

🇦🇫 🇦🇽 🇦🇱 🇩🇿 🇦🇸 🇦🇩 🇦🇴 🇦🇮 🇦🇶 🇦🇬 🇦🇷 🇦🇲 🇦🇼 🇦🇨 🇦🇺 🇦🇹 🇦🇿 🇧🇸 🇧🇭 🇧🇩 🇧🇧 🇧🇾 🇧🇪 🇧🇿 🇧🇯 🇧🇲 🇧🇹 🇧🇴 🇧🇦 🇧🇼 🇧🇻 🇧🇷 🇮🇴 🇻🇬 🇧🇳 🇧🇬 🇧🇫 🇧🇮 🇰🇭 🇨🇲 🇨🇦 🇮🇨 🇨🇻 🇧🇶 🇰🇾 🇨🇫 🇪🇦 🇹🇩 🇨🇱 🇨🇳 🇨🇽 🇨🇵 🇨🇨 🇨🇴 🇰🇲 🇨🇬 🇨🇩 🇨🇰 🇨🇷 🇨🇮 🇭🇷 🇨🇺 🇨🇼 🇨🇾 🇨🇿 🇩🇰 🇩🇬 🇩🇯 🇩🇲 🇩🇴 🇪🇨 🇪🇬 🇸🇻 🇬🇶 🇪🇷 🇪🇪 🇪🇹 🇪🇺 🇫🇰 🇫🇴 🇫🇯 🇫🇮 🇫🇷 🇬🇫 🇵🇫 🇹🇫 🇬🇦 🇬🇲 🇬🇪 🇩🇪 🇬🇭 🇬🇮 🇬🇷 🇬🇱 🇬🇩 🇬🇵 🇬🇺 🇬🇹 🇬🇬 🇬🇳 🇬🇼 🇬🇾 🇭🇹 🇭🇲 🇭🇳 🇭🇰 🇭🇺 🇮🇸 🇮🇳 🇮🇩 🇮🇷 🇮🇶 🇮🇪 🇮🇲 🇮🇱 🇮🇹 🇯🇲 🇯🇵 🇯🇪 🇯🇴 🇰🇿 🇰🇪 🇰🇮 🇽🇰 🇰🇼 🇰🇬 🇱🇦 🇱🇻 🇱🇧 🇱🇸 🇱🇷 🇱🇾 🇱🇮 🇱🇹 🇱🇺 🇲🇴 🇲🇰 🇲🇬 🇲🇼 🇲🇾 🇲🇻 🇲🇱 🇲🇹 🇲🇭 🇲🇶 🇲🇷 🇲🇺 🇾🇹 🇲🇽 🇫🇲 🇲🇩 🇲🇨 🇲🇳 🇲🇪 🇲🇸 🇲🇦 🇲🇿 🇲🇲 🇳🇦 🇳🇷 🇳🇵 🇳🇱 🇳🇨 🇳🇿 🇳🇮 🇳🇪 🇳🇬 🇳🇺 🇳🇫 🇲🇵 🇰🇵 🇳🇴 🇴🇲 🇵🇰 🇵🇼 🇵🇸 🇵🇦 🇵🇬 🇵🇾 🇵🇪 🇵🇭 🇵🇳 🇵🇱 🇵🇹 🇵🇷 🇶🇦 🇷🇪 🇷🇴 🇷🇺 🇷🇼 🇼🇸 🇸🇲 🇸🇹 🇸🇦 🇸🇳 🇷🇸 🇸🇨 🇸🇱 🇸🇬 🇸🇽 🇸🇰 🇸🇮 🇸🇧 🇸🇴 🇿🇦 🇬🇸 🇰🇷 🇸🇸 🇪🇸 🇱🇰 🇧🇱 🇸🇭 🇰🇳 🇱🇨 🇲🇫 🇵🇲 🇻🇨 🇸🇩 🇸🇷 🇸🇯 🇸🇿 🇸🇪 🇨🇭 🇸🇾 🇹🇼 🇹🇯 🇹🇿 🇹🇭 🇹🇱 🇹🇬 🇹🇰 🇹🇴 🇹🇹 🇹🇦 🇹🇳 🇹🇷 🇹🇲 🇹🇨 🇹🇻 🇺🇬 🇺🇦 🇦🇪 🇬🇧 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🏴󠁧󠁢󠁳󠁣󠁴󠁿 🏴󠁧󠁢󠁷󠁬󠁳󠁿 🇺🇸 🇺🇾 🇺🇲 🇻🇮 🇺🇿 🇻🇺 🇻🇦 🇻🇪 🇻🇳 🇼🇫 🇪🇭 🇾🇪 🇿🇲 🇿🇼

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
i18n internationalization thangs
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants