programminghistorian / ph-submissions

The repository and website hosting the peer review process for new Programming Historian lessons
http://programminghistorian.github.io/ph-submissions
138 stars 112 forks source link

Revisão da tradução da lição Extrair Páginas Ilustradas de Bibliotecas Digitais com Python #447

Closed ericbrasiln closed 1 year ago

ericbrasiln commented 2 years ago

O Programming Historian em português recebeu a proposta de tradução da lição 'Extrair Páginas Ilustradas de Bibliotecas Digitais com Python' por João Pereira.

A lição traduzida está no link a seguir: https://github.com/programminghistorian/ph-submissions/blob/gh-pages/pt/esbocos/traducoes/extrair-paginas-ilustradas-com-python.md

Já a lição original está em: https://programminghistorian.org/en/lessons/extracting-illustrated-pages

Agradeço pela contribuição feita por @Jocardope

Eu serei o editor da tradução. A revisão ficará a cargo do @felipelmc

Gostaria de solicitar a ajuda de @DanielAlvesLABDH ou @joanacvp para encontrar um revisor em Portugal.

Peço para avaliarem a tradução para o português, assim como se há necessidade de adequação de dados ou algum conteúdo. Por favor, deixem as suas sugestões neste ticket. Para cada modificação a ser sugerida, por favor, peço para indicar as linha de maneira que facilite os ajustes da João. O ideal é realizar as modificações após as sugestões dos dois revisores.

Todos os membros da comunidade estão convidados a oferecer feedback construtivo que deve ser publicado neste canal, mas é solicitado que leiam primeiro as diretrizes para revisores (/directrizes-revisor) e sigam a nossa política anti-assédio (abaixo). Pedimos que todas as revisões parem após o envio da segunda revisão formal para que o/a autor/tradutor(a) possa concentrar-se no ajuste da lição. Eu farei um anúncio neste tópico quando isso ocorrer.

Vou me esforçar para manter a conversa aberta aqui no GitHub, mas se alguém sentir a necessidade de discutir algo em particular, pode entrar em contato comigo, ou pode sempre recorrer para o nosso mediador independente se achar necessário.

Se houver alguma preocupação do tradutor, ele pode entrar em contato com o mediador do PH em português (Luís Ferla).

felipelmc commented 2 years ago

Caro João (@Jocardope ), em primeiro lugar gostaria de agradecer pelo seu interesse em contribuir para o Programming Historian em português! Também aproveito a oportunidade para parabenizar pelo trabalho: é uma tradução excelente. Seguem os pontos que sugiro revisão, alguns tentando aproximar a linguagem do leitor brasileiro:

Por favor, me avise caso haja algum problema ou dúvida. Fico à disposição.

Jocardope commented 2 years ago

Boa noite,

Cometi o erro de fechar a revisão enquanto tentava responder às correções do @felipelmc. Espero que a minha falha não tenha causado problemas. Segue a resposta, ponto por ponto:

  • [x] Linha 38: a frase "[...] apenas se fez o download das páginas com imagens [...]" semânticamente sugere ao leitor (brasileiro, ao menos) que o download é uma tarefa simples. No entanto, me parece que o autor da lição original quis dizer algo como "[...] se fez o download apenas das páginas com imagens [...]", isto é, especificando quais páginas foram baixadas;

Será revista.

  • [x] Linha 48: remover a vírgula entre o número de figuras e e assim por diante;

Será revista.

  • [x] Linha 52: substituir nenhumas imagens por nenhuma imagem. Esse plural não é usual no português brasileiro;

Será revista. O início da frase em que o termo se insere lê-se: O HT e o IA permitem que a questão imagens/nenhumas imagens. Também devo substituir imagens por imagem, antes de nenhuma imagem?

  • [x] Linha 52: sugiro adicionar a tradução de OCR na forma: "optical character recognition, ou reconhecimento ótico de caracteres em português". Assim evitamos dois parênteses em sequência;

Será revista.

  • [x] Linha 59: substituir No final da lição, o leitor poderá: por Ao final da lição, o leitor será capaz de:

Será revista.

  • [x] Linha 83: sugiro, ao invés de "faça o cd", explicar brevemente com "altere seu diretório de trabalho com o comando cd [...]";

Será revista. Isto não implicará a alteração do resto desta secção? Com esta revisão, passa-se a ler: "altere seu diretório de trabalho com o comando cd para a pasta onde se encontra o Python". Não é melhor modificar a frase para "altere seu diretório de trabalho para a pasta onde se encontra o Python com o comando cd"?

  • [x] Linha 92: ao invés de "notebooks do Jupyter", simplesmente "Jupyter notebooks" (recomendado), sem tradução, ou "notebooks Jupyter";

Será revista.

  • [x] Linha 120: substituir em cima por acima;

Em português europeu, tendemos a usar 'em cima' quando algo está sobre outro algo por contacto (e.g. 'o computador está em cima da secretária') e 'acima' quando algo está sobre outro algo por escala (e.g. 'o teu cargo na empresa está acima do meu'). É assim em português do Brasil? Se assim for, seria mais correto manter. Caso não seja o caso, podemos rever.

  • [x] Linha 127: substituir a Miniconda por o Miniconda;

Será revista.

  • [x] Linha 127: substituir na seu shell por no seu shell;

Será revista.

  • [x] Linha 133: "do conda" ao invés de "da conda";

Será revista.

  • [x] Linha 133: ao invés de reverteremos, recorreremos;

Será revista.

  • [x] Linha 133: "pelo conda" ao invés de "pela conda";

Será revista.

  • [x] Linha 176: "o conda" ao invés de "a conda". Além disso, substituir solicita se quer por lhe pergunta se deseja;

Será revista.

  • [x] Linha 179: "o conda" ao invés de "a conda";

Será revista.

  • [x] Linha 209: "Jupyter Notebooks", sem tradução, ou "Notebooks Jupyter";

Será revista.

  • [x] Linha 211 e 213: No seu shell ao invés de Na sua shell;

Serão revistas.

  • [x] Linha 218: No seu shell ao invés de Na sua shell. Além disso, adicionar espaçamento entre para e ir;

Será revista.

  • [x] Linha 221: no shell ao invés de na shell (há duas ocorrências);

Será revista.

  • [x] Linha 245: retificar accesso;

Será revista.

  • [x] Linha 253: retificar inclui para incluí;

Será revista.

  • [x] Linha 257: "notebooks Jupyter" ou "Jupyter notebooks";

Será revista.

  • [x] Linha 290: além das oito listadas ao invés de que as oito listadas;

Será revista.

  • [x] Linha 298: tenham sido propostas ao invés de foram propostas;

Será revista.

  • [x] Linha 305: Retificar estra;

Será revista.

  • [x] Linha 334: Retificar tagg;

Será revista.

  • [x] Linha 370: a API ao invés de o API;

Será revista.

  • [x] Linha 374: uma query ao invés de um query;

Será revista.

  • [x] Linha 466: retificar para a RESTful API e uma URL;

Será revista. Em português europeu, 'URL' é masculino, mas podemos rever de qualquer das formas, se preferirem em feminino.

  • [x] Linha 468: retificar para duma API;

Será revista.

  • [x] Nos blocos de código ao longo da lição, sugiro traduzir os comentários em #.

Irei traduzir no fim-de-semana e, quando acabar, partilho para reverem.

Cumprimentos, João Domingues Pereira

DanielAlvesLABDH commented 2 years ago

Caros, muito obrigado pela tradução e primeira revisão. @Jocardope o melhor será aguardar pela segunda revisão para depois fazer tudo de uma vez. As correções serão feitas directamente no ficheiro que está no link do ticket. Se precisar de ajuda para isso o @ericbrasiln ou eu podemos ajudar.

Jocardope commented 2 years ago

Boa noite,

Agradeço as indicações, @DanielAlvesLABDH. Ficarei à espera da segunda revisão para aplicar as alterações às duas traduções duma só vez.

Cumprimentos, João Domingues Pereira

felipelmc commented 2 years ago

@Jocardope, a respeito das suas dúvidas:

  1. Não será necessário substituir imagens;
  2. De fato, "altere seu diretório de trabalho para a pasta onde se encontra o Python com o comando cd" ficará melhor;
  3. No caso do Brasil, usamos o acima mais usualmente nesse caso. Mas vejo que no português de Portugal essa é uma questão gramatical mais bem definida, e no português brasileiro não seria incorreto dizer em cima de todo modo. Sugiro que mantenha a forma original;
  4. Quando vi, pensei que era somente um erro de tradução. Se no português europeu o URL é correto, não vejo problema em manter.

Cordialmente, Felipe Lamarca

felipelmc commented 2 years ago

@Jocardope só para constar meu erro: estava trabalhando numa tradução nesse momento e me dei conta de que, de fato, URL é uma palavra masculina, inclusive no português brasileiro. Me enganei!

Abraços! Felipe Lamarca

Jocardope commented 2 years ago

Boa tarde,

Como prometido, partilho a tradução dos blocos de código para revisão. Organizei este texto por secções numeradas que contém o original e a minha tradução, com a indicação das linhas entre parêntesis. Fico à espera da vossa apreciação, @ericbrasiln e @felipelmc. Como não venho da área de Informática, mas sim da de História, agradecia em particular que me corrijam caso tenha traduzido incorretamente certos termos técnicos.

N.º 1 (Linhas 232-242) - No original:

# Import the HT Data API wrapper
from hathitrust_api import DataAPI

# Replace placeholder strings with your HT credentials (leaving the quote marks)
ht_access_key = "YOUR_ACCESS_KEY_HERE"
ht_secret_key = "YOUR_SECRET_KEY_HERE"

# instantiate the Data API connection object
data_api = DataAPI(ht_access_key, ht_secret_key)

Tradução:

# Importe o wrapper do API dos dados do HT
from hathitrust_api import DataAPI

# Substitua as strings padrão com as suas credenciais do HT (deixando as aspas)
ht_access_key = "YOUR_ACCESS_KEY_HERE"
ht_secret_key = "YOUR_SECRET_KEY_HERE"

# instancie  o objeto de conexão do API dos dados
data_api = DataAPI(ht_access_key, ht_secret_key)

N.º 2 (Linhas 261-270) - No original:

# you can specify your collection metadata file here
metadata_path = "554050894-1535834127.json"

with open(metadata_path, "r") as fp:
    data = json.load(fp)

# a list of all unique ids in the collection
vol_ids = [item['htitem_id'] for item in data['gathers']]

Tradução:

# pode especificar o ficheiro de metadados da sua coleção aqui
metadata_path = "554050894-1535834127.json"

with open(metadata_path, "r") as fp:
    data = json.load(fp)

# uma lista de todas as ids exclusivas na coleção
vol_ids = [item['htitem_id'] for item in data['gathers']]

N.º 3 (Linhas 280-288) - No original:

  • htd:pfeat­ - the page feature key (if available):
    • CHAPTER_START
    • COPYRIGHT
    • FIRST_CONTENT_CHAPTER_START
    • FRONT_COVER
    • INDEX
    • REFERENCES
    • TABLE_OF_CONTENTS
    • TITLE

Tradução:

  • htd:pfeat­ - a chave de caracterização da página (se disponível):
    • CHAPTER_START
    • COPYRIGHT
    • FIRST_CONTENT_CHAPTER_START
    • FRONT_COVER
    • INDEX
    • REFERENCES
    • TABLE_OF_CONTENTS
    • TITLE

N.º 4 (Linhas 307-326) - No original:

# metadata from API in json format (different than HT collection metadata)
meta = json.loads(data_api.getmeta(item_id, json=True))

# sequence gets us each page of the scanned item in order, with any
# additional information that might be available for it
sequence = meta['htd:seqmap'][0]['htd:seq']

# list of pages with pictures (empty to start)
img_pages = []

# try/except block handles situation where no "pfeats" exist OR
# the sequence numbers are not numeric
for page in sequence:
    try:
        if 'IMAGE_ON_PAGE' in page['htd:pfeat']:
            img_pages.append(int(page['pseq']))
    except (KeyError, TypeError) as e:
        continue

Tradução:

# metadados do API no formato JSON (diferente da coleção de metadados do HT)
meta = json.loads(data_api.getmeta(item_id, json=True))

# a sequência dá-nos cada página do item digitalizado em ordem, com qualquer
# informação adicional que pode estar disponível para ela
sequence = meta['htd:seqmap'][0]['htd:seq']

# lista de páginas com imagens (vazio para a iniciação)
img_pages = []

# o bloco try/except lida com situações onde nenhuma "pfeats" existe OU
# os números da sequência não são numéricos
for page in sequence:
    try:
        if 'IMAGE_ON_PAGE' in page['htd:pfeat']:
            img_pages.append(int(page['pseq']))
    except (KeyError, TypeError) as e:
        continue

N.º 5 (Linhas 341-361) - No original:

for i, page in enumerate(img_pages):
    try:
    # simple status message
        print("[{}] Downloading page {} ({}/{})".format(item_id, page, i+1, total_pages))

        img = data_api.getpageimage(item_id, page)

        # N.B. loop only executes if out_dir is not None
        img_out = os.path.join(out_dir, str(page) + ".jpg")

        # write out the image
        with open(img_out, 'wb') as fp:
            fp.write(img)

        # to avoid exceeding the allowed API usage
        time.sleep(2)

    except Exception as e:
        print("[{}] Error downloading page {}: {}".format(item_id, page,e))

Tradução:

for i, page in enumerate(img_pages):
    try:
    # uma simples mensagem de estado
        print("[{}] Downloading page {} ({}/{})".format(item_id, page, i+1, total_pages))

        img = data_api.getpageimage(item_id, page)

        # N.B. o loop só executa se out_dir não é None
        img_out = os.path.join(out_dir, str(page) + ".jpg")

        # coloque a imagem
        with open(img_out, 'wb') as fp:
            fp.write(img)

        # para evitar exceder o uso de API permitido
        time.sleep(2)

    except Exception as e:
        print("[{}] Error downloading page {}: {}".format(item_id, page,e))

N.º 6 (Linhas 378-382) - No original:

# sample search (should yield two results)
query = "peter parley date:[1825 TO 1830] mediatype:texts"
vol_ids = [result['identifier'] for result in ia.search_items(query)]

Tradução:

# uma pesquisa de amostra (deve gerar dois resultados)
query = "peter parley date:[1825 TO 1830] mediatype:texts"
vol_ids = [result['identifier'] for result in ia.search_items(query)]

N.º 7 (Linhas 416-433) - No original:

# Use command-line client to see available metadata formats:
# `ia metadata formats VOLUME_ID`

# for this lesson, only the Abbyy file is needed
returned_files = list(ia.get_files(item_id, formats=["Abbyy GZ"]))

# make sure something got returned
if len(returned_files) > 0:
    abbyy_file = returned_files[0].name
else:
    print("[{}] Could not get Abbyy file".format(item_id))
    return None

# download the abbyy file to CWD
ia.download(item_id, formats=["Abbyy GZ"], ignore_existing=True, \
    destdir=os.getcwd(), no_directory=True)

Tradução:

# Use o cliente da linha de comandos para ver os formatos de metaddos disponíveis:
# `ia metadata formats VOLUME_ID`

# para esta lição, só o ficheiro Abbyy é necessário
returned_files = list(ia.get_files(item_id, formats=["Abbyy GZ"]))

# certifique-se de que algo é devolvido
if len(returned_files) > 0:
    abbyy_file = returned_files[0].name
else:
    print("[{}] Could not get Abbyy file".format(item_id))
    return None

# faça o download do ficheiro Abbyy para o CWD
ia.download(item_id, formats=["Abbyy GZ"], ignore_existing=True, \
    destdir=os.getcwd(), no_directory=True)

N.º 8 (Linhas 437-462) - No original:

# collect the pages with at least one picture block
img_pages = []

with gzip.open(abbyy_file) as fp:
    tree = ET.parse(fp)
    document = tree.getroot()
    for i, page in enumerate(document):
        for block in page:
            try:
                if block.attrib['blockType'] == 'Picture':
                    img_pages.append(i)
                    break
            except KeyError:
                continue

# 0 is not a valid page for making GET requests to IA, yet sometimes
# it's in the zipped Abbyy file
img_pages = [page for page in img_pages if page > 0]

# track for download progress report
total_pages = len(img_pages)

# OCR files are huge, so just delete once we have pagelist
os.remove(abbyy_file)

Tradução:

# colecione as páginas com pelo menos um bloco de imagem
img_pages = []

with gzip.open(abbyy_file) as fp:
    tree = ET.parse(fp)
    document = tree.getroot()
    for i, page in enumerate(document):
        for block in page:
            try:
                if block.attrib['blockType'] == 'Picture':
                    img_pages.append(i)
                    break
            except KeyError:
                continue

# 0 não é uma página válida para a realização de pedidos GET ao IA, mas às vezes
# está no ficheiro Abbyy comprimido
img_pages = [page for page in img_pages if page > 0]

# trilho para o relatório do progresso do download
total_pages = len(img_pages)

# os ficheiros de OCR são pesados, por isso elimine assim que tivermos a lista de páginas
os.remove(abbyy_file)

N.º 9 (Linhas 470-486) - No original:

# See: https://iiif.archivelab.org/iiif/documentation
urls = ["https://iiif.archivelab.org/iiif/{}${}/full/full/0/default.jpg".format(item_id, page)
    for page in img_pages]

# no direct page download through python library, construct GET request
for i, page, url in zip(range(1,total_pages), img_pages, urls):

    rsp = requests.get(url, allow_redirects=True)

    if rsp.status_code == 200:
        print("[{}] Downloading page {} ({}/{})".format(item_id, \
            page, i+1, total_pages))

        with open(os.path.join(out_dir, str(page) + ".jpg"), "wb") as fp:
            fp.write(rsp.content)

Tradução:

# Veja: https://iiif.archivelab.org/iiif/documentation
urls = ["https://iiif.archivelab.org/iiif/{}${}/full/full/0/default.jpg".format(item_id, page)
    for page in img_pages]

# nenhum download de página direto a partir das bibliotecas do Python, construa um pedido GET
for i, page, url in zip(range(1,total_pages), img_pages, urls):

    rsp = requests.get(url, allow_redirects=True)

    if rsp.status_code == 200:
        print("[{}] Downloading page {} ({}/{})".format(item_id, \
            page, i+1, total_pages))

        with open(os.path.join(out_dir, str(page) + ".jpg"), "wb") as fp:
            fp.write(rsp.content)

Cumprimentos, João Domingues Pereira

felipelmc commented 2 years ago

@Jocardope a tradução me parece correta! Somente na tradução do N.º 7 (Linhas 416-433) deve-se retificar a palavra metaddos para metadados.

Atenciosamente, Felipe Lamarca

ericbrasiln commented 2 years ago

Boa tarde, @Jocardope e @felipelmc Agradeço muito pela velocidade e cuidado com a revisão e as correções. Como ainda precisamos de um segundo revisor para a lição, sugiro que aguardemos um pouco para finalizar essa etapa, para evitar a repetição de tarefas.

Jocardope commented 2 years ago

Boa tarde,

Agradeço a correção, @felipelmc! Entendido @ericbrasiln, ficarei à espera da nomeação do segundo revisor. Até lá, caso necessário, podem comunicar comigo.

Cumprimentos, João Domingues Pereira

DanielAlvesLABDH commented 2 years ago

Caros @ericbrasiln, @Jocardope e @felipelmc, obrigado pela vossa paciência. Temos já uma segunda revisora para esta tradução. É a colega Salete Farias (@saletefarias) que gentilmente aceitou fazer a revisão do trabalho do João. Bem vinda ao Programming Historian Salete! Qualquer dúvida, pode contar com o apoio do Eric ou o meu. Obrigado pela disponibilidade uma vez mais. Abraço

ericbrasiln commented 2 years ago

Obrigado @DanielAlvesLABDH! Seja bem vinda @saletefarias e muito obrigado pela contribuição. Se precisar de qualquer suporte, pode me marcar em um comentário aqui no ticket. Abraços

saletefarias commented 2 years ago

Obrigada Prof. Daniel @DanielAlvesLABDH e @ericbrasiln , será um prazer colaborar neste processo de revisão. Irei aceder agora ao link com a tradução e o original para começar os trabalhos. Com certeza, em caso de dúvidas não hesitarei em contactá-los. Obrigada pelas boas vindas =) Abraços

saletefarias commented 2 years ago

Prezados @DanielAlvesLABDH , @ericbrasiln, @Jocardope e @felipelmc, Iniciei os trabalhos e achei interessante compartilhar a metodologia que adotarei. Optei por fazer uma leitura apenas do original inicialmente para não ser induzida pela tradução do João, e após isso refletir, organizar os pensamentos, realizar a tradução e daí verificar o match entre o que fiz e o do João. Estou aberta a sugestões. Até o/

ericbrasiln commented 2 years ago

Ok, @saletefarias Qualquer dúvida estou por aqui. Abraços

saletefarias commented 2 years ago

Caro João @Jocardope , a sua tradução está muito boa, Parabéns! @DanielAlvesLABDH e @ericbrasiln, tentei contemplar o leitor brasileiro sem deixar de lado o leitor português. Ressalto dois pontos inicialmente os quais apresento nas minhas sugestões, um deles é usar mesmo o termo Aprendizagem de Máquina (muito referido no Brasil) no lugar de Aprendizagem Automática, o outro ponto é a possível utilização da palavra arquivo no lugar de ficheiro. No Brasil, realmente não usa-se o termo ficheiro, penso que a maioria está acostumada com o termo arquivo. Não sei se para o leitor português é adequado, para o brasileiro sim, A seguir apresento os trechos que sugiro apreciação e revisão,

Revisão dos blocos de código acrescentados depois:

Com os melhores cumprimentos Salete Farias

DanielAlvesLABDH commented 2 years ago

Muito obrigado Salete @saletefarias! Excelente revisão. Em relação à palavra "arquivo", ficou decidido na equipe que usamos "ficheiro". Arquivo em Portugal tem outros sentidos. É tudo uma negociação... Por exemplo, no caso de "equipe" em Portugal é "equipa", mas optámos por "equipe".

saletefarias commented 2 years ago

Olá @DanielAlvesLABDH , eu imaginei mesmo que tivesse sido discutido em algum momento essa questão do uso do termo ficheiro. Na dúvida resolvi colocar na sugestão mesmo assim. Obrigada pelos esclarecimentos. Abraços!

ericbrasiln commented 2 years ago

Muito obrigado pela revisão cuidadosa, @saletefarias

@Jocardope qualquer dúvida sobre as revisões pode entrar em contato.

Jocardope commented 2 years ago

Bom dia,

Peço perdão por só responder agora, mas, infelizmente, tenho esteja muito ocupado nos últimos tempos. Espero conseguir analisar as correções da @saletefarias a partir de meados de maio.

Cumprimentos, João Pereira

Jocardope commented 2 years ago

Boa tarde,

Agradeço as correções, @saletefarias! Antes de apresentar a minha apreciação da revisão da @saletefarias, convém falar sobre os dois pontos inicialmente levantados. Relativamente à revisão de ficheiro como arquivo, trata-se duma escolha negociada, como já foi explicado noutro comentário. Relativamente à revisão de aprendizagem automática para aprendizado de máquina ou aprendizagem de máquina, a primeira das duas opções deve ser evitada, visto que a palavra 'aprendizado' é estranha em português europeu, mas a segunda não coloca grandes problemas, creio. Passando à revisão, segue a resposta, ponto por ponto:

  • [x] Linha 38: Substituir para um volume por de um volume. E mudar a parte final do parágrafo para: Depois do processo descrito nesta lição, apenas terá sido feito download, em JPEG, das páginas contendo imagens (31 no total).

Será revista de para um volume para de um volume. Foi anteriormente revista de Após o processo descrito nesta lição, apenas se fez o _download_ das páginas com imagens (31 no total) como JPEGs para uma pasta para Após o processo descrito nesta lição, se fez o _download_ apenas das páginas com imagens (31 no total) como JPEGs para uma pasta. Relativamente à revisão para Depois do processo descrito nesta lição, apenas terá sido feito download, em JPEG, das páginas contendo imagens (31 no total), não me parece correta, pois a ação do texto original está no pretérito, ou seja, o autor procura afirmar que obteve os resultados referidos após ter aplicado o processo que irá descrever ao longo das próximas linhas. Mais ainda, a revisão proposta elimina para uma pasta, informação que é essencial, e, como o @felipelmc indicou anteriormente, colocar 'apenas' antes de 'fazer download' sugere ao leitor que o download é uma tarefa simples, ao invés de indicar que só as páginas ilustradas foram retiradas.

  • [x] Linha 42: O termo revistapode ser substituído por revisada(No Brasil o termo revisada é mais usado, que é o contrário de Portugal, aqui é mesmo uma questão de se optar por um ou outro)

Será revista. Não percebi bem a diferença entre 'revista' e 'revisada' em português brasileiro, mas pelo que percebi, têm significados diferentes - corrijam-me se estiver enganado. Em português europeu, usamos mais 'revista', mas 'revisada' tem o mesmo sentido, por isso podemos usar 'revisada'.

  • [x] Linha 46: Sugiro modificar a última frase do parágrafo por: A exemplo disso, recentemente, foram concluídos ou financiados projetos que exploram modos de identificação de notas de rodapé e anotações de margens da página.

Relativamente a esta revisão, parece-me preferível manter a minha tradução, mas se o resto da equipe concordar, podemos adotar esta revisão.

  • [x] Linha 48: Sugiro substituir esclarecerpor responder a. Remover vírgula entre o número de figurase e assim por diante

Será revista.

  • [x] Linha 50: Substituir automáticapor de máquina

Será revista.

  • [x] Linha 52: substituirimagens /nenhumas imagens por com imagens/sem imagens. sugiro colocar a tradução de OCR em português primeiro e logo a seguir em inglês, da seguinte forma: “software de reconhecimento ótico de caracteres ou optical character recognition, em inglês". Substituir formatos de ficheiro por formatos de arquivo. No Brasil não usamos o termo ficheiro.

Será revista de imagens/nenhumas imagens para com imagens/sem imagens. Relativamente à colocação da tradução de OCR em português primeiro, discordo. Como usamos OCR como sigla ao longo do texto, faz mais sentido começar por colocar o nome em inglês, da seguinte forma: _optical character recognition_ (OCR), ou reconhecimento ótico de caracteres, em português. O que acha? Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 61: Sugiro a tradução: Configurar a versão "mínima" da distribuição Anaconda do Python (Miniconda) e criar um ambiente

Será revista.

  • [x] Linha 63: Substituir acederpor acessar;

Será revista.

  • [x] Linha 63: Colocar o termo em português primeiro e depois em inglês da seguinte forma: interfaces de programação de aplicações ou *application programming interfaces* (APis)

Relativamente à colocação da tradução de API em português primeiro, discordo pelas mesmas razões levantadas face à de OCR. Proponho a seguinte revisão: _application programming interfaces_ (APIs), ou interfaces de programação de aplicações, em português. O que acha?

  • [x] Linha 65: Substituir programaticamentepor de forma automatizada;

Será revista.

  • [x] Linha 72: Substituir será suportado por terá suporte

Será revista.

  • [x] Linha 81: Sugiro substituir providenciadaspor fornecidas

Será revista.

  • [x] Linha 83: Substituir "faça o cd", por execute o comando cd para alterar seu diretório de trabalho para a pasta em que se encontra instalado o Python e ..

Foi anteriormente revista de faça o cd para a pasta onde se encontra o Python para altere seu diretório de trabalho para a pasta onde se encontra o Python com o comando cd.

  • [x] Linha 90: Substituir ficheirospor arquivos

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 92: Ao invés de "notebooks do Jupyter", usar "Jupyter notebooks" ou "notebooks Jupyter"

Será revista.

  • [x] Linha 92: Substituir ficheiropor arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 95: Ao invés de "notebooks do Jupyter", usar "Jupyter notebooks" ou "notebooks Jupyter"

Será revista.

  • [x] Linha 95: Substituir ficheirospor arquivos

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 117: Substituir ficheiropor arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 120: Substituir em cima por acima

Esta revisão foi anteriormente apontada pelo @felipelmc. Decidimos manter porque, em português europeu, tendemos a usar 'em cima' quando algo está sobre outro algo por contacto (e.g. 'o computador está em cima da secretária') e 'acima' quando algo está sobre outro algo por escala (e.g. 'o teu cargo na empresa está acima do meu'). O que acha?

  • [x] Linha 127: Substituir na seu shellpor no seu shell

Será revista.

  • [x] Linha 129: Anaconda tem uma folha de dicas ou cheat sheet

Será revista. Creio que neste caso basta apresentar o termo em português, ao invés de usar os termos em português e em inglês, ou só este último, como na minha tradução. O que acha? @DanielAlvesLABDH, 'folha de dicas' é aceitável em português europeu?

  • [x] Linha 133: No lugar de reverteremos, utilizar recorreremos

Será revista.

  • [x] Linha 133: Usar gerenciadorao invés de gestor

Será revista.

  • [x] Linha 133: Usar planejadasao invés de planeadas

Será revista.

  • [x] Linha 140: Usar lista os pacotes ao invés de verificar os pacotes

Será revista.

  • [x] Linha 164: Usar a conda ao invés de o conda. (já na última linha deste parágrafo)

Será revista.

  • [x] Linha 176: Substituir solicita se quer por pergunta se deseja

Será revista.

  • [x] Linha 209: Usar "Jupyter Notebooks" ou "Notebooks Jupyter"

Será revista.

  • [x] Linha 211: Usar no seu shell ao invés de na sua shell

Será revista.

  • [x] Linha 211: Usar arquivosno lugar de ficheiros

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 213: Usar no seu shell ao invés de na sua shell

Será revista.

  • [x] Linha 215: Usar arquivosno lugar de ficheiros

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 218: Usar no seu shell ao invés de na sua shell

Será revista.

  • [x] Linha 218: Usar para ir no lugar de parair

Será revista.

  • [x] Linha 221: no shell ao invés de na shell (acontece duas vezes)

Será revista.

  • [x] Linha 221: Sugiro colocar no lugar de em novos separadores, colocar em novas abasou em novas guias

Em português europeu, não usamos 'abas' ou 'guias' com esse sentido. Um leitor português não irá perceber de imediato o significado do termo. Um leitor brasileiro consegue compreender o significado de 'separador'? Se não, teremos que negociar a tradução de 'browser tab' com o @DanielAlvesLABDH.

  • [x] Linha 228: No lugar de O leitor precisa de efetuar um registro colocar O leitor precisa efetuar um registro (proponho tirar o “de”)

Será revista.

  • [x] Linha 245: No Brasil usa-se controleno lugar de controlo

Será revista.

  • [x] Linha 245: Sugiro usar em um arquivo no lugar de num ficheiro

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 253: corrigir inclui para incluí

Será revista.

  • [x] Linha 253: arquivos da lição no lugar de ficheiros da lição

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 253: arquivos da lição no lugar de ficheiros da lição

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 257: Usar "Jupyter Notebooks" ou "Notebooks Jupyter"

Será revista.

  • [x] Linha 290: acrescentar doantes de: que as oito listadas

Foi anteriormente revista de que as oito listadas para além das oito listadas.

  • [x] Linha 294: aprendizado de máquina no lugar de aprendizagem automática

Será revista de aprendizagem automática para aprendizagem de máquina.

  • [x] Linha 296: aprendizado de máquina no lugar de aprendizagem automática

Será revista de aprendizagem automática para aprendizagem de máquina.

  • [x] Linha 298: aprendizagem de máquina no lugar de aprendizagem automática

Será revista.

  • [x] Linha 298:tenham sido propostas primeiramente para detectar ao invés de foram propostas pela primeira vez detetando

Será revista de foram propostas para terem sido propostas. Relativamente à revisão de pela primeira vez detetando para primeiramente para detectar, não me parece correta, pois o que o texto original expressa é que a tag IMAGE_ON_PAGE foi provavelmente criada após se observar que alguns dos blocos presentes no output de OCR consistiam de imagens e não de textos, ou seja, a tag não foi proposta para detetar blocos de imagens, mas sim para classificar esses mesmos blocos, os quais já eram detetados. Mesmo assim, a minha tradução não está perfeita. Que tal substituir foram propostas pela primeira vez detetando blocos de "Imagens" nos ficheiros de _output_ de OCR para tenham sido propostas pela primeira vez após a deteção de blocos de "Imagens" nos ficheiros de _output_ de OCR?

  • [x] Linha 298: arquivosno lugar de ficheiros

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 305: Corrigirestrapara esta;

Será revista.

  • [x] Linha 334: Coriigirtaggpara tag

Será revista.

  • [x] Linha 336: Substituir arquivono lugar de ficheiro

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 370: Substituir a API ao invés de o API

Será revista.

  • [x] Linha 374: Substituir uma query ao invés de um query

Será revista.

  • [x] Linha 386: Substituir arquivono lugar de ficheiro

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 388: Substituir ficheiro de XML por arquivo XML

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 397: Substituir ficheiro XML por arquivo XML

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 399: Substituir ficheiropor arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 401: Substituir certopor certa

Será revista.

  • [x] Linha 412: Substituir ficheiropor arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 414: Substituir ficheirospor arquivos

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 414: Substituir ficheiro Abbyy por arquivo Abby

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 414: Substituir se o ficheiro já existe por se o arquivo já existe

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 414: Substituir eliminamos o ficheiro Abbyy por eliminamos o arquivo Abbyy

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 435: Substituir ficheiropor arquivo (há várias ocorrências nesse parágrafo)

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 466: Substituir ficheiro JPEG por arquivo JPEG

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 466: Corrigirpara a RESTful API e uma URL

Será revista o RESTful API para a RESTful API. Foi anteriormente estabelecido nesta revisão que 'URL' é masculino, tanto em português brasileiro como em europeu.

  • [x] Linha 468: Corrigir para duma API

Será revista.

  • [x] Linha 468; Substituir ficheiros JP2, um formato de ficheiro largamente não suportado por arquivos JP2, um formato de arquivo largamente não suportado

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 493: Substituir aquando da sua para na ocasião da

Em português europeu, 'na ocasião', neste contexto, é um pouco estranho, mas se 'aquando' for problemático para um leitor brasileiro, podemos rever.

No que toca à revisão dos blocos de código, ponto a ponto:

  • [x] Linha 236: Sugiro retirar a palavra padrãoe deixar apenas: # Substitua as strings com as suas credenciais do HT (deixando as aspas)

Será revista.

  • [x] Linha 240: Mudar do API para da API

Será revista.

  • [x] Linha 262: Mudar pode especificar por especifique

Será revista.

  • [x] Linha 308: Mudar do API para da API

Será revista.

  • [x] Linha 417: Corrigir metaddospara metadados

Será revista.

  • [x] Linha 420: Mudar ficheiropara arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 430: Mudar ficheiropara arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 454: Mudar ficheiropara arquivo

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa.

  • [x] Linha 457: Sugiro que a tradução seja: acompanhe o progresso do download

Será revista.

  • [x] Linha 460: Sugiro mudar os ficheiros de OCR são pesados para os arquivos de OCR são grandes

Foi negociado o uso de ficheiro entre as equipes brasileira e portuguesa. Em português europeu, 'pesado' é preferível a 'grande', neste contexto. Se em português brasileiro a diferença entre os dois for importante, podemos rever.

  • [x] Linha 475: Sugiro substituir nenhumpor seme pedido GET por solicitação GET

Será revista.

Ficarei à espera das considerações finais sobre os pontos que levantei neste comentário para depois passar à correção da tradução.

Cumprimentos, João Pereira

saletefarias commented 2 years ago

Olá a todos. @Jocardope, obrigada pelas colocações. O @DanielAlvesLABDH comentou sobre o acordo em manter a palavra ficheiro. Quando fiz a revisão não sabia ainda. Com relação ao uso da palavra aquando, esta não existe não existe mais em pt-br., foi substituída por "quando". Isso é problemático ao leitor brasileiro. O que acham de usar quando ou no momento da instalação ? Quanto ao uso da palavra separador, conversei com vários colegas professores da área da computação e também com alguns alunos, e o uso da palavra separador realmente gerou estranheza, a tradução de tab em pt.br é aba mesmo. Não consigo achar/pensar em outra palavra. Espero que o @DanielAlvesLABDH encontre um ponto de convergência para este caso. Abraços a todos =)

ericbrasiln commented 2 years ago

Obriagdo, @Jocardope e @saletefarias

Até sexta vou olhar com calma os comentários e propor encaminhamentos.

ericbrasiln commented 2 years ago

Boa tarde, @Jocardope @saletefarias e @felipelmc Peço desculpas pela demora. Acabei de avaliar os comentários do @Jocardope sobre a revisão da Salete e gostaria de propor algumas sugestões para as questões levantadas:

@Jocardope por favor, após revisar, faça o commit da lição no repositório para podermos avançar. Quando terminar, farei uma leitura final antes de encaminhar para publicação.

Mais uma vez obrigado pela traduação e obriagado aos revisores pelo trabalho. Abraços

Jocardope commented 2 years ago

Boa tarde,

Agradeço as sugestões, @ericbrasiln e @saletefarias! @saletefarias, podemos rever de aquando da sua para na ocasião da e de separador para aba. Farei as devidas revisões, @ericbrasiln. De momento, estou a participar numa escavação arqueológica até 1 de julho e, por tal razão, não tenho a disponibilidade para aplicar a revisão. Espero ter tempo a partir dessa altura. Farei as alterações pouco depois de 1 de julho. Quando o tiver feito, aviso-o, @ericbrasiln.

Agradeço a todos, @ericbrasiln, @felipelmc e @saletefarias, pela ajuda e pelas revisões!

Cumprimentos, João Pereira

ericbrasiln commented 2 years ago

Bom dia, @Jocardope Você já realizou as últimas alterações? Precisa de mais algum prazo? Cordialmente, Eric

Jocardope commented 2 years ago

Boa tarde, @ericbrasiln

Estive ocupado desde a finalização da revisão, por isso não consegui realizar as últimas alterações. Eu irei dedicar a próxima semana para as concluir. Avisarei quando terminar a tarefa.

Cumprimentos, João Pereira

Jocardope commented 2 years ago

Boa tarde, @ericbrasiln

Não é preciso atribuir-me o estatuto de contribuidor no link da tradução para eu conseguir fazer alterações na mesma?

Cumprimentos, João Pereira

ericbrasiln commented 2 years ago

Boa tarde, @ericbrasiln

Não é preciso atribuir-me o estatuto de contribuidor no link da tradução para eu conseguir fazer alterações na mesma?

Cumprimentos, João Pereira

Bom dia @Jocardope Você já estava inserido como colaborador externo no repositório ph-submissions: image

Abraços

Jocardope commented 2 years ago

Boa tarde,

Dou como terminadas as alterações à tradução. Aviso que realizei mais algumas mudanças, poucas em número. A maior parte tratou-se de corrigir o género de termos como API e conda, melhorar a tradução de certos termos, como 'raw' de 'brutas' para 'nuas', na linha 401, etc.. As duas mais significativas ocorreram: na última frase da linha 38, onde modifiquei a tradução do verbo 'to download' de 'fazer o download' para 'baixar', pois o texto apresentava-se ligeiramente confuso e 'baixar' é usado noutras lições, para além de ser compreensível ao leitor brasileiro - mantive a tradução como 'fazer o download' no resto do texto; e nas linhas 280 a 288, onde voltei a colocar em inglês, visto tratar-se duma citação retirada dum documento cujo link é apresentado no parágrafo anterior.

Agradeço a todos, @ericbrasiln, @felipelmc e @saletefarias, pela colaboração! @ericbrasiln, agradecia uma resposta a confirmar a receção deste comentário.

Cumprimentos, João Pereira

ericbrasiln commented 2 years ago

Boa noite, @Jocardope Muito obrigado pelo trabalho. Ao longo da próxima semana vou realizar uma última revisão da tradução. Abs

ericbrasiln commented 2 years ago

Boa tarde, @Jocardope Fiz uma revisão final no texto e fiz o commit. Os detalhes podem ser vistos aqui. Única mudança de conteúdo mais explícita que fiz foi substituir "compreensão de lista" pelo original "list comprehension", já que é um termo específico do python que não tem muito sentido ser traduzido, como string, loop, etc.

Eu executei os notebooks. O notebook do Hathitrust funcionou perfeitamente. Entretanto o nb do Internet Archive gerou um erro no comando ia.configure(ia_email, ia_password). O resultado é um erro extenso, mas a mensagem final é essa:

InvalidURL: Invalid URL 'https:///services/xauthn/': No host supplied

Não sei se o problema é apenas comigo, pois não utilizei o Miniconda, rodando tudo diretamente no Python para testar (eu instalei todas as dependências, etc). Não sei se você, @felipelmc ou @saletefarias tiveram esse mesmo problema, ou se o código está rodando perfeitamente. Se estiver, vou dar prosseguimento enviando a lição para Daniel fazer os última passos para publicação.

Abraços

Jocardope commented 2 years ago

Bom dia,

Eu irei testar durante o fim de semana, mas presumo que seja um problema seu, @ericbrasiln. De qualquer das formas, tenciono confirmar que está tudo bem (ou não). Informo logo após o teste.

Cumprimentos, João Pereira

Jocardope commented 2 years ago

Boa tarde,

Já testei e não tive problemas, @ericbrasiln. Mas acho que é melhor esperar pela resposta do @felipelmc e da @saletefarias, para confirmar que não há problemas.

Cumprimentos, João Pereira

saletefarias commented 2 years ago

@ericbrasiln @Jocardope @felipelmc Eu resolvi testar hoje novamente os notebooks e não consegui, comecei por executar o notebook do Hathitrust, fiz o registo no site para obterchaves de API de dados HathiTrust. (HathiTrust Data API keys) mas nunca chegou no meu email (Verifiquei a caixa de spam). Dessa forma não consegui substituir as strings em: ht_access_key = "YOUR_ACCESS_KEY_HERE" ht_secret_key = "YOUR_SECRET_KEY_HERE" Quando fiz a revisão da tradução, tinha testado, mas ao que parece não salvei a lado nenhum as chaves. Peço desculpas. A propósito, estas chaves são sempre válidas?

DanielAlvesLABDH commented 1 year ago

Caros @ericbrasiln e @Jocardope as minhas desculpas pelo atraso nas respostas aqui. Tendo em conta que o João refere não ter tido problemas, mas a @saletefarias aponta para um erro ou pelo menos para uma falha num dos passos, o que sugerem? Terá sido uma falha momentânea e podemos avançar? @felipelmc você testou? Qual o resultado?

felipelmc commented 1 year ago

Caros, peço desculpas pelo atraso nas respostas. Fiz o teste, sim. O caso mencionado pela @saletefarias não me ocorreu e consegui executar o notebook hathitrust.ipynb perfeitamente. No entanto, passei pelo mesmo problema do @ericbrasiln - isto é, o mesmo erro ao executar o comando ia.configure(ia_email, ia_password) no notebook internetarchive.ipynb. Ainda assim, ao comentar essa linha de código o programa foi executado normalmente. Da mesma forma que o Eric, não executei através do Miniconda, o que pode explicar o problema. Se o @Jocardope testou e não obteve problemas, sugiro que sigamos em frente.

DanielAlvesLABDH commented 1 year ago

Obrigado @felipelmc! Eric @ericbrasiln o que acha, fazemos uma ligeira alteração no texto da lição para prevenir os possíveis erros ou pelo menos indicar essas alternativas? Seguimos em frente como está?

ericbrasiln commented 1 year ago

Boa noite, gente. Assim como @felipelmc, executei todo o ipynb excluíndo o comando ia.configure(ia_email, ia_password) e executou perfeitamente.

Lendo a documentação do internetarchive aqui encontrei a informação de que não há necessidade de estar estar loggado para realizar as operações descritas na lição.

Many of the operations on the Internet Archive database can be done freely without any authentication or authorization. However, some operations, such as the ones listed below, need keys:

  • IA-S3 keys, for uploading, searching, and modifying metadata
  • archive.org logged-in cookies, for downloading access-restricted content and viewing your task history

Atualmente, para conseguir realizar uploads, modificação de metadata, acessar conteúdo restrito e visualizar o hitóricos de tarefas é necessário utilizar credenciais específicas, mas isso não se enquadra no escopo da lição.

Infelizmente não encontrei informações específicas sobre o configure().

Minha sugestão é a inclusão de uma nota explicando que o comando ia.configure(ia_email, ia_password) atualmente é desnecessário e pode gerar erros. Portanto, sugere-se que ele não seja executado no ipynb.

Posteriormente, podemos inclusive abrir uma issue na lição original sugerindo uma atualização.

O que acha @Jocardope e @DanielAlvesLABDH

DanielAlvesLABDH commented 1 year ago

Olá @ericbrasiln eu concordo com essa solução. @Jocardope quando puder introduza essa pequena nota, algo como: "(Nota de tradução: o comando ia.configure(ia_email, ia_password) atualmente é desnecessário e pode gerar erros. Sugere-se que ele não seja executado no ipynb.)"

anisa-hawes commented 1 year ago

Hello all,

Please note that as part of a reorganisation of the /pt directory, this lesson's .md file has been moved to a new location within our Submissions Repository.

It is now found here: https://github.com/programminghistorian/ph-submissions/blob/gh-pages/pt/esbocos/traducoes/extrair-paginas-ilustradas-com-python.md

A consequence is that this lesson's preview link has changed. It is now: http://programminghistorian.github.io/ph-submissions/pt/esbocos/traducoes/extrair-paginas-ilustradas-com-python

Please let me know if you encounter any difficulties or have any questions. Very best, Anisa

Jocardope commented 1 year ago

Bom dia,

Parece-me bem, @DanielAlvesLABDH e @ericbrasiln. De momento estou ocupado, mas quando tiver tempo livre irei introduzir a nota de tradução.

Cumprimentos, João Pereira

ericbrasiln commented 1 year ago

Prezado @Jocardope Como vai? Podemos dar prosseguimento com a revisão da tradução?

Jocardope commented 1 year ago

Bom dia,

Relativamente à revisão da tradução, só falta inserir a nota de tradução referida pelo @DanielAlvesLABDH neste comentário, correto, @ericbrasiln? Se eu estiver enganado, avise-me.

Cumprimentos, João Pereira

ericbrasiln commented 1 year ago

Sim, @Jocardope É isso mesmo.

Jocardope commented 1 year ago

Boa tarde,

Entendido, @ericbrasiln! De momento não tenho acesso ao meu computador. Quando chegar a casa, daqui a três horas, sensivelmente, tratarei imediatamente desta questão. Como indicado no outro ticket tratarei da revisão da segunda lição durante o fim de semana. Avisarei-o após acrescentar a nota de tradução.

Cumprimentos, João Pereira

Jocardope commented 1 year ago

Boa tarde,

@ericbrasiln, acabei de realizar a última alteração à tradução.

Cumprimentos, João Pereira

ericbrasiln commented 1 year ago

Obrigado @Jocardope!

Acredito que podemos partir para a publicação da lição @DanielAlvesLABDH

Aproveito para agradecer ao @Jocardope pela tadução e correções e ao @felipelmc e @saletefarias pela revisão e comentários tão importantes para essa lição.

Abraços

DanielAlvesLABDH commented 1 year ago

Caríssimos/as, após prolongado silêncio da minha parte e laborioso trabalho da vossa parte, está feita a última revisão! Agradeço a todos/as! Vou solicitar o DOI e avançar para a publicação.

anisa-hawes commented 1 year ago

Sustainability + accessibility actions status:

Olá João @Jocardope, O nosso formulário de declaração serve para reconhecer os seus direitos de autor e conceder-nos permissão para publicar esta lição. Por favor, pode descarregar este formulário, preenchê-lo e enviá-lo por e-mail para mim (admin [@] programminghistorian.org)?