mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2025-09-01 08:17:16 +02:00
First 6 files (French translation)
This commit is contained in:
parent
124cf8ce10
commit
9031b232ac
6 changed files with 274 additions and 25 deletions
|
@ -4,20 +4,22 @@ exports.level = {
|
|||
"startTree": "{\"branches\":{\"master\":{\"target\":\"C7\",\"id\":\"master\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C2\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C4\",\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}",
|
||||
"name": {
|
||||
"en_US": "Multiple parents",
|
||||
"zh_CN": "多个父提交记录",//MARCO
|
||||
"zh_CN": "多个父提交记录",
|
||||
'fr_FR': 'Parents multiples',
|
||||
"de_DE": "Mehrere Vorgänger",
|
||||
"es_AR": "Múltiples padres",
|
||||
"zh_TW": "多個 parent commit"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Use `git branch bugWork` with a target commit to create the missing reference.",
|
||||
"de_DE": "Nutze `git branch bugWork` mit einem Ziel-Commit um die fehlende Referenz zu erstellen.",//MARCO
|
||||
"de_DE": "Nutze `git branch bugWork` mit einem Ziel-Commit um die fehlende Referenz zu erstellen.",
|
||||
'fr_FR': 'Utilisez "git branch bugWork" avec un commit pour créer une référence manquante',
|
||||
"zh_CN": "使用`git branch bugWork`加上一个目标提交记录来创建消失的引用。",
|
||||
"es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante",
|
||||
"zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {//MARCO
|
||||
"en_US": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
|
@ -191,6 +193,93 @@ exports.level = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"fr_FR": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Determine les Parents",
|
||||
"",
|
||||
"Comme le symbole `~`, le symbole `^` accepte un numéro après lui.",
|
||||
"",
|
||||
"Au lieu d'entrer le nombre de génération à reculer (ce que `~` fait), le symbole `^` détermine quel parent fait le commit. Attention, un merge commit à deux parents ce qui peux porter à confusion.",
|
||||
"",
|
||||
"Normalement Git suit le \"premier\" parent pour un commit/merge, mais avec un numéro suivi de `^` le comportement par défault est modifié.",
|
||||
"",
|
||||
"Assez de bla bla, passons à l\'action",
|
||||
""
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Nous avons un commit/merge. Si nous faisons checkout `master^` sans le symbole, on obtient le premier parent suivant ce commit. ",
|
||||
"",
|
||||
"(*Dans notre vue, Le premier parent se situe juste au dessus du merge.*)"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Facile -- C\est ce que nous faisons toujours.."
|
||||
],
|
||||
"command": "git checkout master^",
|
||||
"beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Nous allons spécifier le deuxième parent à la place."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Vous voyez? Nous suivons le second parent."
|
||||
],
|
||||
"command": "git checkout master^2",
|
||||
"beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Le symbole `^` et `~` Permettes de se déplacer de façon très efficace:"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Boom, vitesse du tonnerre!"
|
||||
],
|
||||
"command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",
|
||||
"beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Encore plus fou, c'est symboles peuvre être chainés (Inception style):"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Le même résultat, mais en une seule commande."
|
||||
],
|
||||
"command": "git checkout HEAD~^2~2",
|
||||
"beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Essayez-le",
|
||||
"",
|
||||
"Pour réussir le niveau, créé une nouvelle branche à la bonne destination",
|
||||
"",
|
||||
"Évidement c'est plus rapide de spécifier le commit (C6 par exemple), mais faites le avec les symboles de déplacement."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"zh_CN": {
|
||||
"childViews": [
|
||||
{
|
||||
|
|
|
@ -99,13 +99,15 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
displayName: {
|
||||
'en_US': 'Push & Pull -- Git Remotes!',
|
||||
'de_DE': 'Push & Pull -- entfernte Repositorys',
|
||||
'es_AR': 'Push & Pull -- Git Remotes!',//MARCO
|
||||
'fr_FR': 'Push & Pull -- Git Remotes!',
|
||||
'es_AR': 'Push & Pull -- Git Remotes!',
|
||||
'zh_CN': 'Push & Pull -- Git Remotes!',
|
||||
'zh_TW': 'Push & Pull -- Git Remotes!'
|
||||
},
|
||||
about: {
|
||||
'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social',
|
||||
'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente',//MARCO
|
||||
'fr_FR': 'C\'est le temps de partager vos 1 et vos 0 les envants, le code vient de devenir social.',
|
||||
'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente',
|
||||
'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!',
|
||||
'zh_CN': '是时候分享你的编码了',
|
||||
'zh_TW': '是時候分享你的程式碼了'
|
||||
|
@ -115,13 +117,15 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
tab: 'remote',
|
||||
displayName: {
|
||||
'en_US': 'To Origin And Beyond -- Advanced Git Remotes!',
|
||||
'de_DE': 'Bis zum origin und noch weiter',//MARCO
|
||||
'de_DE': 'Bis zum origin und noch weiter',
|
||||
'fr_FR': 'Vers l\'Orifin et plus loins encore -- Git Remotes avancé',
|
||||
'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!',
|
||||
'zh_CN': '关于origin 和 其它仓库 -- Git Gemotes 高级命令',
|
||||
'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令'
|
||||
},
|
||||
about: {
|
||||
'en_US': 'And you thought being a benevolent dictator would be fun...',//MARCO
|
||||
'en_US': 'And you thought being a benevolent dictator would be fun...',
|
||||
'fr_FR': 'Et vous pensié que de devenir un dictateur serais amusant...',
|
||||
'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...',
|
||||
'zh_CN': '做一名仁慈的独裁者会很有趣..',
|
||||
'zh_TW': '而且你會覺得做一個仁慈的獨裁者會很有趣...',
|
||||
|
@ -132,10 +136,10 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
displayName: {
|
||||
'en_US': 'Moving Work Around',
|
||||
'de_DE': 'Code Umherschieben',
|
||||
'fr_FR': 'Déplacer le travail',
|
||||
'es_AR': 'Moviendo el trabajo por ahí',
|
||||
// INTL out of sync :(
|
||||
'ja': 'Rebaseをモノにする',
|
||||
'fr_FR': 'Maîtrise Rebase, Luke!',//MARCO
|
||||
'zh_CN': '精通Rebase!',
|
||||
'zh_TW': '精通 rebase!',
|
||||
'ko': '리베이스 완전정복!'
|
||||
|
@ -143,10 +147,10 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
about: {
|
||||
'en_US': 'Get comfortable with modifying the source tree',
|
||||
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
|
||||
'fr_FR': 'Soyez alaise de modifier l\'arbre Git',
|
||||
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
|
||||
// INTL out of sync :(
|
||||
'ja': '話題のrebaseってどんなものだろう?って人にオススメ',
|
||||
'fr_FR': 'Qu\'est-ce que ce rebase dont tout le monde parle ? Découvrez-le !',//MARCO
|
||||
'ko': '그 좋다고들 말하는 rebase에 대해 알아봅시다!',
|
||||
'zh_CN': '大家都在说的rebase究竟是神马?看看吧!',
|
||||
'zh_TW': '大家都在說的 rebase 到底是什麼阿?來看看吧!'
|
||||
|
|
|
@ -4,18 +4,20 @@ exports.level = {
|
|||
"startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
|
||||
"name": {
|
||||
"en_US": "Git Describe",
|
||||
"de_DE": "Git Describe",//MARCO
|
||||
"fr_FR": "Git Describe",
|
||||
"de_DE": "Git Describe",
|
||||
"es_AR": "Git Describe",
|
||||
"zh_TW": "git describe"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Just commit once on bugFix when you're ready to move on",//MARCO
|
||||
"en_US": "Just commit once on bugFix when you're ready to move on",
|
||||
"en_US": "Faites un commit su bugFix quand vous êtes pret",
|
||||
"de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist",
|
||||
"es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
|
||||
"zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {//MARCO
|
||||
"en_US": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
|
@ -78,6 +80,69 @@ exports.level = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"fr_FR": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Git Describe",
|
||||
"",
|
||||
"Parce ce que les tags sont de très bonne références dans le code, git à une commande pour *describe* la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe`!",
|
||||
"",
|
||||
"Git describe peux vous aider lorsque vous vous êtes beaucoup déplacé; peut être pratique après un git bisect ou lorsque vous revené de vacance après 3 semaines."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Git describe s'écrit comme suit:",
|
||||
"",
|
||||
"`git describe <ref>`",
|
||||
"",
|
||||
"Ou `<ref>` est un numéro de commit. Si vous ne specifiez pas de ref, HEAD est pris par défault.",
|
||||
"",
|
||||
"Le résultat de la commande est:",
|
||||
"",
|
||||
"`<tag>_<numCommits>_g<hash>`",
|
||||
"",
|
||||
"Ou `tag` est le tag le plus proche, `numCommits` le nombre de commit avec le tag, et `<hash>` le hash du commit décris."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Un petit exemple. Prennons cet arbre:"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"La commande`git describe master` donne le résultat:",
|
||||
"",
|
||||
"`v1_2_gC2`",
|
||||
"",
|
||||
"et `git describe side` donne:",
|
||||
"",
|
||||
"`v2_1_gC4`"
|
||||
],
|
||||
"command": "git tag v2 C3",
|
||||
"beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Ceci résume bien git describe! Amusé vous pour bien comprendre describe.",
|
||||
"",
|
||||
"Lorsque vous serez confiant, faite simplement un commit pour finir le niveau. Un petit niveau bonus :P"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"zh_TW": {
|
||||
"childViews": [
|
||||
{
|
||||
|
|
|
@ -16,7 +16,8 @@ exports.level = {
|
|||
"name": {
|
||||
"ko": "딱 한개의 커밋만 가져오기",
|
||||
"en_US": "Grabbing Just 1 Commit",
|
||||
"de_DE": "Einen Commit pflücken",//MARCO
|
||||
"fr_FR": "Choisir seulement 1 commit",
|
||||
"de_DE": "Einen Commit pflücken",
|
||||
"es_AR": "Tomando un único commit",
|
||||
"ja": "Grabbing Just 1 Commit",
|
||||
"zh_CN": "只取一个提交",
|
||||
|
@ -24,7 +25,8 @@ exports.level = {
|
|||
},
|
||||
"hint": {
|
||||
"en_US": "Remember, interactive rebase or cherry-pick is your friend here",
|
||||
"de_DE": "Vergiss nicht: hier kommst du mit interaktivem Rebase oder Cherry-Picking weiter",//MARCO
|
||||
"de_DE": "Vergiss nicht: hier kommst du mit interaktivem Rebase oder Cherry-Picking weiter",
|
||||
"fr_FR": "Souvenez-vous, les rebases interractiv ou cherry-pick est votre amis ici.",
|
||||
"es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá",
|
||||
"ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです",
|
||||
"ko": "대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요",
|
||||
|
@ -32,7 +34,7 @@ exports.level = {
|
|||
"zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {//MARCO
|
||||
"en_US": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
|
@ -71,6 +73,45 @@ exports.level = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"fr_FR": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Les commits stacké localement",
|
||||
"",
|
||||
"Voici une situation qui arrive souvent. J'ai un bug et pour trouver la source je rajoute des commande de debug à travers le code.",
|
||||
"",
|
||||
"Tous ces debug se retrouve dans une branche, je trouve le bug et le répart, comme toujours!",
|
||||
"",
|
||||
"Le seul problème c'est que je ne peux pas faire de merge ou rebase, car tous ces commits de debug seront dans le master. Il doit y avoir une meilleur façon."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Nous avons besoin de dire à Git quelle commit choisir. Simplement comme le niveau précédent -- nous pouvons utiliser les mêmes commandes:",
|
||||
"",
|
||||
"* `git rebase -i`",
|
||||
"* `git cherry-pick`",
|
||||
"",
|
||||
"Pour réussir ce niveau."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"À vous de choisir quelle commande utiliser, mais pour réussir ce niveau, assurez vous que `master` recois le même commit que `bugFix`."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"es_AR": {
|
||||
"childViews": [
|
||||
{
|
||||
|
|
|
@ -19,8 +19,9 @@ exports.level = {
|
|||
"startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\"},\"newImage\":{\"target\":\"C2\",\"id\":\"newImage\"},\"caption\":{\"target\":\"C3\",\"id\":\"caption\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"}},\"HEAD\":{\"target\":\"caption\",\"id\":\"HEAD\"}}",
|
||||
"name": {
|
||||
"ko": "커밋들 갖고 놀기",
|
||||
"en_US": "Juggling Commits",//MARCO
|
||||
"en_US": "Juggling Commits",
|
||||
"de_DE": "Jonglieren mit Commits",
|
||||
"fr_FR": "Jongler avec les Commits",
|
||||
"es_AR": "Haciendo malabares con los commits",
|
||||
"ja": "Juggling Commits",
|
||||
"zh_CN": "提交变换戏法",
|
||||
|
@ -28,7 +29,8 @@ exports.level = {
|
|||
},
|
||||
"hint": {
|
||||
"en_US": "The first command is git rebase -i HEAD~2",
|
||||
"de_DE": "Der erste Befehl ist git rebase -i HEAD~2",//MARCO
|
||||
"de_DE": "Der erste Befehl ist git rebase -i HEAD~2",
|
||||
"de_DE": "La première commande est git rebase -i HEAD~2",
|
||||
"es_AR": "El primer comando es git rebase -i HEAD~2",
|
||||
"ja": "最初に打つコマンドはgit rebase -i HEAD~2",
|
||||
"ko": "첫번째 명령은 git rebase -i HEAD~2 입니다",
|
||||
|
@ -36,7 +38,7 @@ exports.level = {
|
|||
"zh_TW": "第一個命令是 'git rebase -i HEAD~2'"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {//MARCO
|
||||
"en_US": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
|
@ -77,6 +79,47 @@ exports.level = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"fr_FR": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Jongler avec les Commits",
|
||||
"",
|
||||
"Voici une autre situation commune. Vous avez certain changement (`newImage`) et un autre groupe de changement (`caption`) qui sont relié, ils sont donc empillé un sur l'autre dans votre répertoire Git(aka un après l'autre).",
|
||||
"",
|
||||
"Là ou ca se complique c'est lorsque vous devez faire modification dans un commit antérieure. Dans ce cas, les configuration de `newImage` devrons changer un peu, même si ce commit est loin dans notre histoire!!"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Nous allons régler le problème en fesant ceci:",
|
||||
"",
|
||||
"* Nous allons réaligné les commits pour que celui que nous voulions soit sur le dessus `git rebase -i`",
|
||||
"* Nous allons faire `commit --amend` pour faire les modifications",
|
||||
"* Nous allons réaligner les commits dans l'ordre original `git rebase -i`",
|
||||
"* Finalement, nous allons déplacer le HEAD de master vers la nouvelle tête de l'arbre (avec la méthode de votre choix)",
|
||||
"",
|
||||
"Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez vous sur cette technique."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Pour terminer, Faites attentions au but -- Du au fait que nous déplacons les commmits 2 fois, ils se retrouvent les deux avec une apostrophe. une deuxième apostrophe est ajouté sur le commit que nous modifions, ce qui nous donnes l'arbre finale ",
|
||||
"",
|
||||
"Ceci étant dit, Je peux comparer le résultat avec la stuctures et les différentes apostophes. Tant que votre arbre master a la même structure et apostrophe le niveau sera considéré réussi."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"es_AR": {
|
||||
"childViews": [
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue