friendsofflarum / linguist Goto Github PK
View Code? Open in Web Editor NEWCustomize Flarum translations with ease
Home Page: https://discuss.flarum.org/d/7026
License: MIT License
Customize Flarum translations with ease
Home Page: https://discuss.flarum.org/d/7026
License: MIT License
Hi,
I would like to download the translated yml file from Linguist. Would this be possible?
Thanks
It would probably be helpful to be able to clear the cache right from the Linguist tab.
It could also include a help text on how to refresh browser cache and not forgetting Cloudflare(-like) setups.
Bazaar doesn't show up in the translatable extensions list
As mentioned here
https://discuss.flarum.org/d/7026-linguist-customize-translations-with-ease/38
A filter to show empty fields for a selected language/all would be useful.
Hi,
When I try to (re-)enable Linguist, I got the following error (logs file). The activation failed.
I tried to uninstall/reinstall, the issue still here. I didn't erase old MySQL tables for the moment.
Flarum core 0.1.0-beta.8.1
PHP version: 7.3.5-1+0~20190503093827.38+stretch~1.gbp60a41b
Loaded extensions: Core, date, libxml, openssl, pcre, zlib, filter, hash, pcntl, Reflection, SPL, sodium, session, standard, mysqlnd, PDO, xml, calendar, ctype, curl, dom, mbstring, fileinfo, ftp, gd, gettext, iconv, imagick, json, exif, mysqli, newrelic, pdo_mysql, pdo_sqlite, Phar, posix, readline, recode, shmop, SimpleXML, sockets, sqlite3, sysvmsg, sysvsem, sysvshm, tidy, tokenizer, wddx, xmlreader, xmlrpc, xmlwriter, xsl, zip, Zend OPcache
+---------------------------------+-----------------+------------------------------------------+
| Flarum Extensions | | |
+---------------------------------+-----------------+------------------------------------------+
| ID | Version | Commit |
+---------------------------------+-----------------+------------------------------------------+
| flarum-statistics | v0.1.0-beta.8 | |
| flarum-sticky | v0.1.0-beta.8 | |
| flarum-subscriptions | v0.1.0-beta.8 | |
| flarum-suspend | v0.1.0-beta.8 | |
| flarum-tags | v0.1.0-beta.8.2 | |
| flarum-flags | v0.1.0-beta.8.1 | |
| flarum-emoji | v0.1.0-beta.8 | |
| flarum-bbcode | v0.1.0-beta.8 | |
| flarum-approval | v0.1.0-beta.8 | |
| flarum-mentions | v0.1.0-beta.8.1 | |
| flarum-markdown | v0.1.0-beta.8 | |
| flarum-lock | v0.1.0-beta.8 | |
| flarum-likes | v0.1.0-beta.8.1 | |
| flarum-pusher | v0.1.0-beta.8.1 | |
| milescellar-lang-french | v1.2.1 | |
| noriods-auto-more | 0.3.0 | |
| flagrow-direct-links | 0.2.0 | |
| flagrow-terms | 0.3.1 | |
| flagrow-users-list | 0.1.2 | |
| reflar-polls | 1.3.3 | |
| flagrow-upload | 0.7.1 | |
| flagrow-byobu | 0.2.2 | |
| fof-socialprofile | 0.1.1 | |
| fof-pages | 0.2.2 | |
| fof-formatting | 0.1.2 | |
| kvothe-pipetables | 1.0.9 | |
| fof-links | 0.1.1 | |
| kvothe-keyboard-shortcuts | v0.1.0 | |
| fof-default-group | 0.1.0 | |
| flagrow-analytics | 0.8.0 | |
| jordanjay29-summaries | 0.3.1 | |
| flagrow-user-directory | 0.2.1 | |
| amaurycarrade-syndication | v0.2.0 | |
| fof-merge-discussions | 0.2.1 | |
| flagrow-split | 0.3.2 | |
| reflar-reactions | 1.0.0-beta.5.2 | |
| fof-prevent-necrobumping | 0.1.3 | |
| michaelbelgium-discussion-views | v0.1.0-beta.8.2 | |
| fajuu-contactbutton | v2.0 | |
| fof-sentry | 0.1.1 | |
| michaelbelgium-profile-views | v0.1.0-beta-8-4 | d4af84a8c6ea15408e6ae00942fe4f4c9fa8288b |
| fof-recaptcha | 0.1.0 | |
| reflar-cookie-consent | 0.2.0 | |
| fof-secure-https | v0.1.0 | |
| fof-spamblock | 0.2.1 | |
| reflar-pwned-passwords | 0.2.0 | |
| flagrow-bazaar | 0.3.10 | |
| fof-transliterator | 0.1.1 | |
| reflar-stopforumspam | 0.1.5 | |
| flagrow-sitemap | 0.2.0 | |
| flarum-akismet | v0.1.0-beta.8 | |
| flagrow-impersonate | 0.2.0 | |
| rooaaar-lang-french-extended | dev-master | 8059489b0a8b430961a8cf5d916a8980c5acea45 |
+---------------------------------+-----------------+------------------------------------------+
Base URL: https://forum.nefald.fr
PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'flarum_flagrow_linguist_strings' already exists
#58 vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php(117): execute
#57 vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php(117): execute
#56 vendor/illuminate/database/Connection.php(458): Illuminate\Database\{closure}
#55 vendor/illuminate/database/Connection.php(657): runQueryCallback
#54 vendor/illuminate/database/Connection.php(624): run
#53 vendor/illuminate/database/Connection.php(459): statement
#52 vendor/illuminate/database/Schema/Blueprint.php(86): build
#51 vendor/illuminate/database/Schema/Builder.php(252): build
#50 vendor/illuminate/database/Schema/Builder.php(165): create
#49 vendor/flagrow/linguist/migrations/2017_10_04_create_flagrow_linguist_strings_table.php(16): {closure}
#48 vendor/illuminate/filesystem/Filesystem.php(0): call_user_func
#47 vendor/flarum/core/src/Database/Migrator.php(197): runClosureMigration
#46 vendor/flarum/core/src/Database/Migrator.php(130): runUp
#45 vendor/flarum/core/src/Database/Migrator.php(113): runMigrationList
#44 vendor/flarum/core/src/Database/Migrator.php(87): run
#43 vendor/flarum/core/src/Extension/ExtensionManager.php(241): migrate
#42 vendor/flarum/core/src/Extension/ExtensionManager.php(127): enable
#41 vendor/flarum/core/src/Api/Controller/UpdateExtensionController.php(49): handle
#40 vendor/flarum/core/src/Http/RouteHandlerFactory.php(40): Flarum\Http\{closure}
#39 vendor/flarum/core/src/Http/Middleware/DispatchRoute.php(67): process
#38 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#37 vendor/reflar/stopforumspam/src/Middleware/RegisterMiddleware.php(75): process
#36 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#35 vendor/reflar/pwned-passwords/src/Middleware/CheckPassword.php(66): process
#34 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#33 vendor/fof/secure-https/src/Middlewares/ContentSecurityPolicyMiddleware.php(21): process
#32 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#31 vendor/fof/sentry/src/Middleware/HandleErrorsWithSentry.php(19): process
#30 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#29 vendor/flagrow/terms/src/Middlewares/RegisterMiddleware.php(59): process
#28 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#27 vendor/flarum/core/src/Http/Middleware/SetLocale.php(51): process
#26 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#25 vendor/flarum/core/src/Http/Middleware/AuthenticateWithHeader.php(55): process
#24 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#23 vendor/flarum/core/src/Http/Middleware/AuthenticateWithSession.php(34): process
#22 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#21 vendor/flarum/core/src/Http/Middleware/RememberFromCookie.php(52): process
#20 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#19 vendor/flarum/core/src/Http/Middleware/StartSession.php(62): process
#18 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#17 vendor/flarum/core/src/Api/Middleware/FakeHttpMethods.php(31): process
#16 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#15 vendor/flarum/core/src/Http/Middleware/ParseJsonBody.php(29): process
#14 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#13 vendor/flarum/core/src/Api/Middleware/HandleErrors.php(42): process
#12 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#11 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#10 vendor/middlewares/request-handler/src/RequestHandler.php(84): process
#9 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#8 vendor/middlewares/base-path-router/src/BasePathRouter.php(97): process
#7 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#6 vendor/middlewares/base-path/src/BasePath.php(53): process
#5 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#4 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#3 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): handle
#2 vendor/zendframework/zend-httphandlerrunner/src/RequestHandlerRunner.php(95): run
#1 vendor/flarum/core/src/Http/Server.php(46): listen
#0 public/index.php(22): null
Doctrine\DBAL\Driver\PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'flarum_flagrow_linguist_strings' already exists
#57 vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php(119): execute
#56 vendor/illuminate/database/Connection.php(458): Illuminate\Database\{closure}
#55 vendor/illuminate/database/Connection.php(657): runQueryCallback
#54 vendor/illuminate/database/Connection.php(624): run
#53 vendor/illuminate/database/Connection.php(459): statement
#52 vendor/illuminate/database/Schema/Blueprint.php(86): build
#51 vendor/illuminate/database/Schema/Builder.php(252): build
#50 vendor/illuminate/database/Schema/Builder.php(165): create
#49 vendor/flagrow/linguist/migrations/2017_10_04_create_flagrow_linguist_strings_table.php(16): {closure}
#48 vendor/illuminate/filesystem/Filesystem.php(0): call_user_func
#47 vendor/flarum/core/src/Database/Migrator.php(197): runClosureMigration
#46 vendor/flarum/core/src/Database/Migrator.php(130): runUp
#45 vendor/flarum/core/src/Database/Migrator.php(113): runMigrationList
#44 vendor/flarum/core/src/Database/Migrator.php(87): run
#43 vendor/flarum/core/src/Extension/ExtensionManager.php(241): migrate
#42 vendor/flarum/core/src/Extension/ExtensionManager.php(127): enable
#41 vendor/flarum/core/src/Api/Controller/UpdateExtensionController.php(49): handle
#40 vendor/flarum/core/src/Http/RouteHandlerFactory.php(40): Flarum\Http\{closure}
#39 vendor/flarum/core/src/Http/Middleware/DispatchRoute.php(67): process
#38 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#37 vendor/reflar/stopforumspam/src/Middleware/RegisterMiddleware.php(75): process
#36 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#35 vendor/reflar/pwned-passwords/src/Middleware/CheckPassword.php(66): process
#34 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#33 vendor/fof/secure-https/src/Middlewares/ContentSecurityPolicyMiddleware.php(21): process
#32 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#31 vendor/fof/sentry/src/Middleware/HandleErrorsWithSentry.php(19): process
#30 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#29 vendor/flagrow/terms/src/Middlewares/RegisterMiddleware.php(59): process
#28 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#27 vendor/flarum/core/src/Http/Middleware/SetLocale.php(51): process
#26 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#25 vendor/flarum/core/src/Http/Middleware/AuthenticateWithHeader.php(55): process
#24 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#23 vendor/flarum/core/src/Http/Middleware/AuthenticateWithSession.php(34): process
#22 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#21 vendor/flarum/core/src/Http/Middleware/RememberFromCookie.php(52): process
#20 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#19 vendor/flarum/core/src/Http/Middleware/StartSession.php(62): process
#18 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#17 vendor/flarum/core/src/Api/Middleware/FakeHttpMethods.php(31): process
#16 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#15 vendor/flarum/core/src/Http/Middleware/ParseJsonBody.php(29): process
#14 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#13 vendor/flarum/core/src/Api/Middleware/HandleErrors.php(42): process
#12 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#11 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#10 vendor/middlewares/request-handler/src/RequestHandler.php(84): process
#9 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#8 vendor/middlewares/base-path-router/src/BasePathRouter.php(97): process
#7 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#6 vendor/middlewares/base-path/src/BasePath.php(53): process
#5 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#4 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#3 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): handle
#2 vendor/zendframework/zend-httphandlerrunner/src/RequestHandlerRunner.php(95): run
#1 vendor/flarum/core/src/Http/Server.php(46): listen
#0 public/index.php(22): null
Illuminate\Database\QueryException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'flarum_flagrow_linguist_strings' already exists (SQL: create table `flarum_flagrow_linguist_strings` (`id` int unsigned not null auto_increment primary key, `key` varchar(180) not null, `locale` varchar(10) null, `value` text not null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate utf8mb4_unicode_ci engine = InnoDB)
#55 vendor/illuminate/database/Connection.php(664): runQueryCallback
#54 vendor/illuminate/database/Connection.php(624): run
#53 vendor/illuminate/database/Connection.php(459): statement
#52 vendor/illuminate/database/Schema/Blueprint.php(86): build
#51 vendor/illuminate/database/Schema/Builder.php(252): build
#50 vendor/illuminate/database/Schema/Builder.php(165): create
#49 vendor/flagrow/linguist/migrations/2017_10_04_create_flagrow_linguist_strings_table.php(16): {closure}
#48 vendor/illuminate/filesystem/Filesystem.php(0): call_user_func
#47 vendor/flarum/core/src/Database/Migrator.php(197): runClosureMigration
#46 vendor/flarum/core/src/Database/Migrator.php(130): runUp
#45 vendor/flarum/core/src/Database/Migrator.php(113): runMigrationList
#44 vendor/flarum/core/src/Database/Migrator.php(87): run
#43 vendor/flarum/core/src/Extension/ExtensionManager.php(241): migrate
#42 vendor/flarum/core/src/Extension/ExtensionManager.php(127): enable
#41 vendor/flarum/core/src/Api/Controller/UpdateExtensionController.php(49): handle
#40 vendor/flarum/core/src/Http/RouteHandlerFactory.php(40): Flarum\Http\{closure}
#39 vendor/flarum/core/src/Http/Middleware/DispatchRoute.php(67): process
#38 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#37 vendor/reflar/stopforumspam/src/Middleware/RegisterMiddleware.php(75): process
#36 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#35 vendor/reflar/pwned-passwords/src/Middleware/CheckPassword.php(66): process
#34 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#33 vendor/fof/secure-https/src/Middlewares/ContentSecurityPolicyMiddleware.php(21): process
#32 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#31 vendor/fof/sentry/src/Middleware/HandleErrorsWithSentry.php(19): process
#30 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#29 vendor/flagrow/terms/src/Middlewares/RegisterMiddleware.php(59): process
#28 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#27 vendor/flarum/core/src/Http/Middleware/SetLocale.php(51): process
#26 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#25 vendor/flarum/core/src/Http/Middleware/AuthenticateWithHeader.php(55): process
#24 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#23 vendor/flarum/core/src/Http/Middleware/AuthenticateWithSession.php(34): process
#22 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#21 vendor/flarum/core/src/Http/Middleware/RememberFromCookie.php(52): process
#20 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#19 vendor/flarum/core/src/Http/Middleware/StartSession.php(62): process
#18 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#17 vendor/flarum/core/src/Api/Middleware/FakeHttpMethods.php(31): process
#16 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#15 vendor/flarum/core/src/Http/Middleware/ParseJsonBody.php(29): process
#14 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#13 vendor/flarum/core/src/Api/Middleware/HandleErrors.php(42): process
#12 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#11 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#10 vendor/middlewares/request-handler/src/RequestHandler.php(84): process
#9 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#8 vendor/middlewares/base-path-router/src/BasePathRouter.php(97): process
#7 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#6 vendor/middlewares/base-path/src/BasePath.php(53): process
#5 vendor/zendframework/zend-stratigility/src/Next.php(52): handle
#4 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): process
#3 vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): handle
#2 vendor/zendframework/zend-httphandlerrunner/src/RequestHandlerRunner.php(95): run
#1 vendor/flarum/core/src/Http/Server.php(46): listen
#0 public/index.php(22): null
Moved from #3 , originally by @Tyler0130
A couple of suggestions regarding the translation keys that would improve the usability of this extension for me.
The current implementation won't work anymore once flarum/framework@0d16fac will be released, probably in beta 9.
The main issue with this extension is that we need to be able to get the default translations without any override to display them in the admin panel. Currently there's a global lock file that allows to export the translations without having linguist injecting anything. This won't work anymore once caching is enabled.
Clearing the cache before and after loading default translations is an option, but then we should cache those default translations so visiting Linguist tab doesn't clear the locales cache even if you don't change anything.
Then of course we need to call app('flarum.locales')->clearCache();
every time a translations is edited. That's the easy part.
I got report there's a key length issue.
The culprit is the composite text key key
-locale
which is too big for some MySQL configurations.
https://dev.mysql.com/doc/refman/5.7/en/create-index.html
Prefix support and lengths of prefixes (where supported) are storage engine dependent. For example, a prefix can be up to 767 bytes long for InnoDB tables or 3072 bytes if the innodb_large_prefix option is enabled
innodb_large_prefix
should normally be enabled by default since MySQL 5.7 but apparently it's not the case for everybody.
We need to redesign this migration so the index size is < 767 bytes
i got this on my forum
even after running
composer update
php flarum migrate
php flarum cache:clear
rm assets/rev-manifest.json
chmod 777 assets assets/* storage/*
info : php flarum info
Flarum core 0.1.0-beta.7
PHP 7.0.28
Loaded extensions: Core, date, libxml, openssl, pcre, sqlite3, zlib, bz2, calendar, ctype, curl, hash, filter, ftp, gettext, gmp, SPL, iconv, pcntl, readline, Reflection, session, standard, shmop, SimpleXML, mbstring, tokenizer, xml, bcmath, dom, fileinfo, gd, imagick, imap, intl, Phar, json, exif, mcrypt, mysqlnd, mysqli, PDO, pdo_mysql, pdo_sqlite, posix, pspell, soap, sockets, tidy, wddx, xmlreader, xmlrpc, xmlwriter, xsl, zip, phalcon, ionCube Loader
EXT flarum-approval v0.1.0-beta.7
EXT flarum-bbcode v0.1.0-beta.5
EXT flarum-emoji v0.1.0-beta.6
EXT flarum-english v0.1.0-beta.7
EXT flagrow-linguist 0.1.2
EXT flarum-flags v0.1.0-beta.7
EXT flarum-likes v0.1.0-beta.6
EXT flarum-lock v0.1.0-beta.7
EXT flarum-markdown v0.1.0-beta.5
EXT flarum-mentions v0.1.0-beta.7
EXT flarum-sticky v0.1.0-beta.7
EXT flarum-subscriptions v0.1.0-beta.6
EXT flarum-suspend v0.1.0-beta.7
EXT flarum-tags v0.1.0-beta.8
A couple of suggestions regarding the translation keys that would improve the usability of this extension for me.
The code responsible for switching between text field and textarea only looks at the original translation value in that field's language. This means multiline is not always offered when it should.
This applies to the "All" field in all situations (notice height of text field vs textarea)
This also applies to a locale field if the text has no original value, and therefore no newline in original value (here, French language pack doesn't have any default value)
Linguist should also look at whether the fallback value contains newline.
Since knowing which one is the fallback isn't an easy task, an alternative could be to just look whether any original value exists for that string with a newline in any language.
Experienced on version 0.4.4 on beta 14, most likely also affects all previous versions.
As a workaround it's always possible to edit the database directly.
I install Linguist on fresh new Flarum v. 1.0.1.
I want active and -- Oops! Something went wrong. Please reload the page and try again.
I clear cachce in Flarum and in Composer and nothing helped
Sometimes, we just want to see admin plugins messages in plain english (instead of translation key - the default when no translation is available).
Would be awesome a button to "Copy all [english] text into empty [brazilian portuguese] keys".
Otherwise, we have to manually copy and paste each entry to make a non translated extension to work:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.