Makefile added; targets for local action run and image building added; workflow for image building and publishing added; image building in action replaced with container pulling

This commit is contained in:
pseusys
2023-01-13 05:05:13 +04:00
parent a21c4d3fcd
commit d6560d8594
10 changed files with 3258 additions and 3178 deletions

2358
sources/colors.json Normal file

File diff suppressed because it is too large Load Diff

108
sources/loc.py Normal file
View File

@@ -0,0 +1,108 @@
import re
import os
import base64
import requests
from github import Github, InputGitAuthor
import datetime
from string import Template
import matplotlib.pyplot as plt
from io import StringIO, BytesIO
from dotenv import load_dotenv
import time
from make_bar_graph import BarGraph
class LinesOfCode:
def __init__(self, id, username, ghtoken, repositoryData, ignored_repos):
self.id = id
self.username = username
self.g = Github(ghtoken)
self.headers = {"Authorization": "Bearer " + ghtoken}
self.repositoryData = repositoryData
self.ignored_repos = ignored_repos
def calculateLoc(self):
result = self.repositoryData
yearly_data = {}
for repo in result['data']['user']['repositories']['edges']:
if repo['node']['name'] not in self.ignored_repos:
self.getCommitStat(repo['node'], yearly_data)
time.sleep(0.7)
return yearly_data
def plotLoc(self, yearly_data):
graph = BarGraph(yearly_data)
graph.build_graph()
self.pushChart()
def run_query_v3(self, endPoint):
# print(endPoint)
request = requests.get(endPoint, headers=self.headers)
if request.status_code == 401:
raise Exception("Invalid token {}.".format(request.status_code))
elif request.status_code == 204:
return []
else:
return request.json()
def getQuarter(self, timeStamp):
month = datetime.datetime.fromisoformat(timeStamp).month
if month >= 1 and month <= 3:
return 1
elif month >= 4 and month <= 6:
return 2
elif month >= 7 and month <= 9:
return 3
elif month >= 10 and month <= 12:
return 4
def getCommitStat(self, repoDetails, yearly_data):
commitsURL = 'https://api.github.com/repos/' + repoDetails['nameWithOwner'] + '/commits'
filteredCommitsEndPoint = commitsURL + '?author=' + self.username
filteredCommitsResult = self.run_query_v3(filteredCommitsEndPoint)
# This ignores the error message you get when you try to list commits for an empty repository
if not type(filteredCommitsResult) == list:
return
this_year = datetime.datetime.utcnow().year
for i in range(len(filteredCommitsResult)):
iso_date = filteredCommitsResult[i]["commit"]["author"]["date"]
date = re.search(r'\d+-\d+-\d+', iso_date).group(0)
curr_year = datetime.datetime.fromisoformat(date).year
# if curr_year != this_year:
individualCommitEndPoint = commitsURL + '/' + filteredCommitsResult[i]["sha"]
individualCommitResult = self.run_query_v3(individualCommitEndPoint)
quarter = self.getQuarter(date)
if repoDetails['primaryLanguage'] is not None:
if curr_year not in yearly_data:
yearly_data[curr_year] = {}
if quarter not in yearly_data[curr_year]:
yearly_data[curr_year][quarter] = {}
if repoDetails['primaryLanguage']['name'] not in yearly_data[curr_year][quarter]:
yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']] = 0
yearly_data[curr_year][quarter][repoDetails['primaryLanguage']['name']] += (individualCommitResult["stats"]["additions"] - individualCommitResult["stats"]['deletions'])
# to find total
# if 'total' not in yearly_data[curr_year]:
# yearly_data[curr_year]['total']={}
# if repoDetails['primaryLanguage']['name'] not in yearly_data[curr_year]['total']:
# yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]=0
# yearly_data[curr_year]['total'][repoDetails['primaryLanguage']['name']]+=(result[i][1]+result[i][2])
def pushChart(self):
repo = self.g.get_repo(f"{self.username}/{self.username}")
committer = InputGitAuthor('readme-bot', '41898282+github-actions[bot]@users.noreply.github.com')
with open('bar_graph.png', 'rb') as input_file:
data = input_file.read()
try:
contents = repo.get_contents("charts/bar_graph.png")
repo.update_file(contents.path, "Charts Updated", data, contents.sha, committer=committer)
except Exception as e:
repo.create_file("charts/bar_graph.png", "Charts Added", data, committer=committer)

591
sources/main.py Normal file
View File

@@ -0,0 +1,591 @@
'''
Readme Development Metrics With waka time progress
'''
import re
import os
import base64
from pytz import timezone
import pytz
import requests
from github import Github, GithubException, InputGitAuthor
import datetime
from string import Template
from loc import LinesOfCode
import time
import traceback
import humanize
from urllib.parse import quote
import json
import sys
from datetime import date
import math
from dotenv import load_dotenv
load_dotenv()
START_COMMENT = '<!--START_SECTION:waka-->'
END_COMMENT = '<!--END_SECTION:waka-->'
listReg = f"{START_COMMENT}[\\s\\S]+{END_COMMENT}"
waka_key = os.getenv('INPUT_WAKATIME_API_KEY')
ghtoken = os.getenv('INPUT_GH_TOKEN')
branchName = os.getenv('INPUT_PUSH_BRANCH_NAME')
showTimeZone = os.getenv('INPUT_SHOW_TIMEZONE')
showProjects = os.getenv('INPUT_SHOW_PROJECTS')
showEditors = os.getenv('INPUT_SHOW_EDITORS')
showOs = os.getenv('INPUT_SHOW_OS')
showCommit = os.getenv('INPUT_SHOW_COMMIT')
showLanguage = os.getenv('INPUT_SHOW_LANGUAGE')
show_loc = os.getenv('INPUT_SHOW_LINES_OF_CODE')
show_days_of_week = os.getenv('INPUT_SHOW_DAYS_OF_WEEK')
showLanguagePerRepo = os.getenv('INPUT_SHOW_LANGUAGE_PER_REPO')
showLocChart = os.getenv('INPUT_SHOW_LOC_CHART')
show_profile_view = os.getenv('INPUT_SHOW_PROFILE_VIEWS')
show_short_info = os.getenv('INPUT_SHOW_SHORT_INFO')
locale = os.getenv('INPUT_LOCALE')
commit_by_me = os.getenv('INPUT_COMMIT_BY_ME')
ignored_repos_name = str(os.getenv('INPUT_IGNORED_REPOS') or '').replace(' ', '').split(',')
show_updated_date = os.getenv('INPUT_SHOW_UPDATED_DATE')
updated_date_format = os.getenv('INPUT_UPDATED_DATE_FORMAT')
commit_message = os.getenv('INPUT_COMMIT_MESSAGE')
commit_username = os.getenv('INPUT_COMMIT_USERNAME')
commit_email = os.getenv('INPUT_COMMIT_EMAIL')
show_total_code_time = os.getenv('INPUT_SHOW_TOTAL_CODE_TIME')
symbol_version = os.getenv('INPUT_SYMBOL_VERSION').strip()
show_waka_stats = 'y'
# The GraphQL query to get commit data.
userInfoQuery = """
{
viewer {
login
email
id
}
}
"""
createContributedRepoQuery = Template("""query {
user(login: "$username") {
repositoriesContributedTo(last: 100, includeUserRepositories: true) {
nodes {
isFork
name
owner {
login
}
}
}
}
}
""")
createCommittedDateQuery = Template("""
query {
repository(owner: "$owner", name: "$name") {
defaultBranchRef {
target {
... on Commit {
history(first: 100, author: { id: "$id" }) {
edges {
node {
committedDate
}
}
}
}
}
}
}
}
""")
get_loc_url = Template("""/repos/$owner/$repo/stats/code_frequency""")
get_profile_view = Template("""/repos/$owner/$repo/traffic/views?per=week""")
get_profile_traffic = Template("""/repos/$owner/$repo/traffic/popular/referrers""")
truthy = ['true', '1', 't', 'y', 'yes']
def run_v3_api(query):
request = requests.get('https://api.github.com' + query, headers=headers)
if request.status_code == 200:
return request.json()
else:
raise Exception(
"Query failed to run by returning code of {}. {},... {}".format(request.status_code, query,
str(request.json())))
repositoryListQuery = Template("""
{
user(login: "$username") {
repositories(orderBy: {field: CREATED_AT, direction: ASC}, last: 100, affiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER], isFork: false) {
totalCount
edges {
node {
object(expression:"master") {
... on Commit {
history (author: { id: "$id" }){
totalCount
}
}
}
primaryLanguage {
color
name
id
}
stargazers {
totalCount
}
collaborators {
totalCount
}
createdAt
name
owner {
id
login
}
nameWithOwner
}
}
}
location
createdAt
name
}
}
""")
def millify(n):
millnames = ['', ' Thousand', ' Million', ' Billion', ' Trillion']
n = float(n)
millidx = max(0, min(len(millnames) - 1,
int(math.floor(0
if n == 0
else math.log10(abs(n)) / 3))))
return '{:.0f}{}'.format(n / 10 ** (3 * millidx), millnames[millidx])
def run_query(query):
request = requests.post('https://api.github.com/graphql', json={'query': query}, headers=headers)
if request.status_code == 200:
return request.json()
else:
raise Exception("Query failed to run by returning code of {}. {}".format(request.status_code, query))
def make_graph(percent: float):
'''Make progress graph from API graph'''
if (symbol_version == '1'): # version 1
done_block = ''
empty_block = ''
elif (symbol_version == '2'): # version 2
done_block = ''
empty_block = ''
elif (symbol_version == '3'): # version 3
done_block = ''
empty_block = ''
else:
done_block = '' # default is version 1
empty_block = ''
pc_rnd = round(percent)
return f"{done_block * int(pc_rnd / 4)}{empty_block * int(25 - int(pc_rnd / 4))}"
def make_list(data: list):
'''Make List'''
data_list = []
for l in data[:5]:
ln = len(l['name'])
ln_text = len(l['text'])
op = f"{l['name'][:25]}{' ' * (25 - ln)}{l['text']}{' ' * (20 - ln_text)}{make_graph(l['percent'])} {l['percent']}%"
data_list.append(op)
return ' \n'.join(data_list)
def make_commit_list(data: list):
'''Make List'''
data_list = []
for l in data[:7]:
ln = len(l['name'])
ln_text = len(l['text'])
op = f"{l['name']}{' ' * (13 - ln)}{l['text']}{' ' * (15 - ln_text)}{make_graph(l['percent'])} {l['percent']}%"
data_list.append(op)
return ' \n'.join(data_list)
def generate_commit_list(tz):
string = ''
result = run_query(userInfoQuery) # Execute the query
username = result["data"]["viewer"]["login"]
id = result["data"]["viewer"]["id"]
# print("user {}".format(username))
result = run_query(createContributedRepoQuery.substitute(username=username))
nodes = result["data"]["user"]["repositoriesContributedTo"]["nodes"]
repos = [d for d in nodes if d['isFork'] is False]
morning = 0 # 6 - 12
daytime = 0 # 12 - 18
evening = 0 # 18 - 24
night = 0 # 0 - 6
Monday = 0
Tuesday = 0
Wednesday = 0
Thursday = 0
Friday = 0
Saturday = 0
Sunday = 0
for repository in repos:
result = run_query(
createCommittedDateQuery.substitute(owner=repository["owner"]["login"], name=repository["name"], id=id))
try:
committed_dates = result["data"]["repository"]["defaultBranchRef"]["target"]["history"]["edges"]
for committedDate in committed_dates:
date = datetime.datetime.strptime(committedDate["node"]["committedDate"],
"%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=pytz.utc).astimezone(
timezone(tz))
hour = date.hour
weekday = date.strftime('%A')
if 6 <= hour < 12:
morning += 1
if 12 <= hour < 18:
daytime += 1
if 18 <= hour < 24:
evening += 1
if 0 <= hour < 6:
night += 1
if weekday == "Monday":
Monday += 1
if weekday == "Tuesday":
Tuesday += 1
if weekday == "Wednesday":
Wednesday += 1
if weekday == "Thursday":
Thursday += 1
if weekday == "Friday":
Friday += 1
if weekday == "Saturday":
Saturday += 1
if weekday == "Sunday":
Sunday += 1
except Exception as ex:
if str(ex) != "'NoneType' object is not subscriptable":
print("Exception occurred " + str(ex))
sumAll = morning + daytime + evening + night
sum_week = Sunday + Monday + Tuesday + Friday + Saturday + Wednesday + Thursday
title = translate['I am an Early'] if morning + daytime >= evening + night else translate['I am a Night']
one_day = [
{"name": "🌞 " + translate['Morning'], "text": str(morning) + " commits",
"percent": round((morning / sumAll) * 100, 2)},
{"name": "🌆 " + translate['Daytime'], "text": str(daytime) + " commits",
"percent": round((daytime / sumAll) * 100, 2)},
{"name": "🌃 " + translate['Evening'], "text": str(evening) + " commits",
"percent": round((evening / sumAll) * 100, 2)},
{"name": "🌙 " + translate['Night'], "text": str(night) + " commits",
"percent": round((night / sumAll) * 100, 2)},
]
dayOfWeek = [
{"name": translate['Monday'], "text": str(Monday) + " commits", "percent": round((Monday / sum_week) * 100, 2)},
{"name": translate['Tuesday'], "text": str(Tuesday) + " commits",
"percent": round((Tuesday / sum_week) * 100, 2)},
{"name": translate['Wednesday'], "text": str(Wednesday) + " commits",
"percent": round((Wednesday / sum_week) * 100, 2)},
{"name": translate['Thursday'], "text": str(Thursday) + " commits",
"percent": round((Thursday / sum_week) * 100, 2)},
{"name": translate['Friday'], "text": str(Friday) + " commits", "percent": round((Friday / sum_week) * 100, 2)},
{"name": translate['Saturday'], "text": str(Saturday) + " commits",
"percent": round((Saturday / sum_week) * 100, 2)},
{"name": translate['Sunday'], "text": str(Sunday) + " commits", "percent": round((Sunday / sum_week) * 100, 2)},
]
string = string + '**' + title + '** \n\n' + '```text\n' + make_commit_list(one_day) + '\n\n```\n'
if show_days_of_week.lower() in truthy:
max_element = {
'percent': 0
}
for day in dayOfWeek:
if day['percent'] > max_element['percent']:
max_element = day
days_title = translate['I am Most Productive on'] % max_element['name']
string = string + '📅 **' + days_title + '** \n\n' + '```text\n' + make_commit_list(dayOfWeek) + '\n\n```\n'
return string
def get_waka_time_stats():
stats = ''
request = requests.get(
f"https://wakatime.com/api/v1/users/current/stats/last_7_days?api_key={waka_key}")
no_activity = translate["No Activity Tracked This Week"]
if request.status_code == 401 or request.status_code != 200:
print("Error With WAKA time API returned " + str(request.status_code) + " Response " + str(request.json()))
else:
data = request.json()
if showCommit.lower() in truthy:
stats = stats + generate_commit_list(tz=data['data']['timezone']) + '\n\n'
if showTimeZone.lower() in truthy or showLanguage.lower() in truthy or showEditors.lower() in truthy or \
showProjects.lower() in truthy or showOs.lower() in truthy:
stats += '📊 **' + translate['This Week I Spend My Time On'] + '** \n\n'
stats += '```text\n'
if showTimeZone.lower() in truthy:
tzone = data['data']['timezone']
stats = stats + '⌚︎ ' + translate['Timezone'] + ': ' + tzone + '\n\n'
if showLanguage.lower() in truthy:
if len(data['data']['languages']) == 0:
lang_list = no_activity
else:
lang_list = make_list(data['data']['languages'])
stats = stats + '💬 ' + translate['Languages'] + ': \n' + lang_list + '\n\n'
if showEditors.lower() in truthy:
if len(data['data']['editors']) == 0:
edit_list = no_activity
else:
edit_list = make_list(data['data']['editors'])
stats = stats + '🔥 ' + translate['Editors'] + ': \n' + edit_list + '\n\n'
if showProjects.lower() in truthy:
if len(data['data']['projects']) == 0:
project_list = no_activity
else:
# Re-order the project list by percentage
data['data']['projects'] = sorted(data['data']['projects'], key=lambda x: x["percent"],
reverse=True)
project_list = make_list(data['data']['projects'])
stats = stats + '🐱‍💻 ' + translate['Projects'] + ': \n' + project_list + '\n\n'
if showOs.lower() in truthy:
if len(data['data']['operating_systems']) == 0:
os_list = no_activity
else:
os_list = make_list(data['data']['operating_systems'])
stats = stats + '💻 ' + translate['operating system'] + ': \n' + os_list + '\n\n'
stats += '```\n\n'
return stats
def generate_language_per_repo(result):
language_count = {}
total = 0
for repo in result['data']['user']['repositories']['edges']:
if repo['node']['primaryLanguage'] is None:
continue
language = repo['node']['primaryLanguage']['name']
color_code = repo['node']['primaryLanguage']['color']
total += 1
if language not in language_count.keys():
language_count[language] = {}
language_count[language]['count'] = 1
else:
language_count[language]['count'] = language_count[language]['count'] + 1
language_count[language]['color'] = color_code
data = []
sorted_labels = list(language_count.keys())
sorted_labels.sort(key=lambda x: language_count[x]['count'], reverse=True)
most_language_repo = sorted_labels[0]
for label in sorted_labels:
percent = round(language_count[label]['count'] / total * 100, 2)
extension = " repos"
if language_count[label]['count'] == 1:
extension = " repo"
data.append({
"name": label,
"text": str(language_count[label]['count']) + extension,
"percent": percent
})
title = translate['I Mostly Code in'] % most_language_repo
return '**' + title + '** \n\n' + '```text\n' + make_list(data) + '\n\n```\n'
def get_yearly_data():
repository_list = run_query(repositoryListQuery.substitute(username=username, id=id))
loc = LinesOfCode(id, username, ghtoken, repository_list, ignored_repos_name)
yearly_data = loc.calculateLoc()
if showLocChart.lower() in truthy:
loc.plotLoc(yearly_data)
return yearly_data
def get_line_of_code():
repositoryList = run_query(repositoryListQuery.substitute(username=username, id=id))
loc = LinesOfCode(id, username, ghtoken, repositoryList, ignored_repos_name)
yearly_data = loc.calculateLoc()
total_loc = sum(
[yearly_data[year][quarter][lang] for year in yearly_data for quarter in yearly_data[year] for lang in
yearly_data[year][quarter]])
return millify(int(total_loc))
def get_short_info(github):
string = '**🐱 ' + translate['My GitHub Data'] + '** \n\n'
user_info = github.get_user()
if user_info.disk_usage is None:
disk_usage = humanize.naturalsize(0)
print("Please add new github personal access token with user permission")
else:
disk_usage = humanize.naturalsize(user_info.disk_usage)
request = requests.get('https://github-contributions.now.sh/api/v1/' + user_info.login)
if request.status_code == 200:
data = request.json()
total = data['years'][0]['total']
year = data['years'][0]['year']
string += '> 🏆 ' + translate['Contributions in the year'] % (humanize.intcomma(total), year) + '\n > \n'
string += '> 📦 ' + translate["Used in GitHub's Storage"] % disk_usage + ' \n > \n'
is_hireable = user_info.hireable
public_repo = user_info.public_repos
private_repo = user_info.owned_private_repos
if private_repo is None:
private_repo = 0
if is_hireable:
string += "> 💼 " + translate["Opted to Hire"] + "\n > \n"
else:
string += "> 🚫 " + translate["Not Opted to Hire"] + "\n > \n"
string += '> 📜 '
string += translate['public repositories'] % public_repo + " " + '\n > \n' if public_repo != 1 else translate[
'public repository'] % public_repo + " " + '\n > \n'
string += '> 🔑 '
string += translate['private repositories'] % private_repo + " " + ' \n > \n' if private_repo != 1 else translate[
'private repository'] % private_repo + " " + '\n > \n'
return string
def get_stats(github):
'''Gets API data and returns markdown progress'''
stats = ''
repositoryList = run_query(repositoryListQuery.substitute(username=username, id=id))
if show_loc.lower() in truthy or showLocChart.lower() in truthy:
# This condition is written to calculate the lines of code because it is heavy process soo needs to be calculate once this will reduce the execution time
yearly_data = get_yearly_data()
if show_total_code_time.lower() in truthy:
request = requests.get(
f"https://wakatime.com/api/v1/users/current/all_time_since_today?api_key={waka_key}")
if request.status_code == 401:
print("Error With WAKA time API returned " + str(request.status_code) + " Response " + str(request.json()))
elif "text" not in request.json()["data"]:
print("User stats are calculating. Try again later.")
else:
data = request.json()
stats += '![Code Time](http://img.shields.io/badge/' + quote(
str("Code Time")) + '-' + quote(str(
data['data']['text'])) + '-blue)\n\n'
if show_profile_view.lower() in truthy:
data = run_v3_api(get_profile_view.substitute(owner=username, repo=username))
stats += '![Profile Views](http://img.shields.io/badge/' + quote(str(translate['Profile Views'])) + '-' + str(
data['count']) + '-blue)\n\n'
if show_loc.lower() in truthy:
stats += '![Lines of code](https://img.shields.io/badge/' + quote(
str(translate['From Hello World I have written'])) + '-' + quote(
str(get_line_of_code())) + '%20' + quote(str(translate['Lines of code'])) + '-blue)\n\n'
if show_short_info.lower() in truthy:
stats += get_short_info(github)
if show_waka_stats.lower() in truthy:
stats += get_waka_time_stats()
if showLanguagePerRepo.lower() in truthy:
stats = stats + generate_language_per_repo(repositoryList) + '\n\n'
if showLocChart.lower() in truthy:
stats += '**' + translate['Timeline'] + '**\n\n'
branch_name = github.get_repo(f'{username}/{username}').default_branch
stats = stats + '![Chart not found](https://raw.githubusercontent.com/' + username + '/' + username + '/' + branch_name + '/charts/bar_graph.png) \n\n'
if show_updated_date.lower() in truthy:
now = datetime.datetime.utcnow()
d1 = now.strftime(updated_date_format)
stats = stats + "\n Last Updated on " + d1 + " UTC"
return stats
# def star_me():
# requests.put("https://api.github.com/user/starred/anmol098/waka-readme-stats", headers=headers)
def decode_readme(data: str):
'''Decode the contents of old readme'''
decoded_bytes = base64.b64decode(data)
return str(decoded_bytes, 'utf-8')
def generate_new_readme(stats: str, readme: str):
'''Generate a new Readme.md'''
stats_in_readme = f"{START_COMMENT}\n{stats}\n{END_COMMENT}"
return re.sub(listReg, stats_in_readme, readme)
if __name__ == '__main__':
try:
start_time = datetime.datetime.now().timestamp() * 1000
if ghtoken is None:
raise Exception('Token not available')
g = Github(ghtoken)
headers = {"Authorization": "Bearer " + ghtoken}
user_data = run_query(userInfoQuery) # Execute the query
if "errors" in user_data:
raise Exception(user_data)
username = user_data["data"]["viewer"]["login"]
id = user_data["data"]["viewer"]["id"]
email = user_data["data"]["viewer"]["email"]
print("Username " + username)
repo = g.get_repo(f"{username}/{username}")
contents = repo.get_readme()
try:
with open(os.path.join(os.path.dirname(__file__), 'translation.json'), encoding='utf-8') as config_file:
data = json.load(config_file)
translate = data[locale]
except Exception as e:
print("Cannot find the Locale choosing default to english")
translate = data['en']
waka_stats = get_stats(g)
# star_me()
rdmd = decode_readme(contents.content)
new_readme = generate_new_readme(stats=waka_stats, readme=rdmd)
if commit_by_me.lower() in truthy:
committer = InputGitAuthor(username or commit_username, email or commit_email)
else:
committer = InputGitAuthor(
commit_username or 'readme-bot',
commit_email or '41898282+github-actions[bot]@users.noreply.github.com'
)
if new_readme != rdmd:
try:
repo.update_file(path=contents.path, message=commit_message,
content=new_readme, sha=contents.sha, branch=branchName,
committer=committer)
except:
repo.update_file(path=contents.path, message=commit_message,
content=new_readme, sha=contents.sha, branch='main',
committer=committer)
print("Readme updated")
end_time = datetime.datetime.now().timestamp() * 1000
print("Program processed in {} miliseconds.".format(round(end_time - start_time, 0)))
except Exception as e:
traceback.print_exc()
print("Exception Occurred " + str(e))

106
sources/make_bar_graph.py Normal file
View File

@@ -0,0 +1,106 @@
import os
import pandas as pd
import numpy as np
import altair as alt
import json
import os
# npm install vega-lite vega-cli canvas
class BarGraph:
def __init__(self, yearly_data):
self.yearly_data = yearly_data
def build_graph(self):
with open(os.path.join(os.path.dirname(__file__), 'colors.json')) as f:
colors = json.load(f)
allColorsValues = []
# filter data
max_languages = 5
top_languages = {}
for year in self.yearly_data.keys():
for quarter in self.yearly_data[year].keys():
for language in sorted(list(self.yearly_data[year][quarter].keys()),
key=lambda lang: self.yearly_data[year][quarter][lang], reverse=True)[
0:max_languages]:
if 'top' not in self.yearly_data[year][quarter]:
self.yearly_data[year][quarter]['top'] = {}
if self.yearly_data[year][quarter][language] != 0:
self.yearly_data[year][quarter]['top'][language] = self.yearly_data[year][quarter][language]
if language not in top_languages:
top_languages[language] = 1
top_languages[language] += 1
# print(self.yearly_data)
all_languages = list(top_languages.keys())
for language in all_languages:
if colors[language]['color'] is not None:
allColorsValues.append(colors[language]['color'])
languages_all_loc = {}
for language in all_languages:
language_year = []
for year in self.yearly_data.keys():
language_quarter = [0, 0, 0, 0]
for quarter in self.yearly_data[year].keys():
if language in self.yearly_data[year][quarter]['top']:
language_quarter[quarter - 1] = self.yearly_data[year][quarter]['top'][language]
else:
language_quarter[quarter - 1] = 0
language_year.append(language_quarter)
languages_all_loc[language] = language_year
# print(languages_all_loc)
language_df = {}
def prep_df(df, name):
df = df.stack().reset_index()
df.columns = ['c1', 'c2', 'values']
df['Language'] = name
return df
for language in languages_all_loc.keys():
language_df[language] = pd.DataFrame(languages_all_loc[language], index=list(self.yearly_data.keys()),
columns=["Q1", "Q2", "Q3", "Q4"])
for language in language_df.keys():
language_df[language] = prep_df(language_df[language], language)
df = pd.concat(language_df.values())
chart = alt.Chart(df).mark_bar().encode(
# tell Altair which field to group columns on
x=alt.X('c2:N', title=None),
# tell Altair which field to use as Y values and how to calculate
y=alt.Y('sum(values):Q',
axis=alt.Axis(
grid=False,
title='LOC added')),
# tell Altair which field to use to use as the set of columns to be represented in each group
column=alt.Column('c1:N', title=None),
# tell Altair which field to use for color segmentation
color=alt.Color('Language:N',
scale=alt.Scale(
domain=all_languages,
# make it look pretty with an enjoyable color pallet
range=allColorsValues,
),
)) \
.configure_view(
# remove grid lines around column clusters
strokeOpacity=0
)
chart.save('bar_graph.png')
return 'bar_graph.png'

668
sources/translation.json Normal file
View File

@@ -0,0 +1,668 @@
{
"fr": {
"Monday": "Lundi",
"Tuesday": "Mardi",
"Wednesday": "Mercredi",
"Thursday": "Jeudi",
"Friday": "Vendredi",
"Saturday": "Samedi",
"Sunday": "Dimanche",
"Morning": "Matin",
"Daytime": "Journée",
"Evening": "Soirée",
"Night": "Nuit",
"Languages": "Langages",
"Editors": "Éditeurs de code",
"operating system": "Système d'exploitation",
"Projects": "Projets",
"Timezone": "Fuseau horaire",
"Contributions in the year": "%s Contributions en %s",
"Used in GitHub's Storage": "%s Utilisés sur le stockage de GitHub",
"Opted to Hire": "A choisi d'embaucher",
"Not Opted to Hire": "N'a pas choisi d'embaucher",
"Profile Views": "Vues du profil",
"From Hello World I have written": "Depuis Hello World, j'ai écrit",
"I am Most Productive on": "Je suis le plus productif le %s",
"This Week I Spend My Time On": "Cette semaine, je passe mon temps sur",
"I Mostly Code in": "Je code principalement en %s",
"Timeline": "Chronologie",
"No Activity Tracked This Week": "Aucune activité enregistrée cette semaine",
"My GitHub Data": "Mes données GitHub",
"Lines of code": "Lignes de code",
"public repository": "%d dépot publique",
"public repositories": "%d dépots publiques",
"private repository": "%d dépot privé",
"private repositories": "%d dépots privés",
"I am an Early": "Je suis un 🐤 du matin",
"I am a Night": "Je suis un 🦉 de nuit"
},
"en": {
"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Sunday": "Sunday",
"Morning": "Morning",
"Daytime": "Daytime",
"Evening": "Evening",
"Night": "Night",
"Languages": "Programming Languages",
"Editors": "Editors",
"operating system": "Operating System",
"Projects": "Projects",
"Timezone": "Time Zone",
"Contributions in the year": "%s Contributions in the Year %s",
"Used in GitHub's Storage": "%s Used in GitHub's Storage",
"Opted to Hire": "Opted to Hire",
"Not Opted to Hire": "Not Opted to Hire",
"Profile Views": "Profile Views",
"From Hello World I have written": "From Hello World I've Written",
"I am Most Productive on": "I'm Most Productive on %s",
"This Week I Spend My Time On": "This Week I Spent My Time On",
"I Mostly Code in": "I Mostly Code in %s",
"Timeline": "Timeline",
"No Activity Tracked This Week": "No Activity Tracked This Week",
"My GitHub Data": "My GitHub Data",
"Lines of code": "lines of code",
"public repository": "%d Public Repository",
"public repositories": "%d Public Repositories",
"private repository": "%d Private Repository",
"private repositories": "%d Private Repositories",
"I am an Early": "I'm an Early 🐤",
"I am a Night": "I'm a Night 🦉"
},
"bn": {
"Monday": "সোমবার",
"Tuesday": "মঙ্গলবার",
"Wednesday": "বুধবার",
"Thursday": "বৃহস্পতিবার",
"Friday": "শুক্রবার",
"Saturday": "শনিবার",
"Sunday": "রবিবার",
"Morning": "সকাল",
"Daytime": "দিনেরবেলা",
"Evening": "সন্ধা",
"Night": "রাত্রি",
"Languages": "প্রোগ্রামিং ভাষা",
"Editors": "এডিটর",
"operating system": "অপারেটিং সিস্টেম",
"Projects": "প্রকল্ম",
"Timezone": "সময় অঞ্চল",
"Contributions in the year": "%s টি অবদান সাল %s এ",
"Used in GitHub's Storage": "%s ব্যবহৃত হয়েছে GitHub এর স্টরেজের",
"Opted to Hire": "নিয়োগের জন্য প্রস্তুত",
"Not Opted to Hire": "নিয়োগের জন্য প্রস্তুত নয়",
"Profile Views": "প্রোফাইল দর্শন",
"From Hello World I have written": "হ্যালো ওয়ার্ল্ড থেকে আমি লিখেছি",
"I am Most Productive on": "আমি সর্বাধিক উৎপাদনশীল %s এ",
"This Week I Spend My Time On": "এই সপ্তাহে আমি আমার সময় কাটিয়েছি",
"I Mostly Code in": "আমি বেশিরভাগ ক্ষেত্রে কোড করি %s তে",
"Timeline": "সময়রেখা",
"No Activity Tracked This Week": "এই সপ্তাহে কোনো কার্যকলাপ ট্র্যাক করা হয়নি",
"My GitHub Data": "আমার Github তথ্য",
"Lines of code": "কোডের লাইন",
"public repository": "%d টি সর্বসাধারণের Repository",
"public repositories": "%d টি সর্বসাধারণের Repositories",
"private repository": "%d টি ব্যক্তিগত Repository",
"private repositories": "%d টি ব্যক্তিগত Repositories",
"I am an Early": "আমি হলাম সকালের 🐤",
"I am a Night": "আমি হলাম রাতের 🦉"
},
"it": {
"Monday": "Lunedì",
"Tuesday": "Martedì",
"Wednesday": "Mecoledì",
"Thursday": "Giovedì",
"Friday": "Venerdì",
"Saturday": "Sabato",
"Sunday": "Domenica",
"Morning": "Mattina",
"Daytime": "Giorno",
"Evening": "Pomeriggio",
"Night": "Notte",
"Languages": "Linguaggi di programmazione",
"Editors": "Editor di testo",
"operating system": "Sistema operativo",
"Projects": "Progetti",
"Timezone": "Fuso orario",
"Contributions in the year": "%s Contributi nell'ultimo anno %s",
"Used in GitHub's Storage": "%s Spazio di archiviazione di GitHub utilizzato",
"Opted to Hire": "Pronto per essere assunto",
"Not Opted to Hire": "Non disponibile per assunzioni/colloqui",
"Profile Views": "Visite al profilo",
"From Hello World I have written": "Dal mio primo Hello World ho scritto ",
"I am Most Productive on": "Sono piu' produttivo di %s",
"This Week I Spend My Time On": "Questa settimana ho speso il mio tempo su",
"I Mostly Code in": "Solitamente programmo in %s",
"Timeline": "Linea temporale",
"No Activity Tracked This Week": "Nessuna attività tracciata questa settimana",
"My GitHub Data": "I miei dati GitHub",
"Lines of code": "Linee di codice",
"public repository": "%d Repository pubblica",
"public repositories": "%d Repositories pubbliche",
"private repository": "%d Repository privata",
"private repositories": "%d Repositories private",
"I am an Early": "Sono un mattiniero 🐤",
"I am a Night": "Sono un notturno 🦉"
},
"zh": {
"Monday": "星期一",
"Tuesday": "星期二",
"Wednesday": "星期三",
"Thursday": "星期四",
"Friday": "星期五",
"Saturday": "星期六",
"Sunday": "星期日",
"Morning": "早晨",
"Daytime": "白天",
"Evening": "傍晚",
"Night": "晚上",
"Languages": "编程语言",
"Editors": "编辑器",
"operating system": "操作系统",
"Projects": "项目",
"Timezone": "时区",
"Contributions in the year": "%s 年贡献了 %s 次",
"Used in GitHub's Storage": " 使用了 %s GitHub 存储空间",
"Opted to Hire": "开放招聘",
"Not Opted to Hire": "不开放招聘",
"Profile Views": "个人资料观看次数",
"From Hello World I have written": "从「Hello World」起我已经写了",
"I am Most Productive on": "我最有效率是在 %s",
"This Week I Spend My Time On": "本周消耗时间",
"I Mostly Code in": "我最常使用 %s",
"Timeline": "时间线",
"No Activity Tracked This Week": "本周没有记录到任何活动",
"My GitHub Data": "我的 GitHub 数据",
"Lines of code": "行代码",
"public repository": "%d 个公共仓库",
"public repositories": "%d 个公共仓库",
"private repository": "%d 个私人仓库",
"private repositories": "%d 个私人仓库",
"I am an Early": "我是早起的 🐤",
"I am a Night": "我是夜猫子 🦉"
},
"zh_TW": {
"Monday": "星期一",
"Tuesday": "星期二",
"Wednesday": "星期三",
"Thursday": "星期四",
"Friday": "星期五",
"Saturday": "星期六",
"Sunday": "星期日",
"Morning": "早晨",
"Daytime": "白天",
"Evening": "傍晚",
"Night": "晚上",
"Languages": "程式語言",
"Editors": "編輯器",
"operating system": "作業系統",
"Projects": "專案",
"Timezone": "時區",
"Contributions in the year": " %s個貢獻在 %s年",
"Used in GitHub's Storage": "在 GitHub 佔用了 %s",
"Opted to Hire": "開放徵才",
"Not Opted to Hire": "不開放徵才",
"Profile Views": "個人頁面瀏覽次數",
"From Hello World I have written": "從「Hello World」我已經寫了",
"I am Most Productive on": "我最有效率是在 %s",
"This Week I Spend My Time On": "本週的花費時間",
"I Mostly Code in": "我最經常使用 %s",
"Timeline": "時間軸",
"No Activity Tracked This Week": "本週沒有任何活動",
"My GitHub Data": "我的 GitHub 數據",
"Lines of code": "行程式碼",
"public repository": "%d 公用倉庫",
"public repositories": "%d 公共倉庫",
"private repository": "%d 私人倉庫",
"private repositories": "%d 私人倉庫",
"I am an Early": "我是早起的",
"I am a Night": "我是夜貓子"
},
"ar": {
"Monday": "الأثنين",
"Tuesday": "الثلاثاء",
"Wednesday": "الأربعاء",
"Thursday": "الخميس",
"Friday": "الجمعة",
"Saturday": "السبت",
"Sunday": "الأحد",
"Morning": "صباح",
"Daytime": "نهار",
"Evening": "مساء",
"Night": "ليل",
"Languages": "لغات البرمجة",
"Editors": "برامج التحرير",
"operating system": "نظام التشغيل",
"Projects": "مشاريع",
"Timezone": "التوقيت زمني",
"Contributions in the year": "%s مساهماتي خلال السنة %s",
"Used in GitHub's Storage": "%s GitHub المساحة المستخدمة في",
"Opted to Hire": "متاح للتوظيف",
"Not Opted to Hire": "غير متاح للتوظيف",
"Profile Views": "Profile Views",
"From Hello World I have written": "From Hello World I have written",
"I am Most Productive on": "انا اكثر انتاجية في يوم %s",
"This Week I Spend My Time On": "هذا الاسبوع قضيت وقتي في",
"I Mostly Code in": "اغلب وقتي استخدم %s",
"Timeline": "الجدول الزمني",
"No Activity Tracked This Week": "لم يتم تتبع أي نشاط هذا الأسبوع",
"My GitHub Data": "GitHub بياناتي في",
"Lines of code": "أسطر من التعليمات البرمجية",
"public repository": "%d المستودع العام",
"public repositories": "%d المستودعات العامة",
"private repository": "%d المستودع الخاص",
"private repositories": "%d المستودعات الخاصة",
"I am an Early": "أنا كالعصفور 🐤 في الصباح",
"I am a Night": "أنا كالبومة 🦉 في الليل"
},
"pt-BR": {
"Monday": "Segunda-Feira",
"Tuesday": "Terça-Feira",
"Wednesday": "Quarta-Feira",
"Thursday": "Quinta-Feira",
"Friday": "Sexta-Feira",
"Saturday": "Sábado",
"Sunday": "Domingo",
"Morning": "Manhã",
"Daytime": "Tarde",
"Evening": "Noite",
"Night": "Madrugada",
"Languages": "Linguagens de programação",
"Editors": "Editores",
"operating system": "Sistema operacional",
"Projects": "Projetos",
"Timezone": "Fuso horário",
"Contributions in the year": "%s Contribuições no ano de %s",
"Used in GitHub's Storage": "%s Usado no armazenamento do GitHub",
"Opted to Hire": "Aberto para contratação",
"Not Opted to Hire": "Não aberto para contratação",
"Profile Views": "Visualizacões do perfil",
"From Hello World I have written": "Desde o Hello World eu escrevi",
"I am Most Productive on": "Sou mais produtivo em %s",
"This Week I Spend My Time On": "Esta semana eu gastei meu tempo em",
"I Mostly Code in": "Eu geralmente programo em %s",
"Timeline": "Linha do tempo",
"No Activity Tracked This Week": "Nenhuma atividade rastreada esta semana",
"My GitHub Data": "Meus dados no GitHub",
"Lines of code": "linhas de código",
"public repository": "%d Repositório Público",
"public repositories": "%d Repositórios Públicos",
"private repository": "%d Repositório Privado",
"private repositories": "%d Repositórios Privados",
"I am an Early": "Eu sou diurno 🐤",
"I am a Night": "Eu sou noturno 🦉"
},
"pl": {
"Monday": "Poniedziałek",
"Tuesday": "Wtorek",
"Wednesday": "Środa",
"Thursday": "Czwartek",
"Friday": "Piątek",
"Saturday": "Sobota",
"Sunday": "Niedziela",
"Morning": "Rano",
"Daytime": "Południe",
"Evening": "Wieczór",
"Night": "Noc",
"Languages": "Języki programowania",
"Editors": "Środowiska programistyczne",
"operating system": "System operacyjny",
"Projects": "Projekty",
"Timezone": "Strefa czasowa",
"Contributions in the year": "%s kontrybucji w roku %s",
"Used in GitHub's Storage": "%s zajętego miejsca na GitHub",
"Opted to Hire": "szukam zarudnienia",
"Not Opted to Hire": "nie szukam zatrudnienia",
"Profile Views": "wyświetlenia profilu",
"From Hello World I have written": "Od Hello World napisałem",
"I am Most Productive on": "Dzień, w którym jestem najbardziej produktywny %s",
"This Week I Spend My Time On": "Czas poświęcony na projekty w tym tygodniu",
"I Mostly Code in": "Najczęściej piszę w %s",
"Timeline": "Linia czasu",
"No Activity Tracked This Week": "Brak aktywności w tym tygodniu",
"My GitHub Data": "Mój GitHub",
"Lines of code": "linii kodu",
"public repository": "%d publiczne repozytoria",
"public repositories": "%d publiczne repozytorium",
"private repository": "%d prywatne repozytorium",
"private repositories": "%d prywatne repozytoria",
"I am an Early": "Jestem rannym 🐤",
"I am a Night": "Jestem nocną 🦉"
},
"es": {
"Monday": "Lunes",
"Tuesday": "Martes",
"Wednesday": "Miércoles",
"Thursday": "Jueves",
"Friday": "Viernes",
"Saturday": "Sábado",
"Sunday": "Domingo",
"Morning": "Mañana",
"Daytime": "Día",
"Evening": "Tarde",
"Night": "Noche",
"Languages": "Lenguajes",
"Editors": "Editores",
"operating system": "Sistema Operativo",
"Projects": "Proyectos",
"Timezone": "Zona Horaria",
"Contributions in the year": "%s Contribuciones durante el año %s",
"Used in GitHub's Storage": "%s Almacenamiento de GitHub utilizado",
"Opted to Hire": "Abierto a contratación",
"Not Opted to Hire": "No abierto para contratación",
"Profile Views": "Visitas al perfil",
"From Hello World I have written": "Desde Hola Mundo he escrito",
"I am Most Productive on": "Soy más productivo los %s",
"This Week I Spend My Time On": "Esta semana me dediqué a",
"I Mostly Code in": "Programo principalmente en %s",
"Timeline": "Cronología",
"No Activity Tracked This Week": "Sin actividad registrada esta semana",
"My GitHub Data": "Mis datos de GitHub",
"Lines of code": "Lineas de código",
"public repository": "%d Repositorio Público",
"public repositories": "%d Repositorios Públicos",
"private repository": "%d Repositorio Privado",
"private repositories": "%d Repositorios Privados",
"I am an Early": "Soy diurno 🐤",
"I am a Night": "Soy nocturno 🦉"
},
"gl": {
"Monday": "Luns",
"Tuesday": "Martes",
"Wednesday": "Mércores",
"Thursday": "Xoves",
"Friday": "Venres",
"Saturday": "Sábado",
"Sunday": "Domingo",
"Morning": "Mañá",
"Daytime": "Día",
"Evening": "Tarde",
"Night": "Noite",
"Languages": "Linguaxes",
"Editors": "Editores",
"operating system": "Sistema Operativo",
"Projects": "Proxectos",
"Timezone": "Zona Horaria",
"Contributions in the year": "%s Contribucións no ano %s",
"Used in GitHub's Storage": "%s Almacenamento de GitHub empregado",
"Opted to Hire": "Abierto á contratación",
"Not Opted to Hire": "Non abierto para contratación",
"Profile Views": "Visitas ó perfil",
"From Hello World I have written": "Dende Hola Mundo escribín",
"I am Most Productive on": "Son máis productivo os %s",
"This Week I Spend My Time On": "Esta semana adiqueime a",
"I Mostly Code in": "Programo principalmente en %s",
"Timeline": "Cronoloxía",
"No Activity Tracked This Week": "Sen actividad rexistrada esta semana",
"My GitHub Data": "Os meu datos de GitHub",
"Lines of code": "Liñas de código",
"public repository": "%d Repositorio Público",
"public repositories": "%d Repositorios Públicos",
"private repository": "%d Repositorio Privado",
"private repositories": "%d Repositorios Privados",
"I am an Early": "Sonche Jalo 🐤",
"I am a Night": "Sonche Moucho 🦉"
},
"ko": {
"Monday": "월요일",
"Tuesday": "화요일",
"Wednesday": "수요일",
"Thursday": "목요일",
"Friday": "금요일",
"Saturday": "토요일",
"Sunday": "일요일",
"Morning": "아침",
"Daytime": "낮 ",
"Evening": "저녁",
"Night": "밤 ",
"Languages": "프로그래밍 언어들",
"Editors": "에디터들",
"operating system": "운영 체제들",
"Projects": "프로젝트들",
"Timezone": "Timezone",
"Contributions in the year": "%s 만큼의 Contributions을 %s년에 했어요",
"Used in GitHub's Storage": "GitHub의 %s만큼의 저장소를 사용하고 있어요.",
"Opted to Hire": "구직중이에요.",
"Not Opted to Hire": "구직중이지 않아요.",
"Profile Views": "Profile Views",
"From Hello World I have written": "저는 여태까지 ",
"I am Most Productive on": "제가 가장 생산적인 날은 %s이에요.",
"This Week I Spend My Time On": "저는 이번주를 이렇게 시간을 보냈어요.",
"I Mostly Code in": "저는 주로 %s 언어를 사용해요.",
"Timeline": "타임라인",
"No Activity Tracked This Week": "이번 주에 활동은 없어요.",
"My GitHub Data": "저의 GitHub 정보에요.",
"Lines of code": "줄의 코드를 작성했어요.",
"public repository": "%d개의 Public Repository를 만들었어요.",
"public repositories": "%d개의 Public Repository를 만들었어요.",
"private repository": "%d개의 Private Repository를 만들었어요.",
"private repositories": "%d개의 Private Repository를 만들었어요.",
"I am an Early": "저는 아침형 인간이에요. 🐤",
"I am a Night": "저는 저녁형 인간이에요. 🦉"
},
"tr": {
"Monday": "Pazartesi",
"Tuesday": "Salı",
"Wednesday": "Çarşamba",
"Thursday": "Perşembe",
"Friday": "Cuma",
"Saturday": "Cumartesi",
"Sunday": "Pazar",
"Morning": "Sabah",
"Daytime": "Gündüz",
"Evening": "Akşam",
"Night": "Gece",
"Languages": "Programlama Dilleri",
"Editors": "Editörler",
"operating system": "İşletim Sistemi",
"Projects": "Projeler",
"Timezone": "Zaman Dilimi",
"Contributions in the year": "%s Katkı, %s Yılında",
"Used in GitHub's Storage": "%s GitHub's Depolama Alanı Kullanıldı",
"Opted to Hire": "Yeni Fırsatlara Açık",
"Not Opted to Hire": "Yeni Fırsatlara Açık Değil",
"Profile Views": "Profil Goruntulenme Sayisi",
"From Hello World I have written": "Merhaba Dünya'dan Beri Yazıyorum",
"I am Most Productive on": "En Çok %s Günleri Üretkenimdir",
"This Week I Spend My Time On": "Bu Hafta Zamanımı Bunlara Harcadım",
"I Mostly Code in": "Çoğunlukla %s Kodluyorum",
"Timeline": "Zaman Çizelgesi",
"No Activity Tracked This Week": "Bu Hafta İzlenen Etkinlik Yok",
"My GitHub Data": "GitHub Verilerim",
"Lines of code": "kod satırı",
"public repository": "%d Halka Açık Depo",
"public repositories": "%d Halka Açık Depolar",
"private repository": "%d Özel Depo",
"private repositories": "%d Özel Depolar",
"I am an Early": "Sabah 🐤'yum",
"I am a Night": "Gece 🦉'yum"
},
"ru": {
"Monday": "Понедельник",
"Tuesday": "Вторник",
"Wednesday": "Среда",
"Thursday": "Четверг",
"Friday": "Пятница",
"Saturday": "Суббота",
"Sunday": "Воскресенье",
"Morning": "Утро",
"Daytime": "День",
"Evening": "Вечер",
"Night": "Ночь",
"Languages": "Языки Программирования",
"Editors": "Редакторы",
"operating system": "Операционная Система",
"Projects": "Проекты",
"Timezone": "Часовой Пояс",
"Contributions in the year": "%s вкладов в %s году",
"Used in GitHub's Storage": "%s использовано в хранилище GitHub",
"Opted to Hire": "В поиске работы",
"Not Opted to Hire": "Не в поиске работы",
"Profile Views": "Просмотров профиля",
"From Hello World I have written": "С Hello World мною было написано",
"I am Most Productive on": "Мой самый продуктивный день %s",
"This Week I Spend My Time On": "На этой неделе мое время было потрачено на",
"I Mostly Code in": "В основном программирую на %s",
"Timeline": "График",
"No Activity Tracked This Week": "На этой неделе активность не отслеживалась",
"My GitHub Data": "Мои данные GitHub",
"Lines of code": "строчек кода",
"public repository": "%d Публичный репозиторий",
"public repositories": "%d Публичных репозиториев",
"private repository": "%d Приватный репозиторий",
"private repositories": "%d Приватных репозиториев",
"I am an Early": "Я утренняя 🐤",
"I am a Night": "Я ночная 🦉"
},
"de": {
"Monday": "Montag",
"Tuesday": "Dienstag",
"Wednesday": "Mittwoch",
"Thursday": "Donnerstag",
"Friday": "Freitag",
"Saturday": "Samstag",
"Sunday": "Sonntag",
"Morning": "Morgens",
"Daytime": "Mittags",
"Evening": "Abends",
"Night": "Nachts",
"Languages": "Programmiersprachen",
"Editors": "Editoren",
"operating system": "Betriebssystem",
"Projects": "Projekte",
"Timezone": "Zeitzone",
"Contributions in the year": "%s Beiträge im Jahr %s",
"Used in GitHub's Storage": "%s im GitHub's Speicher verwendet",
"Opted to Hire": "Sucht nach Auftragsarbeiten",
"Not Opted to Hire": "Sucht nicht nach Auftragsarbeiten",
"Profile Views": "Profilansichten",
"From Hello World I have written": "Seit Hallo Welt habe ich geschrieben",
"I am Most Productive on": "Ich bin am %s am produktivsten",
"This Week I Spend My Time On": "Diese Woche habe ich meine Zeit damit verbracht",
"I Mostly Code in": "Ich code am meisten in %s",
"Timeline": "Zeitleiste",
"No Activity Tracked This Week": "Diese Woche wurde keine Aktivität gespeichert",
"My GitHub Data": "Meine GitHub-Daten",
"Lines of code": "Codezeilen",
"public repository": "%d öffentliches Repository",
"public repositories": "%d öffentliche Repositories",
"private repository": "%d privates Repository",
"private repositories": "%d private Repositories",
"I am an Early": "Ich bin ein Frühaufsteher 🐤",
"I am a Night": "Ich bin eine Nachteule 🦉"
},
"id": {
"Monday": "Senin",
"Tuesday": "Selasa",
"Wednesday": "Rabu",
"Thursday": "Kamis",
"Friday": "Jumat",
"Saturday": "Sabtu",
"Sunday": "Minggu",
"Morning": "Pagi",
"Daytime": "Siang",
"Evening": "Petang",
"Night": "Malam",
"Languages": "Bahasa",
"Editors": "Editor",
"operating system": "Sistem Operasi",
"Projects": "Proyek",
"Timezone": "Zona waktu",
"Contributions in the year": "%s Kontribusi pada %s",
"Used in GitHub's Storage": "%s Digunakan di GitHub Storage",
"Opted to Hire": "Sedang bisa dipekerjakan",
"Not Opted to Hire": "Tidak sedang bisa dipekerjakan",
"Profile Views": "Profil dilihat",
"From Hello World I have written": "Sejak Hello World aku telah menulis",
"I am Most Productive on": "Paling produktif saat %s",
"This Week I Spend My Time On": "Minggu ini menghabiskan waktu di",
"I Mostly Code in": "Kebanyakan menulis dalam bahasa %s",
"Timeline": "Lini masa",
"No Activity Tracked This Week": "Tidak ada aktivitas dilacak minggu Ini",
"My GitHub Data": "Dataku di GitHub",
"Lines of code": "baris kode",
"public repository": "%d Repositori publik",
"public repositories": "%d Repositori publik",
"private repository": "%d Repositori pribadi",
"private repositories": "%d Repositori pribadi",
"I am an Early": "Aku orangnya diurnal 🐤",
"I am a Night": "Aku orangnya nokturnal 🦉"
},
"ca": {
"Monday": "Dilluns",
"Tuesday": "Dimarts",
"Wednesday": "Dimecres",
"Thursday": "Dijous",
"Friday": "Divendres",
"Saturday": "Dissabte",
"Sunday": "Diumenge",
"Morning": "Matí",
"Daytime": "Migdia",
"Evening": "Tarda",
"Night": "Nit",
"Languages": "Llenguatges",
"Editors": "Editors",
"operating system": "Sistemes Operatius",
"Projects": "Projectes",
"Timezone": "Zona Horaria",
"Contributions in the year": "%s Contribucions durant l'any %s",
"Used in GitHub's Storage": "%s d'emmagatzematge de GitHub utilitzat",
"Opted to Hire": "Obert a contractacions",
"Not Opted to Hire": "No obert a contractacions",
"Profile Views": "Visites al perfil",
"From Hello World I have written": "Des del 'Hello World' he escrit",
"I am Most Productive on": "Sóc més productiu els %s",
"This Week I Spend My Time On": "Aquesta setmana em vaig dedicar a",
"I Mostly Code in": "Majoritàriament programo en %s",
"Timeline": "Cronologia",
"No Activity Tracked This Week": "Sense activitat registrada aquesta setmana",
"My GitHub Data": "Les meves dades de GitHub",
"Lines of code": "Línies de codi",
"public repository": "%d Repositori públic",
"public repositories": "%d Repositoris públics",
"private repository": "%d Repositori privats",
"private repositories": "%d Repositoris privats",
"I am an Early": "Sóc diürn 🐤",
"I am a Night": "Sóc nocturn 🦉"
},
"vn": {
"Monday": "Thứ Hai",
"Tuesday": "Thứ Ba",
"Wednesday": "Thứ Tư",
"Thursday": "Thứ Năm",
"Friday": "Thứ Sáu",
"Saturday": "Thứ Bảy",
"Sunday": "Chủ Nhật",
"Morning": "Buổi Sáng",
"Daytime": "Ban Ngày",
"Evening": "Ban Đêm",
"Night": "Buổi Tối",
"Languages": "Ngôn Ngữ",
"Editors": "Trình Soạn Thảo",
"operating system": "Hệ Điều Hành",
"Projects": "Dự Án",
"Timezone": "Múi giờ",
"Contributions in the year": "%s Đóng góp trong năm %s",
"Used in GitHub's Storage": "%s sử dụng bộ nhớ GitHub",
"Opted to Hire": "Đang tìm việc",
"Not Opted to Hire": "Không có nhu cầu tìm việc",
"Profile Views": "Lượt xem trang cá nhân",
"From Hello World I have written": "Số dòng code kể từ Hello World",
"I am Most Productive on": "Tôi thường làm việc vào %s",
"This Week I Spend My Time On": "Tuần này tôi dành phần lớn thời gian cho",
"I Mostly Code in": "Tôi code chủ yếu bằng %s",
"Timeline": "Timeline",
"No Activity Tracked This Week": "Không có hoạt động nào tuần này",
"My GitHub Data": "Dữ liệu GitHub của tôi",
"Lines of code": "dòng code",
"public repository": "%d dự án công khai",
"public repositories": "%d dự án công khai",
"private repository": "%d dự án riêng tư",
"private repositories": "%d dự án riêng tư",
"I am an Early": "Tôi không phải cú đêm 🐤",
"I am a Night": "Tôi là cú đêm 🦉"
}
}