【转】GitHub汉化脚本(谷歌浏览器)
- // ==UserScript==
- // @name GitHub 汉化插件
- // @description 汉化 GitHub 界面的部分菜单及内容。
- // @copyright 2016, 楼教主 (http://www.52cik.com/)
- // @icon https://assets-cdn.github.com/pinned-octocat.svg
- // @version 1.6.4
- // @author 楼教主
- // @license MIT
- // @homepageURL https://github.com/52cik/github-hans
- // @match http://*.github.com/*
- // @match https://*.github.com/*
- // @require https://52cik.github.io/github-hans/locals.js?v1.6.4
- // @run-at document-end
- // @grant none
- // ==/UserScript==
- (function (window, document, undefined) {
- 'use strict';
- var lang = 'zh'; // 中文
- // 2016-04-18 github 将 jquery 以 amd 加载,不暴露到全局了。
- // var $ = require('github/jquery')['default'];
- // 要翻译的页面
- var page = getPage();
- transTitle(); // 页面标题翻译
- timeElement(); // 时间节点翻译
- // setTimeout(contributions, 100); // 贡献日历翻译 (日历是内嵌或ajax的, 所以基于回调事件处理)
- walk(document.body); // 立即翻译页面
- // 2017-03-19 github 屏蔽 require 改为 Promise 形式的 ghImport
- define('github-hans-ajax', ['./jquery'], function($) {
- $(document).ajaxComplete(function () {
- transTitle();
- walk(document.body); // ajax 请求后再次翻译页面
- });
- });
- ghImport('github-hans-ajax')['catch'](function(e) {
- setTimeout(function() { throw e });
- });
- /**
- * 遍历节点
- *
- * @param {Element} node 节点
- */
- function walk(node) {
- var nodes = node.childNodes;
- for (var i = 0, len = nodes.length; i < len; i++) {
- var el = nodes[i];
- // todo 1. 修复多属性翻译问题; 2. 添加事件翻译, 如论预览信息;
- if (el.nodeType === Node.ELEMENT_NODE) { // 元素节点处理
- // 元素节点属性翻译
- if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') { // 输入框 按钮 文本域
- if (el.type === 'button' || el.type === 'submit') {
- transElement(el, 'value');
- } else {
- transElement(el, 'placeholder');
- }
- } else if (el.hasAttribute('aria-label')) { // 带提示的元素,类似 tooltip 效果的
- transElement(el, 'aria-label', true);
- if (el.hasAttribute('data-copied-hint')) { // 复制成功提示
- transElement(el.dataset, 'copiedHint');
- }
- } else if (el.tagName === 'OPTGROUP') { // 翻译 <optgroup> 的 label 属性
- transElement(el, 'label');
- }
- if (el.hasAttribute('data-disable-with')) { // 按钮等待提示
- transElement(el.dataset, 'disableWith');
- }
- // 跳过 readme, 文件列表, 代码显示
- if (el.id !== 'readme' && !I18N.conf.reIgnore.test(el.className)) {
- walk(el); // 遍历子节点
- }
- } else if (el.nodeType === Node.TEXT_NODE) { // 文本节点翻译
- transElement(el, 'data');
- }
- }
- }
- /**
- * 获取翻译页面
- */
- function getPage() {
- // 先匹配 body 的 class
- var page = document.body.className.match(I18N.conf.rePageClass);
- if (!page) { // 扩展 url 匹配
- page = location.href.match(I18N.conf.rePageUrl);
- }
- if (!page) { // 扩展 pathname 匹配
- page = location.pathname.match(I18N.conf.rePagePath);
- }
- return page ? page[1] || 'homepage' : false; // 取页面 key
- }
- /**
- * 翻译页面标题
- */
- function transTitle() {
- var title = translate(document.title, 'title');
- if (title === false) { // 无翻译则退出
- return false;
- }
- document.title = title;
- }
- /**
- * 翻译节点对应属性内容
- *
- * @param {object} el 对象
- * @param {string} field 属性字段
- * @param {boolean} isAttr 是否是 attr 属性
- *
- * @returns {boolean}
- */
- function transElement(el, field, isAttr) {
- var transText = false; // 翻译后的文本
- if (isAttr === undefined) { // 非属性翻译
- transText = translate(el[field], page);
- } else {
- transText = translate(el.getAttribute(field), page);
- }
- if (transText === false) { // 无翻译则退出
- return false;
- }
- // 替换翻译后的内容
- if (isAttr === undefined) {
- el[field] = transText;
- } else {
- el.setAttribute(field, transText);
- }
- }
- /**
- * 翻译文本
- *
- * @param {string} text 待翻译字符串
- * @param {string} page 页面字段
- *
- * @returns {string|boolean}
- */
- function translate(text, page) { // 翻译
- var str;
- var _key = text.trim(); // 去除首尾空格的 key
- var _key_neat = _key
- .replace(/\xa0/g, ' ') // 替换 空格导致的 bug
- .replace(/\s{2,}/g, ' '); // 去除多余换行空格等字符,(试验测试阶段,有问题再恢复)
- if (_key_neat === '') {
- return false;
- } // 内容为空不翻译
- str = transPage('pubilc', _key_neat); // 公共翻译
- if (str !== false && str !== _key_neat) { // 公共翻译完成
- str = transPage('pubilc', str) || str; // 二次公共翻译(为了弥补正则部分翻译的情况)
- return text.replace(_key, str); // 替换原字符,保留空白部分
- }
- if (page === false) {
- return false;
- } // 未知页面不翻译
- str = transPage(page, _key_neat); // 翻译已知页面
- if (str === false || str === '') {
- return false;
- } // 未知内容不翻译
- str = transPage('pubilc', str) || str; // 二次公共翻译(为了弥补正则部分翻译的情况)
- return text.replace(_key, str); // 替换原字符,保留空白部分
- }
- /**
- * 翻译页面内容
- *
- * @param {string} page 页面
- * @param {string} key 待翻译内容
- *
- * @returns {string|boolean}
- */
- function transPage(page, key) {
- var str; // 翻译结果
- var res; // 正则数组
- // 静态翻译
- str = I18N[lang][page]['static'][key];
- if (str) {
- return str;
- }
- // 正则翻译
- res = I18N[lang][page].regexp;
- if (res) {
- for (var i = 0, len = res.length; i < len; i++) {
- str = key.replace(res[i][0], res[i][1]);
- if (str !== key) {
- return str;
- }
- }
- }
- return false; // 没有翻译条目
- }
- /**
- * 时间节点翻译
- */
- function timeElement() {
- if (!window.RelativeTimeElement) { // 防止报错
- return;
- }
- var RelativeTimeElement$getFormattedDate = RelativeTimeElement.prototype.getFormattedDate;
- var TimeAgoElement$getFormattedDate = TimeAgoElement.prototype.getFormattedDate;
- // var LocalTimeElement$getFormattedDate = LocalTimeElement.prototype.getFormattedDate;
- var RelativeTime = function (str, el) { // 相对时间解析
- if (/^on ([\w ]+)$/.test(str)) {
- return '于 ' + el.title.replace(/ .+$/, '');
- }
- // 使用字典公共翻译的第二个正则翻译相对时间
- var time_ago = I18N[lang].pubilc.regexp[1];
- return str.replace(time_ago[0], time_ago[1]);
- };
- RelativeTimeElement.prototype.getFormattedDate = function () {
- var str = RelativeTimeElement$getFormattedDate.call(this);
- return RelativeTime(str, this);
- };
- TimeAgoElement.prototype.getFormattedDate = function () {
- var str = TimeAgoElement$getFormattedDate.call(this);
- return RelativeTime(str, this);
- };
- LocalTimeElement.prototype.getFormattedDate = function () {
- return this.title.replace(/ .+$/, '');
- };
- // 遍历 time 元素进行翻译
- // 2016-04-16 github 改版,不再用 time 标签了。
- var times = document.querySelectorAll('time, relative-time, time-ago, local-time');
- Array.prototype.forEach.call(times, function (el) {
- if (el.getFormattedDate) { // 跳过未注册的 time 元素
- el.textContent = el.getFormattedDate();
- }
- });
- }
- /**
- * 贡献日历 基于事件翻译
- */
- function contributions() {
- var tip = document.getElementsByClassName('svg-tip-one-line');
- // 等待 IncludeFragmentElement 元素加载完毕后绑定事件
- // var observe = require('github/observe').observe;
- define('github/hans-contributions', ['./observe'], function (observe) {
- observe(".js-calendar-graph-svg", function () {
- setTimeout(function () { // 延时绑定 mouseover 事件,否则没法翻译
- var $calendar = $('.js-calendar-graph');
- walk($calendar[0]); // 翻译日历部分
- $calendar.on('mouseover', '.day', function () {
- if (tip.length === 0) { // 没有 tip 元素时退出防止报错
- return true;
- }
- var data = $(this).data(); // 获取节点上的 data
- var $tip = $(tip[0]);
- $tip.html(data.count + ' 次贡献 ' + data.date);
- var rect = this.getBoundingClientRect(); // 获取元素位置
- var left = rect.left + window.pageXOffset - tip[0].offsetWidth / 2 + 5.5;
- $tip.css('left', left);
- });
- }, 999);
- });
- });
- ghImport('github/hans-contributions')['catch'](function(e) {
- setTimeout(function() { throw e });
- });
- }
- })(window, document);
转载于楼教主GitHub:https://github.com/52cik/github-hans/blob/gh-pages/main.js
【转】GitHub汉化脚本(谷歌浏览器)的更多相关文章
- ENGLISH抠脚童鞋的福利--GitHub汉化插件
今天在某前端群看到一个插件,激动万分啊!我就把插件使用实现的步骤分享一下! 打开chrome浏览器输入地址:chrome://extensions/ : 跳转到其他页面,点击左上角--扩展程序: 将T ...
- 三步操作gitHub汉化插件安装--谷歌浏览器
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 一个好用基于chrome的插件,用来汉化gitHub,大致效果图如下: 步骤一: 首先下载谷歌 ...
- (汉化改进作品)BruteXSS:Xss漏洞扫描脚本
今天给大家进行汉化改进的事一款脚本工具:BruteXSS,这款脚本能自动进行插入XSS,而且可以自定义攻击载荷. 该脚本也同时提供包含了一些绕过各种WAF(Web应用防护系统)的语句. 0×01简 ...
- EasyUI中控件汉化问题
--BY ZYZ 我在使用EasyUI的过程中,遇到了控件无汉化的情况,如下图. 这么多洋文看着觉得挺烦的.时间居然是月日年格式的,这样可不行,得改. 重写控件代码?别,那能是我这种低级代码C-V客能 ...
- GitHub 网站汉化
居然是一个中文Github网站!该不会是个假的吧? 2018-09-03 17:30 前几天分享了一篇文章——3个搜索技巧!在 GitHub上快速找到实用资源!眼尖心细的读者发现了文中的Github网 ...
- jmeter测试报告汉化及脚本编写
在做接口自动化时,生成的测试报告页面是英文的,如现在我们优化成汉文.操作如下: 1,下载汉化包 下载路径:https://i.cnblogs.com/Files.aspx?order=1 2,解压汉化 ...
- InnoSetup汉化版打包工具下载-附带脚本模板
InnoSetup汉化版打包工具下载地址: https://www.90pan.com/b1907264 脚本模板 ; 脚本用 Inno Setup 脚本向导 生成.; 查阅文档获取创建 INNO S ...
- 真正菜鸟用教程之WQSG Scrip Export WQSG (脚本导出导入工具,PSP、NDS汉化必备 )
先扫盲WQSG是干什么用的 一些掌机类游戏汉化比方PSP NDS 汉化必备之物 它能够依据字典转换文本 假设你不知道这是啥玩意,快去充电染成茜色的坂道 文本提取(导出)方法 (下文称导出文章) 在导出 ...
- Github Atom汉化方式
1.下载:Atom https://atom.io/ 2.安装 3.菜单栏 -- Setting --- Install --- 搜索Chinese --安装汉化包 4.重启 生效.
随机推荐
- Spark源码分析 – Checkpoint
CP的步骤 1. 首先如果RDD需要CP, 调用RDD.checkpoint()来mark 注释说了, 这个需要在Job被执行前被mark, 原因后面看, 并且最好选择persist这个RDD, 否则 ...
- 剑指Offer——构建乘积数组
题目描述: 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. ...
- 22.Atomicity and Transactions-官方文档摘录
原子性和事务 1 在单个文档修改多个嵌入文档,写操作都在文档级别上都是原子的 2 在单个写操作修改多个文档时,每个文档的修改都具有原子性,但是,作为一个整体的操作,并不是原子的.其他操作可能有交互.使 ...
- Design Patterns Example Code (in C++)
Overview Design patterns are ways to reuse design solutions that other software developers have crea ...
- 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服
前言 由于项目越来越多,有很多公共的代码都可以抽取出一个开发库出来传到公司搭建好的Maven私服,以供大家使用. 之前搭建的Maven仓库只有Release和Snapshot两个仓库,最近由于开发库有 ...
- Linux(5)- MariaDB、mysql主从复制、初识redis
一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...
- nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客
GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...
- JavaWeb—Tomcat
简介 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台.安全域管理 ...
- 检查Linux服务器性能命令详解
如果你的Linux服务器突然负载暴增,如何在最短时间内找出Linux性能问题所在? 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmst ...
- table添加横向滚动条
<div style="width:1000px; height:200px; overflow:scroll;"> <table border=" r ...