Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Globalize - #54

Open
Setogit wants to merge 4 commits into
masterfrom
globalize
Open

Globalize#54
Setogit wants to merge 4 commits into
masterfrom
globalize

Conversation

@Setogit

Copy link
Copy Markdown
Contributor

connected to strongloop-internal/scrum-nodeops#1157

@SetogitSetogit self-assigned this Dec 25, 2015
@Setogit
Setogitforce-pushed the globalize branch 7 times, most recently from 35d35f7 to f2d4819CompareDecember 29, 2015 01:00
@SetogitSetogit assigned sam-github and unassigned SetogitDec 29, 2015
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

camel case: glb

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

changed

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from f51a5c0 to 0063b05CompareJanuary 1, 2016 06:12
Comment threadintl/fr/messages.json Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why empty?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

that's one of the GPB issues. For es, fr, and pt, this string is translated to empty most likely due to the double curly braces. The issue has been reported to the GPB team.

@sam-github

Copy link
Copy Markdown
Contributor

#54 (comment) is unresolved (mentioning here because it is not displayed because of code updates)

@sam-github

Copy link
Copy Markdown
Contributor

re:
#54 (comment)

space is allowed in keys in json (any string is):

// fr/messages.json

{
"hello, {person}, I am a string!": "bonjour, {person}, je suis un string!",
}

which could be used like: glb.log("hello, {person}, I am a string!", {person: "Tetsuo"});

I'm not sure how difficult to achieve this would be, but I'd like you to consider it more carefully. Strengths are:

  1. our source code is readable (as opposed to the current APIs in globalize, which make the log messages unreadable without a cumbersome lookup by a human of a key in a json file)
  2. unreadable source is error-prone source
  3. it facilitates automated detection of strings, calls to glb.log() (for example) in dev mode can write properties that are not already added into the messages dictionary into it, providing a clue that there is a new or changed message string

There might be some down sides.

What do other users of the globalize package do? Have you done some checking for blogs/design advice?

My experience may be biased by GNU gettext, in that I've worked on code that uses GNU internationalization, and other than seeing _(....)_ wrapped around strings, I didn't even notice the internationalization.

I may be biased, but translators are not going to see our source, we have to maintain and debug it all the time, we need to put effort into making it easier for us. Also, if its hard for us, we'll get it wrong, and then the best translatio won't help, because we will have bugs in our source.

@Setogit
Setogitforce-pushed the globalize branch 5 times, most recently from 49fcb95 to c474262CompareJanuary 3, 2016 06:02
@sam-github

Copy link
Copy Markdown
Contributor

@rmg@kraman PTAL

This is an example of what our code will look like once globalized. More than an example, this is the globalized strong-deploy.

Looks pretty good to me, minimally intrusive.

See https://github.com/strongloop/strong-globalize/blob/refactor-a/README.md for more information on the toolset.

Also, note that once the code is converted to use glb.*(), that there is a code scanner utility in strong-globalize to extract the messages, so the message JSON does not need manual maintenance.

Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In this scenario it totally makes sense, but there's something weird to me about how it completely abstracts away the file opening and reading while still clearly operating on a specified file. I would expect there to have been a path resolver wrapped around the path string instead. I imagine it to look like this:

varUSAGE=fs.readFileSync(glb.resolve('./sl-deploy.txt'),'utf-8').replace(/%MAIN%/g,$0).trim();

If the logical resource is simply a string and the fact that it is in a file is an implementation detail, then I would expect the name to be something like 'USAGE' or something.

@rmg

rmg commented Jan 13, 2016

Copy link
Copy Markdown
Member

I expected strong-globalize to provide an API for operating on Strings, not replicate/wrap all the existing API's that current use Strings..

vart=require('strong-globalize').translate;varf=require('strong-globalize').format;console.log(t('Strings for life!'));console.error(f('%j: %s',newDate(),process.argv[2]));

@Setogit

Copy link
Copy Markdown
ContributorAuthor

Also, all the followings work too:

varg=require('strong-globalize');console.log(g.t('Strings for life!'));g.log('Strings for life!');console.error(g.t('%j: %s',newDate(),process.argv[2]));console.error(g.t('%j: %s',g.d(newDate()),process.argv[2]));console.error(g.t('%s: %s',g.d(newDate()),process.argv[2]));g.error('%j: %s',newDate(),process.argv[2]);g.error('%j: %s',g.d(newDate()),process.argv[2]);g.error('%s: %s',g.d(newDate()),process.argv[2]);

Now that i've dog-fooded and globalized strong-deploy, strong-pm, strong-build, strong-mesh-models, strong-service-install and cli.js of strong-arc, i personally like the following because the key strokes i hit is least (and, it was even fun particularly because messages.json is auto-created and machine-translated to 9 languages (Russian is coming soon) in seconds). I don't mind writing code like this from the beginning:

varg=require('strong-globalize');g.log('Strings for life!');g.error('%s: %s',g.d(newDate()),process.argv[2]);

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@SetogitSetogit assigned sam-github and unassigned SetogitJan 25, 2016
Comment threadbin/sl-deploy.js Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

name has to be protected

@Setogit
Setogitforce-pushed the globalize branch 2 times, most recently from e8ae74e to 7ce5d6bCompareJanuary 26, 2016 05:06
@Setogit

Copy link
Copy Markdown
ContributorAuthor

This requires strongloop/strong-globalize#5

@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

1 similar comment
@Setogit

Copy link
Copy Markdown
ContributorAuthor

@sl-node test please

@sam-github

Copy link
Copy Markdown
Contributor

LGTM, but we can't merge until strong-globalize is published.

@sam-githubsam-github assigned Setogit and unassigned sam-githubJan 27, 2016
@SetogitSetogit removed their assignment Jul 5, 2016
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Setogit@sam-github@rmg