[gnome-devel-docs] Updated Spanish translation
- From: Daniel Mustieles García <dmustieles src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-devel-docs] Updated Spanish translation
- Date: Tue, 31 Dec 2019 08:51:38 +0000 (UTC)
commit f0f4d4024ed45311ae468da69d03dd38098673ca
Author: Daniel Mustieles <daniel mustieles gmail com>
Date: Tue Dec 31 09:51:44 2019 +0100
Updated Spanish translation
programming-guidelines/es/es.po | 1954 +++++++++++++++++++++++++++++++++------
1 file changed, 1683 insertions(+), 271 deletions(-)
---
diff --git a/programming-guidelines/es/es.po b/programming-guidelines/es/es.po
index a981d2f0..bd9e9837 100644
--- a/programming-guidelines/es/es.po
+++ b/programming-guidelines/es/es.po
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-devel-docs master\n"
-"POT-Creation-Date: 2016-03-09 08:55+0000\n"
+"POT-Creation-Date: 2019-09-18 18:28+0000\n"
"PO-Revision-Date: 2016-03-17 10:08+0100\n"
"Last-Translator: Daniel Mustieles <daniel mustieles gmail com>\n"
"Language-Team: Español; Castellano <gnome-es-list gnome org>\n"
@@ -64,8 +64,17 @@ msgstr ""
#. (itstool) path: item/p
#: C/additional-materials.page:32
-msgid ""
-"<link href=\"http://producingoss.com/\">Produducing Open Source Software</"
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://producingoss.com/\">Produducing Open Source Software</"
+#| "link>, by Karl Fogel. This is a truly excellent book of good practices "
+#| "that free software projects should follow. This is about <em>social "
+#| "aspects</em> of the project: how to treat contributors, how to organize "
+#| "and moderate communication, how to deal with non-profit foundations. If "
+#| "you ask yourself at any time, \"how should I deal with $human_situation "
+#| "in the project?\", this book may provide the answer."
+msgid ""
+"<link href=\"http://producingoss.com/\">Producing Open Source Software</"
"link>, by Karl Fogel. This is a truly excellent book of good practices that "
"free software projects should follow. This is about <em>social aspects</em> "
"of the project: how to treat contributors, how to organize and moderate "
@@ -100,11 +109,17 @@ msgstr ""
#. (itstool) path: item/p
#: C/additional-materials.page:57
-msgid ""
-"<link href=\"https://www.kernel.org/doc/Documentation/CodingStyle\">Linux "
-"Kernel Coding Style</link>. Explains the rationale for \"big indentation\", "
-"brace placement, concise but unambiguous naming, and centralized exit of "
-"functions."
+#, fuzzy
+#| msgid ""
+#| "<link href=\"https://www.kernel.org/doc/Documentation/CodingStyle\">Linux "
+#| "Kernel Coding Style</link>. Explains the rationale for \"big indentation"
+#| "\", brace placement, concise but unambiguous naming, and centralized exit "
+#| "of functions."
+msgid ""
+"<link href=\"https://www.kernel.org/doc/Documentation/process/coding-style."
+"rst\"> Linux Kernel Coding Style</link>. Explains the rationale for \"big "
+"indentation\", brace placement, concise but unambiguous naming, and "
+"centralized exit of functions."
msgstr ""
"<link href=\"https://www.kernel.org/doc/Documentation/CodingStyle\">Linux "
"Kernel Coding Style</link>. Explica la lógica de «la gran sangría», el lugar "
@@ -112,10 +127,10 @@ msgstr ""
"centralizada de funciones."
#. (itstool) path: credit/name
-#: C/api-stability.page:10 C/databases.page:11 C/documentation.page:16
-#: C/file-system.page:11 C/gerror.page:11 C/glist.page:11 C/index.page:21
-#: C/introspection.page:10 C/logging.page:11 C/main-contexts.page:11
-#: C/memory-management.page:10 C/namespacing.page:10
+#: C/api-stability.page:10 C/async-programming.page:11 C/databases.page:11
+#: C/documentation.page:16 C/file-system.page:11 C/gerror.page:11
+#: C/glist.page:11 C/index.page:21 C/introspection.page:10 C/logging.page:11
+#: C/main-contexts.page:11 C/memory-management.page:10 C/namespacing.page:10
#: C/parallel-installability.page:18 C/preconditions.page:11
#: C/threading.page:11 C/tooling.page:10 C/unit-testing.page:10
#: C/version-control.page:10 C/versioning.page:10
@@ -123,12 +138,12 @@ msgid "Philip Withnall"
msgstr "Philip Withnall"
#. (itstool) path: credit/years
-#: C/api-stability.page:12 C/databases.page:13 C/documentation.page:18
-#: C/file-system.page:13 C/gerror.page:13 C/glist.page:13 C/index.page:23
-#: C/introspection.page:12 C/logging.page:13 C/memory-management.page:12
-#: C/parallel-installability.page:20 C/preconditions.page:13
-#: C/threading.page:13 C/tooling.page:12 C/unit-testing.page:12
-#: C/version-control.page:12 C/versioning.page:12
+#: C/api-stability.page:12 C/async-programming.page:13 C/databases.page:13
+#: C/documentation.page:18 C/file-system.page:13 C/gerror.page:13
+#: C/glist.page:13 C/index.page:23 C/introspection.page:12 C/logging.page:13
+#: C/memory-management.page:12 C/parallel-installability.page:20
+#: C/preconditions.page:13 C/threading.page:13 C/tooling.page:12
+#: C/unit-testing.page:12 C/version-control.page:12 C/versioning.page:12
msgid "2015"
msgstr "2015"
@@ -143,11 +158,12 @@ msgid "API stability"
msgstr "Estabilidad de la API"
#. (itstool) path: synopsis/title
-#: C/api-stability.page:23 C/databases.page:24 C/documentation.page:32
-#: C/file-system.page:24 C/introspection.page:23 C/logging.page:26
-#: C/main-contexts.page:27 C/memory-management.page:65 C/namespacing.page:25
-#: C/parallel-installability.page:33 C/threading.page:24 C/tooling.page:45
-#: C/unit-testing.page:23 C/version-control.page:23 C/versioning.page:23
+#: C/api-stability.page:23 C/async-programming.page:26 C/databases.page:24
+#: C/documentation.page:32 C/file-system.page:24 C/introspection.page:23
+#: C/logging.page:26 C/main-contexts.page:27 C/memory-management.page:65
+#: C/namespacing.page:25 C/parallel-installability.page:33 C/threading.page:24
+#: C/tooling.page:45 C/unit-testing.page:23 C/version-control.page:23
+#: C/versioning.page:23
msgid "Summary"
msgstr "Resumen"
@@ -189,11 +205,11 @@ msgid ""
"But these differences are mostly academic, and for all practical purposes, "
"API and ABI can be treated interchangeably."
msgstr ""
-"En un nivel superior, una API (<em>interfaz de programación de "
-"aplicaciones</em>) es el límite entre dos componentes cuando se desarrolla "
-"contra ellos. Está estrechamente relacionado con una ABI (<em>interfaz "
-"binaria de aplicación</em>) que es el límite en tiempo de ejecución. Define "
-"las posibles formas en que otros componentes pueden interactuar con un "
+"En un nivel superior, una API (<em>interfaz de programación de aplicaciones</"
+"em>) es el límite entre dos componentes cuando se desarrolla contra ellos. "
+"Está estrechamente relacionado con una ABI (<em>interfaz binaria de "
+"aplicación</em>) que es el límite en tiempo de ejecución. Define las "
+"posibles formas en que otros componentes pueden interactuar con un "
"componente. Más concretamente, esto significa que normalmente las cabeceras "
"C de una biblioteca forman su API, y los símbolos compilados de la "
"biblioteca su ABI. La diferencia entre una API y ABI viene dada por la "
@@ -356,120 +372,1447 @@ msgid ""
"is ‘stable’. Very few projects commit to total stability because it would "
"prevent almost all further development of the project."
msgstr ""
-"Normalmente, los proyecto se comprometen a la compatibilidad hacia atrás "
-"cuando dicen que una API es «estable». Muy pocos proyectos se comprometen a "
-"una estabilidad total porque eso frenaría casi todo desarrollo posterior del "
-"proyecto."
+"Normalmente, los proyecto se comprometen a la compatibilidad hacia atrás "
+"cuando dicen que una API es «estable». Muy pocos proyectos se comprometen a "
+"una estabilidad total porque eso frenaría casi todo desarrollo posterior del "
+"proyecto."
+
+#. (itstool) path: section/title
+#. (itstool) path: page/title
+#: C/api-stability.page:140 C/versioning.page:20
+msgid "Versioning"
+msgstr "Versionado"
+
+#. (itstool) path: section/p
+#: C/api-stability.page:142
+msgid ""
+"API stability guarantees are strongly linked to project versioning; both "
+"package versioning and libtool versioning. Libtool versioning exists "
+"entirely for the purpose of tracking ABI stability, and is explained in "
+"detail on the <link href=\"https://autotools.io/libtool/version.html"
+"\">Autotools Mythbuster</link> or <link xref=\"versioning\"/>."
+msgstr ""
+"Las garantías de estabilidad de la API están fuertemente vinculadas a las "
+"versiones del proyecto; ambas versiones del paquete y de libtool. El "
+"versionado libtool existe completamente con el propósito de trazar la "
+"estabilidad de la ABI, y se explica con detalle en <link href=\"https://"
+"autotools.io/libtool/version.htm\">Autotools Mythbuster</link> o <link xref="
+"\"versionin\"/>."
+
+#. (itstool) path: section/p
+#: C/api-stability.page:151
+msgid ""
+"Package versioning (<em>major.minor.micro</em>) is strongly linked to API "
+"stability: typically, the major version number is incremented when backwards-"
+"incompatible changes are made (for example, when functions are renamed, "
+"parameters are changed, or functions are removed). The minor version number "
+"is incremented when forwards-incompatible changes are made (for example, "
+"when new public API is added). The micro version number is incremented when "
+"code changes are made without modifying API. See <link xref=\"versioning\"/> "
+"for more information."
+msgstr ""
+"El versionado de paquete (<em>major.minor.micro</em>) está fuertemente "
+"vinculado con la estabilidad de la API: normalmente, el número de la versión "
+"principal se incrementa cuando se hacen cambios incompatibles hacia atrás "
+"(por ejemplo, cuando se renombran funciones, se cambian parámetros, o se "
+"eliminan funciones). El número de versión secundaria se incrementa cuando se "
+"hacen cambios incompatibles hacia delante (piro ejemplo, cuando se añade una "
+"API pública nueva). El número de la micro versión se incrementa cuando se "
+"hacen cambios en el código sin modificar la API. Consulte la sección <link xref="
+"\"versioning\"/> para más información."
+
+#. (itstool) path: section/p
+#: C/api-stability.page:162
+msgid ""
+"API versioning is just as important for D-Bus APIs and GSettings schemas (if "
+"they are likely to change) as for C APIs. See the <link href=\"http://dbus."
+"freedesktop.org/doc/dbus-api-design.html#api-versioning\">documentation on D-"
+"Bus API versioning</link> for details."
+msgstr ""
+"El versionado de las API es tan importante para las API D-Bus y esquemas "
+"GSettings (si es probable que cambien) como para las API C. Vea la <link "
+"href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-versioning"
+"\">documentación en versionado de la API D-Bus</link> para más detalles."
+
+#. (itstool) path: section/p
+#: C/api-stability.page:169
+msgid ""
+"For GIR APIs, their stability typically follows the C API stability, as they "
+"are generated from the C API. One complexity is that their stability "
+"additionally depends on the version of gobject-introspection used in "
+"generating the GIR, but recent versions have not changed much so this is not "
+"a major concern."
+msgstr ""
+"Para API GIR, su estabilidad normalmente sigue la estabilidad de la API C, "
+"ya que se generan a partir de la API C. Una dificultad es que adicionalmente "
+"su estabilidad depende de la versión gobject-introspection usada al generar "
+"el GIR, pero las versiones recientes no han cambiado mucho por lo que no es "
+"una preocupación grande."
+
+#. (itstool) path: section/title
+#: C/api-stability.page:179 C/unit-testing.page:272 C/version-control.page:161
+msgid "External Links"
+msgstr "Enlaces externos"
+
+#. (itstool) path: section/p
+#: C/api-stability.page:181
+msgid "The topic of API stability is covered in the following articles:"
+msgstr ""
+"El tema de la estabilidad de la API se trata en los siguientes artículos:"
+
+#. (itstool) path: item/p
+#: C/api-stability.page:185
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://en.wikipedia.org/wiki/"
+#| "Application_programming_interface\">Wikipedia page on APIs</link>"
+msgid ""
+"<link href=\"https://en.wikipedia.org/wiki/Application_programming_interface"
+"\">Wikipedia page on APIs</link>"
+msgstr ""
+"<link href=\"http://en.wikipedia.org/wiki/Application_programming_interface"
+"\">Página de la Wikipedia sobre API</link>"
+
+#. (itstool) path: item/p
+#: C/api-stability.page:189
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://en.wikipedia.org/wiki/Application_binary_interface"
+#| "\">Wikipedia page on ABIs</link>"
+msgid ""
+"<link href=\"https://en.wikipedia.org/wiki/Application_binary_interface"
+"\">Wikipedia page on ABIs</link>"
+msgstr ""
+"<link href=\"http://en.wikipedia.org/wiki/Application_binary_interface"
+"\">Página de la Wikipedia sobre ABI</link>"
+
+#. (itstool) path: item/p
+#: C/api-stability.page:193
+msgid ""
+"<link href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-"
+"versioning\">D-Bus API versioning documentation</link>"
+msgstr ""
+"<link href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-"
+"versioning\">Versionado de la documentación de la API de D-Bus</link>"
+
+#. (itstool) path: info/desc
+#: C/async-programming.page:18
+msgid "Use of GLib-style asynchronous methods in various situations"
+msgstr ""
+
+#. (itstool) path: page/title
+#: C/async-programming.page:23
+#, fuzzy
+#| msgid "Asynchronous I/O"
+msgid "Asynchronous Programming"
+msgstr "E/S asíncrona"
+
+#. (itstool) path: item/p
+#: C/async-programming.page:29
+msgid ""
+"Use asynchronous calls in preference to synchronous calls or explicit use of "
+"threads (<link xref=\"#concepts\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:33
+msgid ""
+"Learn and follow the GLib pattern for declaring asynchronous APIs (<link "
+"xref=\"#api-pattern\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:37
+msgid ""
+"Place callbacks from asynchronous functions in order down the file, so "
+"control flow is easy to follow (<link xref=\"#single-call\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:41
+msgid ""
+"Use the presence of a <link href=\"https://developer.gnome.org/gio/stable/"
+"GTask.html\"><code>GTask</code></link> or <link href=\"https://developer."
+"gnome.org/gio/stable/GCancellable.html\"><code>GCancellable</code></link> to "
+"indicate whether an operation is ongoing (<link xref=\"#single-call\"/>, "
+"<link xref=\"#gtask\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:48
+msgid ""
+"If running operations in parallel, track how many operations are yet to "
+"start, and how many are yet to finish — the overall operation is complete "
+"once both counts are zero (<link xref=\"#parallel\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:54
+msgid ""
+"Separate state for operations into ‘task data’ structures for <link href="
+"\"https://developer.gnome.org/gio/stable/GTask.html\"><code>GTask</code>s</"
+"link>, allowing operations to be reused more easily without needing changes "
+"to global state handling (<link xref=\"#gtask\"/>)"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:60
+msgid ""
+"Consider how asynchronous methods on an object instance interact with "
+"finalization of that instance (<link xref=\"#lifetimes\"/>)"
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:68
+msgid "Concepts"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:70
+msgid ""
+"GLib supports <em>asynchronous</em> programming, where long-running "
+"operations can be started, run ‘in the background’, and a callback invoked "
+"when they are finished and their results are available. This is in direct "
+"contrast to <em>synchronous</em> long-running operations, which are a single "
+"function call which blocks program control flow until complete."
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:78
+msgid ""
+"As discussed in <link xref=\"main-contexts\"/> and <link xref="
+"\"threading#when-to-use-threading\"/>, asynchronous operations should be "
+"favoured over synchronous ones and over explicit use of threading. They do "
+"not block the main context like sychronous operations do; and are easier to "
+"use correctly than threads. They often also have a lower performance penalty "
+"than spawning a thread and sending work to it."
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:89
+msgid "API Pattern"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:91
+msgid ""
+"Asynchronous calls follow a standard pattern in GLib code. For an operation "
+"named <code>load_data</code> on the <code>File</code> class in the "
+"<code>Foo</code> namespace, there will be:"
+msgstr ""
+
+#. (itstool) path: item/code
+#: C/async-programming.page:98
+#, fuzzy, no-wrap
+#| msgid ""
+#| "\n"
+#| "void\n"
+#| "some_blocking_function_async (void *param1,\n"
+#| " void *param2,\n"
+#| " GCancellable *cancellable,\n"
+#| " GAsyncReadyCallback callback,\n"
+#| " gpointer user_data);\n"
+#| "int\n"
+#| "some_blocking_function_finish (GAsyncResult *result,\n"
+#| " GError **error);\n"
+msgid ""
+"\n"
+"foo_file_load_data_async (FooFile *self,\n"
+" …,\n"
+" GCancellable *cancellable,\n"
+" GAsyncReadyCallback callback,\n"
+" gpointer user_data)"
+msgstr ""
+"\n"
+"void\n"
+"some_blocking_function_async (void *param1,\n"
+" void *param2,\n"
+" GCancellable *cancellable,\n"
+" GAsyncReadyCallback callback,\n"
+" gpointer user_data);\n"
+"int\n"
+"some_blocking_function_finish (GAsyncResult *result,\n"
+" GError **error);\n"
+
+#. (itstool) path: item/code
+#: C/async-programming.page:106
+#, fuzzy, no-wrap
+#| msgid ""
+#| "\n"
+#| "return_type function_name (type argument,\n"
+#| " type argument,\n"
+#| " type argument);"
+msgid ""
+"\n"
+"foo_file_load_data_finish (FooFile *self,\n"
+" GAsyncResult *result,\n"
+" …,\n"
+" GError **error)"
+msgstr ""
+"\n"
+"return_type function_name (type argument,\n"
+" type argument,\n"
+" type argument);"
+
+#. (itstool) path: section/p
+#: C/async-programming.page:114
+msgid ""
+"The <code>…</code> parameters to <code>foo_file_load_data_async()</code> are "
+"those specific to the operation — in this case, perhaps the size of a buffer "
+"to load into. Similarly for <code>foo_file_load_data_finish()</code> they "
+"are the operation-specific return values — perhaps a location to return a "
+"content type string in this case."
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:123
+msgid ""
+"When <code>foo_file_load_data_async()</code> is called, it schedules the "
+"load operation in the background (as a new file descriptor on the <link xref="
+"\"main-contexts\"><code>GMainContext</code></link> or as a worker thread, "
+"for example), then returns without blocking."
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:130
+msgid ""
+"When the operation is complete, the <code>callback</code> is executed in the "
+"same <code>GMainContext</code> as the original asynchronous call. The "
+"callback is invoked <em>exactly</em> once, whether the operation succeeded "
+"or failed."
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:137
+msgid ""
+"From the callback, <code>foo_file_load_data_finish()</code> may be called by "
+"the user’s code to retrieve return values and error details, passing the "
+"<link href=\"https://developer.gnome.org/gio/stable/GAsyncResult.html"
+"\"><code>GAsyncResult</code></link> instance which was passed to the "
+"callback."
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:146
+msgid "Operation Lifetimes"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:148
+msgid ""
+"When writing asynchronous operations, it is common to write them as methods "
+"of a class. In this case, it is important to define how ongoing operations "
+"on a class instance interact with finalization of that instance. There are "
+"two approaches:"
+msgstr ""
+
+#. (itstool) path: item/title
+#: C/async-programming.page:157
+msgid "Strong"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:158
+msgid ""
+"The ongoing operation keeps a reference to the class instance, forcing it to "
+"remain alive for the duration of the operation. The class should provide "
+"some kind of ‘close’ or ‘cancel’ method which can be used by other classes "
+"to force cancellation of the operation and allow that instance to be "
+"finalized."
+msgstr ""
+
+#. (itstool) path: item/title
+#: C/async-programming.page:168
+msgid "Weak"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:169
+msgid ""
+"The ongoing operation does <em>not</em> keep a reference to the class "
+"instance, and the class cancels the operation (using <link href=\"https://"
+"developer.gnome.org/gio/stable/GCancellable.html#g-cancellable-cancel"
+"\"><code>g_cancellable_cancel()</code></link>) in its dispose function."
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:178
+msgid ""
+"Which approach is used depends on the class’ design. A class which wraps a "
+"particular operation (perhaps a <code>MyFileTransfer</code> class, for "
+"example) might want to use the <em style=\"strong\">weak</em> approach. A "
+"class which manages multiple network connections and asynchronous operations "
+"on them may use the <em style=\"strong\">strong</em> approach instead. Due "
+"to incoming network connections, for example, it might not be in complete "
+"control of the scheduling of its asynchronous calls, so the weak approach "
+"would not be appropriate — any code dropping a reference to the object could "
+"not be sure it was not accidentally killing a new network connection."
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:193
+msgid "Examples of Using Asynchronous Functions"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:195
+msgid ""
+"It is often the case that multiple asynchronous calls need to be used to "
+"complete an operation. For example, opening a file for reading, then "
+"performing a couple of reads, and then closing the file. Or opening several "
+"network sockets in parallel and waiting until they are all open before "
+"continuing with other work. Some examples of these situations are given "
+"below."
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:205
+msgid "Single Operation"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:207
+msgid ""
+"A single asynchronous call requires two functions: one to start the "
+"operation, and one to complete it. In C, the demanding part of performing an "
+"asynchronous call is correctly storing state between these two functions, "
+"and handling changes to that state in the time between those two functions "
+"being called. For example, cancellation of an ongoing asynchronous call is a "
+"state change, and if not implemented carefully, any UI updates (for example) "
+"made when cancelling an operation will be undone by updates in the "
+"operation’s callback."
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:219
+msgid ""
+"This example demonstrates copying a file from one location in the file "
+"system to another. The key principles demonstrated here are:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:224
+msgid ""
+"Placing the <code>copy_button_clicked_cb()</code> (start) and "
+"<code>copy_finish_cb()</code> (finish) functions in order by using a forward "
+"declaration for <code>copy_finish_cb()</code>. This means the control flow "
+"continues linearly down the file, rather than getting to the bottom of "
+"<code>copy_button_clicked_cb()</code> and resuming in "
+"<code>copy_finish_cb()</code> somewhere else in the file."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:233
+msgid ""
+"Use of a <link href=\"https://developer.gnome.org/gio/stable/GCancellable."
+"html\"><code>GCancellable</code></link> to allow cancelling the operation "
+"after it has started. The code in <code>cancel_button_clicked_cb()</code> is "
+"very simple: as the <code>copy_finish_cb()</code> callback is "
+"<em>guaranteed</em> to be invoked when the operation completes (even when "
+"completing early due to cancellation), all the UI and state updates for "
+"cancellation can be handled there, rather than in "
+"<code>cancel_button_clicked_cb()</code>."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:245
+msgid ""
+"An operation is ongoing exactly while <code>MyObjectPrivate."
+"copy_cancellable</code> is non-<code>NULL</code>, making it easy to track "
+"running operations. Note that this means only one file copy operation can be "
+"started via <code>copy_button_clicked_cb()</code> at a time. One "
+"<code>GCancellable</code> cannot easily be used for multiple operations like "
+"this."
+msgstr ""
+
+#. (itstool) path: example/code
+#: C/async-programming.page:256
+#, no-wrap
+msgid ""
+"\n"
+"static void\n"
+"copy_finish_cb (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"\n"
+"static void\n"
+"copy_button_clicked_cb (GtkButton *button\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *source = NULL, *destination = NULL; /* owned */\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (user_data));\n"
+"\n"
+" /* Operation already in progress? */\n"
+" if (priv->copy_cancellable != NULL)\n"
+" {\n"
+" g_debug (\"Copy already in progress.\");\n"
+" return;\n"
+" }\n"
+"\n"
+" /* Build source and destination file paths. */\n"
+" source = g_file_new_for_path (/* some path generated from UI */);\n"
+" destination = g_file_new_for_path (/* some other path generated from UI */);\n"
+"\n"
+" /* Set up a cancellable. */\n"
+" priv->copy_cancellable = g_cancellable_new ();\n"
+"\n"
+" g_file_copy_async (source, destination, G_FILE_COPY_NONE, G_PRIORITY_DEFAULT,\n"
+" priv->copy_cancellable, NULL, NULL,\n"
+" copy_finish_cb, user_data);\n"
+"\n"
+" g_object_unref (destination);\n"
+" g_object_unref (source);\n"
+"\n"
+" /* Update UI to show copy is in progress. */\n"
+" …\n"
+"}\n"
+"\n"
+"static void\n"
+"copy_finish_cb (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *source; /* unowned */\n"
+" GError *error = NULL;\n"
+"\n"
+" source = G_FILE (source_object);\n"
+" priv = my_object_get_instance_private (MY_OBJECT (user_data));\n"
+"\n"
+" /* Handle completion of the operation. */\n"
+" g_file_copy_finish (source, result, &error);\n"
+"\n"
+" if (error != NULL &&\n"
+" !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))\n"
+" {\n"
+" /* Should update the UI to signal failure.\n"
+" * Ignore failure due to cancellation. */\n"
+" g_warning (\"Failed to copy file: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_clear_error (&error);\n"
+"\n"
+" /* Clear the cancellable to signify the operation has finished. */\n"
+" g_clear_object (&priv->copy_cancellable);\n"
+"\n"
+" /* Update UI to show copy as complete. */\n"
+" …\n"
+"}\n"
+"\n"
+"static void\n"
+"cancel_button_clicked_cb (GtkButton *button,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *source = NULL, *destination = NULL; /* owned */\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (user_data));\n"
+"\n"
+" /* Operation in progress? No-op if @copy_cancellable is %NULL. */\n"
+" g_cancellable_cancel (priv->copy_cancellable);\n"
+"}\n"
+"\n"
+"static void\n"
+"my_object_dispose (GObject *obj)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (obj));\n"
+"\n"
+" /* Cancel any ongoing copy operation.\n"
+" *\n"
+" * This ensures that if #MyObject is disposed part-way through a copy, the\n"
+" * callback doesn’t get invoked with an invalid #MyObject pointer. */\n"
+" g_cancellable_cancel (priv->copy_cancellable);\n"
+"\n"
+" /* Do other dispose calls here. */\n"
+" …\n"
+"\n"
+" /* Chain up. */\n"
+" G_OBJECT_CLASS (my_object_parent_class)->dispose (obj);\n"
+"}"
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:361
+msgid ""
+"For comparison, here is the same code implemented using the <em>synchronous</"
+"em> version of <link href=\"https://developer.gnome.org/gio/stable/GFile."
+"html#g-file-copy\"><code>g_file_copy()</code></link>. Note how the order of "
+"statements is almost identical. Cancellation cannot be supported here, as "
+"the UI is blocked from receiving ‘click’ events on the cancellation button "
+"while the copy is ongoing, so <code>NULL</code> is passed to the "
+"<code>GCancellable</code> parameter. This is the main reason why this code "
+"should <em>not</em> be used in practice."
+msgstr ""
+
+#. (itstool) path: example/code
+#: C/async-programming.page:373
+#, no-wrap
+msgid ""
+"\n"
+"static void\n"
+"copy_button_clicked_cb (GtkButton *button\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *source = NULL, *destination = NULL; /* owned */\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (user_data));\n"
+"\n"
+" /* Build source and destination file paths. */\n"
+" source = g_file_new_for_path (/* some path generated from UI */);\n"
+" destination = g_file_new_for_path (/* some other path generated from UI */);\n"
+"\n"
+" g_file_copy (source, destination, G_FILE_COPY_NONE,\n"
+" NULL /* cancellable */, NULL, NULL,\n"
+" &error);\n"
+"\n"
+" g_object_unref (destination);\n"
+" g_object_unref (source);\n"
+"\n"
+" /* Handle completion of the operation. */\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Should update the UI to signal failure.\n"
+" * Ignore failure due to cancellation. */\n"
+" g_warning (\"Failed to copy file: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_clear_error (&error);\n"
+"\n"
+" /* Update UI to show copy as complete. */\n"
+" …\n"
+"}"
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:411
+msgid "Operations in Series"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:413
+msgid ""
+"A common situation is to run multiple asynchronous operations in series, "
+"when each operation depends on the previous one completing."
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:419
+msgid ""
+"In this example, the application reads a socket address from a file, opens a "
+"connection to that address, reads a message, and then finishes."
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:425 C/async-programming.page:710
+#: C/async-programming.page:880
+msgid "Key points in this example are:"
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:429
+msgid ""
+"Each callback is numbered consistently, and they are all placed in order in "
+"the file so the code follows sequentially."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:433
+msgid ""
+"As in <link xref=\"#single-call\"/>, a single <code>GCancellable</code> "
+"indicates that the series of operations is ongoing. Cancelling it aborts the "
+"entire sequence."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:438
+msgid ""
+"As in <link xref=\"#single-call\"/>, the pending operation is cancelled if "
+"the owning <code>MyObject</code> instance is disposed, to prevent callbacks "
+"being called later with an invalid <code>MyObject</code> pointer."
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:446
+msgid ""
+"<link xref=\"#gtask\"/> gives a version of this example wrapped in a <link "
+"href=\"https://developer.gnome.org/gio/stable/GTask.html\"><code>GTask</"
+"code></link> for convenience."
+msgstr ""
+
+#. (itstool) path: example/code
+#: C/async-programming.page:452
+#, no-wrap
+msgid ""
+"\n"
+"static void\n"
+"connect_to_server_cb1 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"static void\n"
+"connect_to_server_cb2 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"static void\n"
+"connect_to_server_cb3 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"\n"
+"static void\n"
+"connect_to_server (MyObject *self)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *address_file = NULL; /* owned */\n"
+"\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" if (priv->connect_cancellable != NULL)\n"
+" {\n"
+" /* Already connecting. */\n"
+" return;\n"
+" }\n"
+"\n"
+" /* Set up a cancellable. */\n"
+" priv->connect_cancellable = g_cancellable_new ();\n"
+"\n"
+" /* Read the socket address. */\n"
+" address_file = build_address_file ();\n"
+" g_file_load_contents_async (address_file, priv->connect_cancellable,\n"
+" connect_to_server_cb1, self);\n"
+" g_object_unref (address_file);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb1 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GFile *address_file; /* unowned */\n"
+" gchar *address = NULL; /* owned */\n"
+" gsize address_size = 0;\n"
+" GInetAddress *inet_address = NULL; /* owned */\n"
+" GInetSocketAddress *inet_socket_address = NULL; /* owned */\n"
+" guint16 port = 123;\n"
+" GSocketClient *socket_client = NULL; /* owned */\n"
+" GError *error = NULL;\n"
+"\n"
+" address_file = G_FILE (source_object);\n"
+" self = MY_OBJECT (user_data);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish loading the address. */\n"
+" g_file_load_contents_finish (address_file, result, &address,\n"
+" &address_size, NULL, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Parse the address. */\n"
+" inet_address = g_inet_address_new_from_string (address);\n"
+"\n"
+" if (inet_address == NULL)\n"
+" {\n"
+" /* Error. */\n"
+" g_set_error (&error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,\n"
+" \"Invalid address ‘%s’.\", address);\n"
+" goto done;\n"
+" }\n"
+"\n"
+" inet_socket_address = g_inet_socket_address_new (inet_address, port);\n"
+"\n"
+" /* Connect to the given address. */\n"
+" socket_client = g_socket_client_new ();\n"
+"\n"
+" g_socket_client_connect_async (socket_client,\n"
+" G_SOCKET_CONNECTABLE (inet_socket_address),\n"
+" priv->connect_cancellable,\n"
+" connect_to_server_cb2,\n"
+" self);\n"
+"\n"
+"done:\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Stop the operation. */\n"
+" if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))\n"
+" {\n"
+" g_warning (\"Failed to load server address: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_clear_object (&priv->connect_cancellable);\n"
+" g_error_free (error);\n"
+" }\n"
+"\n"
+" g_free (address);\n"
+" g_clear_object (&inet_address);\n"
+" g_clear_object (&inet_socket_address);\n"
+" g_clear_object (&socket_client);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb2 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GSocketClient *socket_client; /* unowned */\n"
+" GSocketConnection *connection = NULL; /* owned */\n"
+" GInputStream *input_stream; /* unowned */\n"
+" GError *error = NULL;\n"
+"\n"
+" socket_client = G_SOCKET_CLIENT (source_object);\n"
+" self = MY_OBJECT (user_data);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish connecting to the socket. */\n"
+" connection = g_socket_client_connect_finish (socket_client, result,\n"
+" &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Store a reference to the connection so it is kept open while we read from\n"
+" * it: #GInputStream does not keep a reference to a #GIOStream which contains\n"
+" * it. */\n"
+" priv->connection = g_object_ref (connection);\n"
+"\n"
+" /* Read a message from the connection. This uses a single buffer stored in\n"
+" * #MyObject, meaning that only one connect_to_server() operation can run at\n"
+" * any time. The buffer could instead be allocated dynamically if this is a\n"
+" * problem. */\n"
+" input_stream = g_io_stream_get_input_stream (G_IO_STREAM (connection));\n"
+"\n"
+" g_input_stream_read_async (input_stream,\n"
+" priv->message_buffer,\n"
+" sizeof (priv->message_buffer),\n"
+" G_PRIORITY_DEFAULT, priv->connect_cancellable,\n"
+" connect_to_server_cb3, self);\n"
+"\n"
+"done:\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Stop the operation. */\n"
+" if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))\n"
+" {\n"
+" g_warning (\"Failed to connect to server: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_clear_object (&priv->connect_cancellable);\n"
+" g_clear_object (&priv->connection);\n"
+" g_error_free (error);\n"
+" }\n"
+"\n"
+" g_clear_object (&connection);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb3 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GInputStream *input_stream; /* unowned */\n"
+" gssize len = 0;\n"
+" GError *error = NULL;\n"
+"\n"
+" input_stream = G_INPUT_STREAM (source_object);\n"
+" self = MY_OBJECT (user_data);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish reading from the socket. */\n"
+" len = g_input_stream_read_finish (input_stream, result, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Handle the message. */\n"
+" g_assert_cmpint (len, >=, 0);\n"
+" g_assert_cmpuint ((gsize) len, <=, sizeof (priv->message_buffer));\n"
+"\n"
+" handle_received_message (self, priv->message_buffer, len, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+"done:\n"
+" /* Unconditionally mark the operation as finished.\n"
+" *\n"
+" * The streams should automatically close as this\n"
+" * last reference is dropped. */\n"
+" g_clear_object (&priv->connect_cancellable);\n"
+" g_clear_object (&priv->connection);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Warn about the error. */\n"
+" if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))\n"
+" {\n"
+" g_warning (\"Failed to read from the server: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_error_free (error);\n"
+" }\n"
+"}\n"
+"\n"
+"static void\n"
+"my_object_dispose (GObject *obj)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (obj));\n"
+"\n"
+" /* Cancel any ongoing connection operations.\n"
+" *\n"
+" * This ensures that if #MyObject is disposed part-way through the\n"
+" * connect_to_server() sequence of operations, the sequence gets cancelled and\n"
+" * doesn’t continue with an invalid #MyObject pointer. */\n"
+" g_cancellable_cancel (priv->connect_cancellable);\n"
+"\n"
+" /* Do other dispose calls here. */\n"
+" …\n"
+"\n"
+" /* Chain up. */\n"
+" G_OBJECT_CLASS (my_object_parent_class)->dispose (obj);\n"
+"}"
+msgstr ""
+
+#. (itstool) path: section/title
+#: C/async-programming.page:697
+msgid "Operations in Parallel"
+msgstr ""
+
+#. (itstool) path: section/p
+#: C/async-programming.page:699
+msgid ""
+"Another common situation is to run multiple asynchronous operations in "
+"parallel, considering the overall operation complete when all its "
+"constituents are complete."
+msgstr ""
+
+#. (itstool) path: example/p
+#: C/async-programming.page:706
+msgid "In this example, the application deletes multiple files in parallel."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:714
+msgid ""
+"The number of pending asynchronous operations (ones which have started but "
+"not yet finished) is tracked as <code>n_deletions_pending</code>. The "
+"<code>delete_files_cb()</code> callback only considers the entire operation "
+"complete once this reaches zero."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:721
+msgid ""
+"<code>n_deletions_to_start</code> tracks deletion operations being started, "
+"in case <link href=\"https://developer.gnome.org/gio/stable/GFile.html#g-"
+"file-delete-async\"><code>g_file_delete_async()</code></link> manages to use "
+"a fast path and complete synchronously (without blocking)."
+msgstr ""
+
+#. (itstool) path: item/p
+#: C/async-programming.page:728
+msgid ""
+"As in <link xref=\"#single-call\"/>, all pending deletions are cancelled if "
+"the owning <code>MyObject</code> instance is disposed, to prevent callbacks "
+"being called later with an invalid <code>MyObject</code> pointer."
+msgstr ""
+
+#. (itstool) path: example/code
+#: C/async-programming.page:736
+#, no-wrap
+msgid ""
+"\n"
+"static void\n"
+"delete_files_cb (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"\n"
+"static void\n"
+"delete_files (MyObject *self,\n"
+" GPtrArray/*<owned GFile*>>*/ *files)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GFile *address_file = NULL; /* owned */\n"
+"\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Set up a cancellable if no operation is ongoing already. */\n"
+" if (priv->delete_cancellable == NULL)\n"
+" {\n"
+" priv->delete_cancellable = g_cancellable_new ();\n"
+" priv->n_deletions_pending = 0;\n"
+" priv->n_deletions_total = 0;\n"
+" }\n"
+"\n"
+" /* Update internal state, and temporarily set @n_deletions_to_start. This is\n"
+" * used in delete_files_cb() to avoid indicating the overall operation has\n"
+" * completed while deletions are still being started. This can happen if\n"
+" * g_file_delete_async() completes synchronously, for example if there’s a\n"
+" * non-blocking fast path for the given file system. */\n"
+" priv->n_deletions_pending += files->len;\n"
+" priv->n_deletions_total += files->len;\n"
+" priv->n_deletions_to_start = files->len;\n"
+"\n"
+" /* Update the UI to indicate the files are being deleted. */\n"
+" update_ui_to_show_progress (self,\n"
+" priv->n_deletions_pending,\n"
+" priv->n_deletions_total);\n"
+"\n"
+" /* Start all the deletion operations in parallel. They share the same\n"
+" * #GCancellable. */\n"
+" for (i = 0; i < files->len; i++)\n"
+" {\n"
+" GFile *file = files->pdata[i];\n"
+"\n"
+" priv->n_deletions_to_start--;\n"
+" g_file_delete_async (file, G_PRIORITY_DEFAULT, priv->delete_cancellable,\n"
+" delete_files_cb, self);\n"
+" }\n"
+"}\n"
+"\n"
+"static void\n"
+"delete_files_cb (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GFile *file; /* unowned */\n"
+" GError *error = NULL;\n"
+"\n"
+" file = G_FILE (source_object);\n"
+" self = MY_OBJECT (user_data);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish deleting the file. */\n"
+" g_file_delete_finish (file, result, &error);\n"
+"\n"
+" if (error != NULL &&\n"
+" !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))\n"
+" {\n"
+" g_warning (\"Error deleting file: %s\", error->message);\n"
+" }\n"
+"\n"
+" g_clear_error (&error);\n"
+"\n"
+" /* Update the internal state. */\n"
+" g_assert_cmpuint (priv->n_deletions_pending, >, 0);\n"
+" priv->n_deletions_pending--;\n"
+"\n"
+" /* Update the UI to show progress. */\n"
+" update_ui_to_show_progress (self,\n"
+" priv->n_deletions_pending,\n"
+" priv->n_deletions_total);\n"
+"\n"
+" /* If all deletions have completed, and no more are being started,\n"
+" * update the UI to show completion. */\n"
+" if (priv->n_deletions_pending == 0 && priv->n_deletions_to_start == 0)\n"
+" {\n"
+" update_ui_to_show_completion (self);\n"
+"\n"
+" /* Clear the operation state. */\n"
+" g_clear_object (&priv->delete_cancellable);\n"
+" priv->n_deletions_total = 0;\n"
+" }\n"
+"}\n"
+"\n"
+"static void\n"
+"my_object_dispose (GObject *obj)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+"\n"
+" priv = my_object_get_instance_private (MY_OBJECT (obj));\n"
+"\n"
+" /* Cancel any ongoing deletion operations.\n"
+" *\n"
+" * This ensures that if #MyObject is disposed part-way through the\n"
+" * delete_files() set of operations, the set gets cancelled and\n"
+" * doesn’t continue with an invalid #MyObject pointer. */\n"
+" g_cancellable_cancel (priv->delete_cancellable);\n"
+"\n"
+" /* Do other dispose calls here. */\n"
+" …\n"
+"\n"
+" /* Chain up. */\n"
+" G_OBJECT_CLASS (my_object_parent_class)->dispose (obj);\n"
+"}"
+msgstr ""
#. (itstool) path: section/title
-#. (itstool) path: page/title
-#: C/api-stability.page:140 C/versioning.page:20
-msgid "Versioning"
-msgstr "Versionado"
+#: C/async-programming.page:855
+#, fuzzy
+#| msgid "<code>GTask</code>"
+msgid "Wrapping with <code>GTask</code>"
+msgstr "<code>GTask</code>"
#. (itstool) path: section/p
-#: C/api-stability.page:142
+#: C/async-programming.page:857
msgid ""
-"API stability guarantees are strongly linked to project versioning; both "
-"package versioning and libtool versioning. Libtool versioning exists "
-"entirely for the purpose of tracking ABI stability, and is explained in "
-"detail on the <link href=\"https://autotools.io/libtool/version.html"
-"\">Autotools Mythbuster</link> or <link xref=\"versioning\"/>."
+"Often when an asynchronous operation (or set of operations) becomes more "
+"complex, it needs associated state. This is typically stored in a custom "
+"structure — but defining a new structure to store the standard callback, "
+"user data and cancellable tuple is laborious. <link href=\"https://developer."
+"gnome.org/gio/stable/GTask.html\"><code>GTask</code></link> eases this by "
+"providing a standardized way to wrap all three, plus extra custom ‘task "
+"data’."
msgstr ""
-"Las garantías de estabilidad de la API están fuertemente vinculadas a las "
-"versiones del proyecto; ambas versiones del paquete y de libtool. El "
-"versionado libtool existe completamente con el propósito de trazar la "
-"estabilidad de la ABI, y se explica con detalle en <link href=\"https://"
-"autotools.io/libtool/version.htm\">Autotools Mythbuster</link> o <link "
-"xref=\"versionin\"/>."
#. (itstool) path: section/p
-#: C/api-stability.page:151
+#: C/async-programming.page:867
msgid ""
-"Package versioning (<em>major.minor.micro</em>) is strongly linked to API "
-"stability: typically, the major version number is incremented when backwards-"
-"incompatible changes are made (for example, when functions are renamed, "
-"parameters are changed, or functions are removed). The minor version number "
-"is incremented when forwards-incompatible changes are made (for example, "
-"when new public API is added). The micro version number is incremented when "
-"code changes are made without modifying API. See <link xref=\"versioning\"/> "
-"for more information."
+"The use of a <code>GTask</code> can replace the use of a <link href="
+"\"https://developer.gnome.org/gio/stable/GCancellable.html"
+"\"><code>GCancellable</code></link> for indicating whether an operation is "
+"ongoing."
msgstr ""
-"El versionado de paquete (<em>major.minor.micro</em>) está fuertemente "
-"vinculado con la estabilidad de la API: normalmente, el número de la versión "
-"principal se incrementa cuando se hacen cambios incompatibles hacia atrás "
-"(por ejemplo, cuando se renombran funciones, se cambian parámetros, o se "
-"eliminan funciones). El número de versión secundaria se incrementa cuando se "
-"hacen cambios incompatibles hacia delante (piro ejemplo, cuando se añade una "
-"API pública nueva). El número de la micro versión se incrementa cuando se "
-"hacen cambios en el código sin modificar la API. Consulte la <link xref="
-"\"versioning\"/> para más información."
-#. (itstool) path: section/p
-#: C/api-stability.page:162
+#. (itstool) path: example/p
+#: C/async-programming.page:874
msgid ""
-"API versioning is just as important for D-Bus APIs and GSettings schemas (if "
-"they are likely to change) as for C APIs. See the <link href=\"http://dbus."
-"freedesktop.org/doc/dbus-api-design.html#api-versioning\">documentation on D-"
-"Bus API versioning</link> for details."
+"This example is functionally the same as <link xref=\"#series\"/>, but "
+"refactored to use a <code>GTask</code> to wrap the sequence of operations."
msgstr ""
-"El versionado de las API es tan importante para las API D-Bus y esquemas "
-"GSettings (si es probable que cambien) como para las API C. Vea la <link "
-"href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-versioning"
-"\">documentación en versionado de la API D-Bus</link> para más detalles."
-#. (itstool) path: section/p
-#: C/api-stability.page:169
+#. (itstool) path: item/p
+#: C/async-programming.page:884
msgid ""
-"For GIR APIs, their stability typically follows the C API stability, as they "
-"are generated from the C API. One complexity is that their stability "
-"additionally depends on the version of gobject-introspection used in "
-"generating the GIR, but recent versions have not changed much so this is not "
-"a major concern."
-msgstr ""
-"Para API GIR, su estabilidad normalmente sigue la estabilidad de la API C, "
-"ya que se generan a partir de la API C. Una dificultad es que adicionalmente "
-"su estabilidad depende de la versión gobject-introspection usada al generar "
-"el GIR, pero las versiones recientes no han cambiado mucho por lo que no es "
-"una preocupación grande."
-
-#. (itstool) path: section/title
-#: C/api-stability.page:179 C/unit-testing.page:272 C/version-control.page:161
-msgid "External Links"
-msgstr "Enlaces externos"
-
-#. (itstool) path: section/p
-#: C/api-stability.page:181
-msgid "The topic of API stability is covered in the following articles:"
+"State which was in <code>MyObjectPrivate</code> in <link xref=\"#series\"/> "
+"is now in the <code>ConnectToServerData</code> closure, which is set as the "
+"‘task data’ of the <code>GTask</code> representing the overall operation. "
+"This means it’s automatically freed after the operation returns."
msgstr ""
-"El tema de la estabilidad de la API se trata en los siguientes artículos:"
#. (itstool) path: item/p
-#: C/api-stability.page:185
+#: C/async-programming.page:891
msgid ""
-"<link href=\"http://en.wikipedia.org/wiki/Application_programming_interface"
-"\">Wikipedia page on APIs</link>"
+"Furthermore, this means that manipulations of <code>MyObjectPrivate</code> "
+"state are limited to the start and end of the sequence of operations, so "
+"reusing the task in different situations becomes easier — for example, it is "
+"now a lot easier to support running multiple such tasks in parallel."
msgstr ""
-"<link href=\"http://en.wikipedia.org/wiki/Application_programming_interface"
-"\">Página de la Wikipedia sobre API</link>"
#. (itstool) path: item/p
-#: C/api-stability.page:189
+#: C/async-programming.page:898
msgid ""
-"<link href=\"http://en.wikipedia.org/wiki/Application_binary_interface"
-"\">Wikipedia page on ABIs</link>"
+"As the <code>GTask</code> holds a reference to <code>MyObject</code>, it is "
+"impossible for the object to be disposed while the sequence of operations is "
+"ongoing, so the <code>my_object_dispose()</code> code has been removed. "
+"Instead, a <code>my_object_close()</code> method exists to allow any pending "
+"operations can be cancelled so <code>MyObject</code> can be disposed when "
+"desired."
msgstr ""
-"<link href=\"http://en.wikipedia.org/wiki/Application_binary_interface"
-"\">Página de la Wikipedia sobre ABI</link>"
-#. (itstool) path: item/p
-#: C/api-stability.page:193
+#. (itstool) path: example/code
+#: C/async-programming.page:909
+#, no-wrap
msgid ""
-"<link href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-"
-"versioning\">D-Bus API versioning documentation</link>"
+"\n"
+"static void\n"
+"connect_to_server_cb1 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"static void\n"
+"connect_to_server_cb2 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"static void\n"
+"connect_to_server_cb3 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data);\n"
+"\n"
+"typedef struct {\n"
+" GSocketConnection *connection; /* nullable; owned */\n"
+" guint8 message_buffer[128];\n"
+"} ConnectToServerData;\n"
+"\n"
+"static void\n"
+"connect_to_server_data_free (ConnectToServerData *data)\n"
+"{\n"
+" g_clear_object (&data->connection);\n"
+"}\n"
+"\n"
+"void\n"
+"my_object_connect_to_server_async (MyObject *self,\n"
+" GCancellable *cancellable,\n"
+" GAsyncReadyCallback callback,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+" GTask *task = NULL; /* owned */\n"
+" ConnectToServerData *data = NULL; /* owned */\n"
+" GFile *address_file = NULL; /* owned */\n"
+"\n"
+" g_return_if_fail (MY_IS_OBJECT (self));\n"
+" g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));\n"
+"\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" if (priv->connect_task != NULL)\n"
+" {\n"
+" g_task_report_new_error (self, callback, user_data, NULL,\n"
+" G_IO_ERROR, G_IO_ERROR_PENDING,\n"
+" \"Already connecting to the server.\");\n"
+" return;\n"
+" }\n"
+"\n"
+" /* Set up a cancellable. */\n"
+" if (cancellable != NULL)\n"
+" {\n"
+" g_object_ref (cancellable);\n"
+" }\n"
+" else\n"
+" {\n"
+" cancellable = g_cancellable_new ();\n"
+" }\n"
+"\n"
+" /* Set up the task. */\n"
+" task = g_task_new (self, cancellable, callback, user_data);\n"
+" g_task_set_check_cancellable (task, FALSE);\n"
+"\n"
+" data = g_malloc0 (sizeof (ConnectToServerData));\n"
+" g_task_set_task_data (task, data,\n"
+" (GDestroyNotify) connect_to_server_data_free);\n"
+"\n"
+" g_object_unref (cancellable);\n"
+"\n"
+" priv->connect_task = g_object_ref (task);\n"
+"\n"
+" /* Read the socket address. */\n"
+" address_file = build_address_file ();\n"
+" g_file_load_contents_async (address_file, g_task_get_cancellable (task),\n"
+" connect_to_server_cb1, g_object_ref (task));\n"
+" g_object_unref (address_file);\n"
+"\n"
+" g_clear_object (&task);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb1 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GTask *task = NULL; /* owned */\n"
+" GFile *address_file; /* unowned */\n"
+" gchar *address = NULL; /* owned */\n"
+" gsize address_size = 0;\n"
+" GInetAddress *inet_address = NULL; /* owned */\n"
+" GInetSocketAddress *inet_socket_address = NULL; /* owned */\n"
+" guint16 port = 123;\n"
+" GSocketClient *socket_client = NULL; /* owned */\n"
+" GError *error = NULL;\n"
+"\n"
+" address_file = G_FILE (source_object);\n"
+" task = G_TASK (user_data);\n"
+" self = g_task_get_source_object (task);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish loading the address. */\n"
+" g_file_load_contents_finish (address_file, result, &address,\n"
+" &address_size, NULL, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Parse the address. */\n"
+" inet_address = g_inet_address_new_from_string (address);\n"
+"\n"
+" if (inet_address == NULL)\n"
+" {\n"
+" /* Error. */\n"
+" g_set_error (&error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,\n"
+" \"Invalid address ‘%s’.\", address);\n"
+" goto done;\n"
+" }\n"
+"\n"
+" inet_socket_address = g_inet_socket_address_new (inet_address, port);\n"
+"\n"
+" /* Connect to the given address. */\n"
+" socket_client = g_socket_client_new ();\n"
+"\n"
+" g_socket_client_connect_async (socket_client,\n"
+" G_SOCKET_CONNECTABLE (inet_socket_address),\n"
+" g_task_get_cancellable (task),\n"
+" connect_to_server_cb2,\n"
+" g_object_ref (task));\n"
+"\n"
+"done:\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Stop the operation and propagate the error. */\n"
+" g_clear_object (&priv->connect_task);\n"
+" g_task_return_error (task, error);\n"
+" }\n"
+"\n"
+" g_free (address);\n"
+" g_clear_object (&inet_address);\n"
+" g_clear_object (&inet_socket_address);\n"
+" g_clear_object (&socket_client);\n"
+" g_clear_object (&task);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb2 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GTask *task = NULL; /* owned */\n"
+" ConnectToServerData *data; /* unowned */\n"
+" GSocketClient *socket_client; /* unowned */\n"
+" GSocketConnection *connection = NULL; /* owned */\n"
+" GInputStream *input_stream; /* unowned */\n"
+" GError *error = NULL;\n"
+"\n"
+" socket_client = G_SOCKET_CLIENT (source_object);\n"
+" task = G_TASK (user_data);\n"
+" data = g_task_get_task_data (task);\n"
+" self = g_task_get_source_object (task);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish connecting to the socket. */\n"
+" connection = g_socket_client_connect_finish (socket_client, result,\n"
+" &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Store a reference to the connection so it is kept open while we read from\n"
+" * it: #GInputStream does not keep a reference to a #GIOStream which contains\n"
+" * it. */\n"
+" data->connection = g_object_ref (connection);\n"
+"\n"
+" /* Read a message from the connection. As the buffer is allocated as part of\n"
+" * the per-task @data, multiple tasks can run concurrently. */\n"
+" input_stream = g_io_stream_get_input_stream (G_IO_STREAM (connection));\n"
+"\n"
+" g_input_stream_read_async (input_stream,\n"
+" data->message_buffer,\n"
+" sizeof (data->message_buffer),\n"
+" G_PRIORITY_DEFAULT, g_task_get_cancellable (task),\n"
+" connect_to_server_cb3, g_object_ref (task));\n"
+"\n"
+"done:\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Stop the operation and propagate the error. */\n"
+" g_clear_object (&priv->connect_task);\n"
+" g_task_return_error (task, error);\n"
+" }\n"
+"\n"
+" g_clear_object (&connection);\n"
+" g_clear_object (&task);\n"
+"}\n"
+"\n"
+"static void\n"
+"connect_to_server_cb3 (GObject *source_object,\n"
+" GAsyncResult *result,\n"
+" gpointer user_data)\n"
+"{\n"
+" MyObject *self;\n"
+" MyObjectPrivate *priv;\n"
+" GTask *task = NULL; /* owned */\n"
+" ConnectToServerData *data; /* unowned */\n"
+" GInputStream *input_stream; /* unowned */\n"
+" gssize len = 0;\n"
+" GError *error = NULL;\n"
+"\n"
+" input_stream = G_INPUT_STREAM (source_object);\n"
+" task = G_TASK (user_data);\n"
+" data = g_task_get_task_data (task);\n"
+" self = g_task_get_source_object (task);\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" /* Finish reading from the socket. */\n"
+" len = g_input_stream_read_finish (input_stream, result, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Handle the message. */\n"
+" g_assert_cmpint (len, >=, 0);\n"
+" g_assert_cmpuint ((gsize) len, <=, sizeof (data->message_buffer));\n"
+"\n"
+" handle_received_message (self, data->message_buffer, len, &error);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" goto done;\n"
+" }\n"
+"\n"
+" /* Success! */\n"
+" g_task_return_boolean (task, TRUE);\n"
+"\n"
+"done:\n"
+" /* Unconditionally mark the operation as finished.\n"
+" *\n"
+" * The streams should automatically close as this\n"
+" * last reference is dropped. */\n"
+" g_clear_object (&priv->connect_task);\n"
+"\n"
+" if (error != NULL)\n"
+" {\n"
+" /* Stop the operation and propagate the error. */\n"
+" g_task_return_error (task, error);\n"
+" }\n"
+"\n"
+" g_clear_object (&task);\n"
+"}\n"
+"\n"
+"void\n"
+"my_object_connect_to_server_finish (MyObject *self,\n"
+" GAsyncResult *result,\n"
+" GError **error)\n"
+"{\n"
+" g_return_if_fail (MY_IS_OBJECT (self));\n"
+" g_return_if_fail (g_task_is_valid (result, self));\n"
+" g_return_if_fail (error == NULL || *error == NULL);\n"
+"\n"
+" g_task_propagate_boolean (G_TASK (result), error);\n"
+"}\n"
+"\n"
+"void\n"
+"my_object_close (MyObject *self)\n"
+"{\n"
+" MyObjectPrivate *priv;\n"
+"\n"
+" g_return_if_fail (MY_IS_OBJECT (self));\n"
+"\n"
+" priv = my_object_get_instance_private (self);\n"
+"\n"
+" if (priv->connect_task != NULL)\n"
+" {\n"
+" GCancellable *cancellable = g_task_get_cancellable (priv->connect_task);\n"
+" g_cancellable_cancel (cancellable);\n"
+" }\n"
+"}"
msgstr ""
-"<link href=\"http://dbus.freedesktop.org/doc/dbus-api-design.html#api-"
-"versioning\">Versionado de la documentación de la API de D-Bus</link>"
#. (itstool) path: credit/name
#: C/c-coding-style.page:15 C/documentation.page:21
@@ -2208,7 +3551,7 @@ msgstr ""
#: C/c-coding-style.page:944
msgid "See <link xref=\"memory-management\"/> for more details."
msgstr ""
-"Consulte la <link xref=\"memory-management\"/> para obtener más detalles."
+"Consulte la sección <link xref=\"memory-management\"/> para obtener más detalles."
#. (itstool) path: section/title
#: C/c-coding-style.page:950
@@ -2271,6 +3614,24 @@ msgid ""
"declared static."
msgstr ""
+#. (itstool) path: p/link
+#: C/cc-by-sa-3-0.xml:4
+msgid "Creative Commons Attribution-Share Alike 3.0 United States License"
+msgstr ""
+
+#. (itstool) path: license/p
+#: C/cc-by-sa-3-0.xml:3
+msgid "This work is licensed under a <_:link-1/>."
+msgstr ""
+
+#. (itstool) path: license/p
+#: C/cc-by-sa-3-0.xml:6
+msgid ""
+"As a special exception, the copyright holders give you permission to copy, "
+"modify, and distribute the example code contained in this document under the "
+"terms of your choosing, without restriction."
+msgstr ""
+
#. (itstool) path: info/desc
#: C/databases.page:18
msgid "Simple persistent object stores"
@@ -2356,13 +3717,23 @@ msgid ""
"please consider it before choosing to use GOM."
msgstr ""
+#. (itstool) path: section/p
+#: C/databases.page:86
+msgid ""
+"GNOME has another database library: GNOME Data Access (GDA). This is "
+"targeted at abstracting access to various types of relational database, for "
+"use in a database utility program or office program, for example. It is not "
+"suitable for storing <link href=\"https://developer.gnome.org/gio/stable/"
+"GSettings.html\">user settings</link>."
+msgstr ""
+
#. (itstool) path: section/title
-#: C/databases.page:88
+#: C/databases.page:97
msgid "Using GOM"
msgstr "Usar GOM"
#. (itstool) path: section/p
-#: C/databases.page:90
+#: C/databases.page:99
msgid ""
"Providing a GOM tutorial is beyond the scope of this document, but a <link "
"href=\"https://developer.gnome.org/gom/\">reference manual is available</"
@@ -2370,40 +3741,41 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/databases.page:104
+#: C/databases.page:113
msgid "SQL Injection"
msgstr "Inyección SQL"
#. (itstool) path: section/p
-#: C/databases.page:106
+#: C/databases.page:115
msgid ""
"GOM does allow access to the lower level SQLite query APIs. When using them, "
"queries <em style=\"strong\">must</em> be constructed using SQLite’s <link "
"href=\"https://www.sqlite.org/c3ref/stmt.html\">prepared statement</link> "
"and <link href=\"https://www.sqlite.org/c3ref/bind_blob.html\">value "
"binding</link> API, rather than by constructing SQL strings then passing "
-"them to SQLite to parse. Constructing strings makes <link href=\"http://en."
+"them to SQLite to parse. Constructing strings makes <link href=\"https://en."
"wikipedia.org/wiki/SQL_injection\">SQL injection</link> vulnerabilities very "
"likely, which can give attackers access to arbitrary user data from the "
"database."
msgstr ""
#. (itstool) path: section/title
-#: C/databases.page:122
+#: C/databases.page:131
msgid "Using GVDB"
msgstr "Usar GVDB"
#. (itstool) path: section/p
-#: C/databases.page:124
+#: C/databases.page:133
msgid ""
"GVDB has a simple API which mirrors a conventional hash table. Presently, "
"GVDB is only available as a copy-and-paste library; fetch the most recent "
-"copy of the code from <link href=\"https://git.gnome.org/browse/gvdb\">GVDB "
-"git</link> and copy it into your project. It is licenced under LGPLv2.1+."
+"copy of the code from <link href=\"https://gitlab.gnome.org/GNOME/gvdb"
+"\">GVDB git</link> and copy it into your project. It is licensed under "
+"LGPLv2.1+."
msgstr ""
#. (itstool) path: section/p
-#: C/databases.page:132
+#: C/databases.page:141
msgid "A full GVDB tutorial is beyond the scope of this document."
msgstr "Un manual completo de GVDB está fuera del alcance de este documento."
@@ -2425,7 +3797,7 @@ msgid ""
"\"#gtk-doc\"/>)"
msgstr ""
"Use gtk-doc con una configuración actualizada para la documentación de la "
-"API. (Consulte la <link xref=\"#gtk-doc\"/>)"
+"API. (Consulte la sección <link xref=\"#gtk-doc\"/>)"
#. (itstool) path: item/p
#: C/documentation.page:39
@@ -2448,7 +3820,7 @@ msgid ""
"in the gtk-doc build. (<link xref=\"#dbus-api\"/>)"
msgstr ""
"Use <cmd>gdbus-codegen</cmd> para generar la documentación de la API de D-"
-"Bus que incluir en la construcción de gtk-doc. (Consulte la <link xref="
+"Bus que incluir en la construcción de gtk-doc. (Consulte la sección <link xref="
"\"#dbus-api\"/>)"
#. (itstool) path: item/p
@@ -2458,7 +3830,7 @@ msgid ""
"\"#introspection-annotations\"/>)"
msgstr ""
"Añada anotaciones de instrospección a toda la documentación de la API. "
-"(Consulte la <link xref=\"#introspection-annotations\"/>)"
+"(Consulte la sección <link xref=\"#introspection-annotations\"/>)"
#. (itstool) path: item/p
#: C/documentation.page:55
@@ -2953,8 +4325,7 @@ msgstr "Mantener la documentación actualizada"
msgid ""
"gtk-doc comes with support for checking the documentation with some basic "
"tests. These check that all version indexes are included in the main <file>*-"
-"docs.xml</file> file and that all symbols are documented, amongst other "
-"things."
+"docs.xml</file> file and that all symbols are documented, among other things."
msgstr ""
#. (itstool) path: section/p
@@ -3001,7 +4372,7 @@ msgstr ""
msgid ""
"Use asynchronous I/O for file access. (<link xref=\"#asynchronous-io\"/>)"
msgstr ""
-"Use E/S asíncrona para acceder a archivos. (Consulte la <link xref="
+"Use E/S asíncrona para acceder a archivos. (Consulte la sección <link xref="
"\"#asynchronous-io\"/>)"
#. (itstool) path: item/p
@@ -3171,7 +4542,7 @@ msgstr ""
#. (itstool) path: section/p
#: C/file-system.page:172
msgid ""
-"As a second line of defence, all projects which access the file system "
+"As a second line of defense, all projects which access the file system "
"should consider providing a mandatory access control profile, using a system "
"such as <link href=\"http://apparmor.net/\">AppArmor</link> or <link href="
"\"http://selinuxproject.org/\">SELinux</link>, which limits the directories "
@@ -3199,7 +4570,7 @@ msgid ""
"<link href=\"https://developer.gnome.org/glib/stable/glib-Error-Reporting."
"html\"><code>GError</code></link> is the standard error reporting mechanism "
"for GLib-using code, and can be thought of as a C implementation of an <link "
-"href=\"http://en.wikipedia.org/wiki/Exception_handling\">exception</link>."
+"href=\"https://en.wikipedia.org/wiki/Exception_handling\">exception</link>."
msgstr ""
#. (itstool) path: section/p
@@ -3529,8 +4900,8 @@ msgid ""
"<link href=\"https://wiki.gnome.org/Projects/GObjectIntrospection\"> GObject "
"introspection</link> (abbreviated ‘GIR’) is a system which extracts APIs "
"from C code and produces binary type libraries which can be used by non-C "
-"language bindings, and other tools, to <link href=\"http://en.wikipedia.org/"
-"wiki/Type_introspection\">introspect</link> or <link href=\"http://en."
+"language bindings, and other tools, to <link href=\"https://en.wikipedia.org/"
+"wiki/Type_introspection\">introspect</link> or <link href=\"https://en."
"wikipedia.org/wiki/Language_binding\">wrap</link> the original C libraries. "
"It uses a system of annotations in documentation comments in the C code to "
"expose extra information about the APIs which is not machine readable from "
@@ -3553,7 +4924,7 @@ msgid ""
"Enable introspection for all libraries. (<link xref=\"#using-introspection\"/"
">)"
msgstr ""
-"Active la introspección para todas las bibliotecas. (Consulte la <link xref="
+"Active la introspección para todas las bibliotecas. (Consulte la sección <link xref="
"\"#using-introspection\"/>)"
#. (itstool) path: item/p
@@ -4055,7 +5426,7 @@ msgstr "¿Qué es <code>GMainContext</code>?"
msgid ""
"<link href=\"https://developer.gnome.org/glib/stable/glib-The-Main-Event-"
"Loop.html#GMainContext\"><code>GMainContext</code></link> is a generalized "
-"implementation of an <link href=\"http://en.wikipedia.org/wiki/Event_loop"
+"implementation of an <link href=\"https://en.wikipedia.org/wiki/Event_loop"
"\">event loop</link>, useful for implementing polled file I/O or event-based "
"widget systems (such as GTK+). It is at the core of almost every GLib "
"application. To understand <code>GMainContext</code> requires understanding "
@@ -4617,8 +5988,8 @@ msgid ""
"Never iterate a context created outside the library, including the global-"
"default or thread-default contexts. Otherwise, <code>GSource</code>s created "
"in the application may be dispatched when the application is not expecting "
-"it, causing <link href=\"http://en.wikipedia.org/wiki/Reentrancy_%28computing"
-"%29\">re-entrancy problems</link> for the application code."
+"it, causing <link href=\"https://en.wikipedia.org/wiki/Reentrancy_"
+"%28computing%29\">re-entrancy problems</link> for the application code."
msgstr ""
#. (itstool) path: section/p
@@ -4667,18 +6038,21 @@ msgstr ""
#. (itstool) path: section/p
#: C/main-contexts.page:468
msgid ""
-"Always write things asynchronously internally (using <link xref=\"#gtask"
-"\"><code>GTask</code></link> where appropriate), and keep synchronous "
-"wrappers at the very top level of an API, where they can be implemented by "
-"calling <code>g_main_context_iteration()</code> on a specific "
-"<code>GMainContext</code>. Again, this makes future refactoring easier. This "
-"is demonstrated in the above example: the thread uses "
-"<code>g_output_stream_write_async()</code> rather than "
-"<code>g_output_stream_write()</code>."
+"<link xref=\"async-programming\">Write things asynchronously</link> "
+"internally (using <link xref=\"#gtask\"><code>GTask</code></link> where "
+"appropriate), and keep synchronous wrappers at the very top level of an API, "
+"where they can be implemented by calling <code>g_main_context_iteration()</"
+"code> on a specific <code>GMainContext</code>. Again, this makes future "
+"refactoring easier. This is demonstrated in the above example: the thread "
+"uses <code>g_output_stream_write_async()</code> rather than "
+"<code>g_output_stream_write()</code>. A worker thread may be used instead, "
+"and this can simplify the callback chain for long series of asynchronous "
+"calls; but at the cost of increased complexity in verifying the code is race-"
+"free."
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:479
+#: C/main-contexts.page:483
msgid ""
"Always match pushes and pops of the thread-default main context: "
"<code>g_main_context_push_thread_default()</code> and "
@@ -4686,26 +6060,26 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/main-contexts.page:487
+#: C/main-contexts.page:491
msgid "Ensuring Functions are Called in the Right Context"
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:489
+#: C/main-contexts.page:493
msgid ""
"The ‘right context’ is the thread-default main context of the <em>thread the "
"function should be executing in</em>. This assumes the typical case that "
"every thread has a <em>single</em> main context running in a main loop. A "
-"main context effectively provides a work or <link href=\"http://en.wikipedia."
-"org/wiki/Message_queue\">message queue</link> for the thread — something "
-"which the thread can periodically check to determine if there is work "
-"pending from another thread. Putting a message on this queue – invoking a "
-"function in another main context – will result in it eventually being "
+"main context effectively provides a work or <link href=\"https://en."
+"wikipedia.org/wiki/Message_queue\">message queue</link> for the thread — "
+"something which the thread can periodically check to determine if there is "
+"work pending from another thread. Putting a message on this queue – invoking "
+"a function in another main context – will result in it eventually being "
"dispatched in that thread."
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:503
+#: C/main-contexts.page:507
msgid ""
"For example, if an application does a long and CPU-intensive computation it "
"should schedule this in a background thread so that UI updates in the main "
@@ -4715,19 +6089,19 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:511
+#: C/main-contexts.page:515
msgid ""
"Furthermore, if the computation function can be limited to a single thread, "
"it becomes easy to eliminate the need for locking a lot of the data it "
"accesses. This assumes that other threads are implemented similarly and "
"hence most data is only accessed by a single thread, with threads "
-"communicating by <link href=\"http://en.wikipedia.org/wiki/Message_passing"
+"communicating by <link href=\"https://en.wikipedia.org/wiki/Message_passing"
"\">message passing</link>. This allows each thread to update its data at its "
"leisure, which significantly simplifies locking."
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:523
+#: C/main-contexts.page:527
msgid ""
"For some functions, there might be no reason to care which context they’re "
"executed in, perhaps because they’re asynchronous and hence do not block the "
@@ -4738,7 +6112,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:533
+#: C/main-contexts.page:537
msgid ""
"For example, the progress callback in <link href=\"https://developer.gnome."
"org/gio/stable/GFile.html#g-file-copy-async\"><code>g_file_copy_async()</"
@@ -4747,12 +6121,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/main-contexts.page:542
+#: C/main-contexts.page:546
msgid "Principles of Invocation"
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:544
+#: C/main-contexts.page:548
msgid ""
"The core principle of invoking a function in a specific context is simple, "
"and is walked through below to explain the concepts. In practice the <link "
@@ -4761,7 +6135,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:551
+#: C/main-contexts.page:555
msgid ""
"A <link href=\"https://developer.gnome.org/glib/stable/glib-The-Main-Event-"
"Loop.html#GSource\"><code>GSource</code></link> has to be added to the "
@@ -4774,7 +6148,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:562
+#: C/main-contexts.page:566
msgid ""
"The <code>GSource</code> will be <link xref=\"#what-is-gmaincontext"
"\">dispatched as soon as it’s ready</link>, calling the function on the "
@@ -4788,7 +6162,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:574
+#: C/main-contexts.page:578
msgid ""
"Data can be passed between threads as the <code>user_data</code> passed to "
"the <code>GSource</code>’s callback. This is set on the source using <link "
@@ -4800,14 +6174,14 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:584
+#: C/main-contexts.page:588
msgid ""
"The example below demonstrates the underlying principles, but there are "
"convenience methods explained below which simplify things."
msgstr ""
#. (itstool) path: example/code
-#: C/main-contexts.page:589
+#: C/main-contexts.page:593
#, no-wrap
msgid ""
"\n"
@@ -5029,7 +6403,7 @@ msgstr ""
"}"
#. (itstool) path: example/p
-#: C/main-contexts.page:698
+#: C/main-contexts.page:702
msgid ""
"This invocation is <em style=\"strong\">uni-directional</em>: it calls "
"<code>my_func()</code> in <code>thread1</code>, but there’s no way to return "
@@ -5039,11 +6413,11 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:706
+#: C/main-contexts.page:710
msgid ""
"To maintain thread safety, data which is potentially accessed by multiple "
"threads must make those accesses mutually exclusive using a <link href="
-"\"http://en.wikipedia.org/wiki/Mutual_exclusion\">mutex</link>. Data "
+"\"https://en.wikipedia.org/wiki/Mutual_exclusion\">mutex</link>. Data "
"potentially accessed by multiple threads: <code>thread1_main_context</code>, "
"passed in the fork call to <code>thread1_main</code>; and <code>some_object</"
"code>, a reference to which is passed in the data closure. Critically, GLib "
@@ -5053,7 +6427,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:720
+#: C/main-contexts.page:724
msgid ""
"Note that <code>some_string</code> and <code>some_int</code> cannot be "
"accessed from both threads, because <em>copies</em> of them are passed to "
@@ -5064,7 +6438,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:729
+#: C/main-contexts.page:733
msgid ""
"Similarly, a reference to <code>some_object</code> is transferred to "
"<code>thread1</code>, which works around the issue of synchronizing "
@@ -5072,7 +6446,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:735
+#: C/main-contexts.page:739
msgid ""
"<code>g_idle_source_new()</code> is used rather than the simpler "
"<code>g_idle_add()</code> so the <code>GMainContext</code> to attach to can "
@@ -5080,12 +6454,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/main-contexts.page:744
+#: C/main-contexts.page:748
msgid "Convenience Method: <code>g_main_context_invoke_full()</code>"
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:748
+#: C/main-contexts.page:752
msgid ""
"This is simplified greatly by the convenience method, <link href=\"https://"
"developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-main-context-"
@@ -5097,7 +6471,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:757
+#: C/main-contexts.page:761
msgid ""
"<code>g_main_context_invoke()</code> can be used instead if the user data "
"does not need to be freed by a <code>GDestroyNotify</code> callback after "
@@ -5105,14 +6479,14 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:764
+#: C/main-contexts.page:768
msgid ""
"Modifying the earlier example, the <code>invoke_my_func()</code> function "
"can be replaced by the following:"
msgstr ""
#. (itstool) path: example/code
-#: C/main-contexts.page:769
+#: C/main-contexts.page:773
#, no-wrap
msgid ""
"\n"
@@ -5162,7 +6536,7 @@ msgstr ""
"}"
#. (itstool) path: example/p
-#: C/main-contexts.page:792
+#: C/main-contexts.page:796
msgid ""
"Consider what happens if <code>invoke_my_func()</code> were called from "
"<code>thread1</code>, rather than from the main thread. With the original "
@@ -5177,7 +6551,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:806
+#: C/main-contexts.page:810
msgid ""
"This subtle behavior difference doesn’t matter in most cases, but is worth "
"bearing in mind since it can affect blocking behavior "
@@ -5186,19 +6560,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/main-contexts.page:818
+#: C/main-contexts.page:822
msgid "Checking Threading"
msgstr "Comprobar los hilos"
#. (itstool) path: section/p
-#: C/main-contexts.page:820
+#: C/main-contexts.page:824
msgid ""
"It is useful to document which thread each function should be called in, in "
"the form of an assertion:"
msgstr ""
#. (itstool) path: section/code
-#: C/main-contexts.page:824
+#: C/main-contexts.page:828
#, no-wrap
msgid ""
"\n"
@@ -5208,17 +6582,17 @@ msgstr ""
"g_assert (g_main_context_is_owner (expected_main_context));"
#. (itstool) path: section/p
-#: C/main-contexts.page:827
+#: C/main-contexts.page:831
msgid ""
"If that’s put at the top of each function, any assertion failure will "
"highlight a case where a function has been called from the wrong thread. It "
"is much easier to write these assertions when initially developing code, "
-"rather than debuging race conditions which can easily result from a function "
-"being called in the wrong thread."
+"rather than debugging race conditions which can easily result from a "
+"function being called in the wrong thread."
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:835
+#: C/main-contexts.page:839
msgid ""
"This technique can also be applied to signal emissions and callbacks, "
"improving type safety as well as asserting the right context is used. Note "
@@ -5228,12 +6602,12 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:844
+#: C/main-contexts.page:848
msgid "For example, instead of using the following when emitting a signal:"
msgstr ""
#. (itstool) path: example/code
-#: C/main-contexts.page:847
+#: C/main-contexts.page:851
#, no-wrap
msgid ""
"\n"
@@ -5253,12 +6627,12 @@ msgstr ""
" param1, param2, &retval);"
#. (itstool) path: example/p
-#: C/main-contexts.page:855
+#: C/main-contexts.page:859
msgid "The following can be used:"
msgstr "Se puede usar lo siguiente:"
#. (itstool) path: example/code
-#: C/main-contexts.page:858
+#: C/main-contexts.page:862
#, no-wrap
msgid ""
"\n"
@@ -5294,12 +6668,12 @@ msgstr ""
"}"
#. (itstool) path: section/title
-#: C/main-contexts.page:877
+#: C/main-contexts.page:881
msgid "<code>GTask</code>"
msgstr "<code>GTask</code>"
#. (itstool) path: section/p
-#: C/main-contexts.page:879
+#: C/main-contexts.page:883
msgid ""
"<link href=\"https://developer.gnome.org/gio/stable/GTask.html"
"\"><code>GTask</code></link> provides a slightly different approach to "
@@ -5309,7 +6683,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/main-contexts.page:886
+#: C/main-contexts.page:890
msgid ""
"<code>GTask</code> takes a data closure and a function to execute, and "
"provides ways to return the result from this function. It handles everything "
@@ -5318,7 +6692,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/p
-#: C/main-contexts.page:894
+#: C/main-contexts.page:898
msgid ""
"By combining <link xref=\"#g-main-context-invoke-full"
"\"><code>g_main_context_invoke_full()</code></link> and <code>GTask</code>, "
@@ -5327,7 +6701,7 @@ msgid ""
msgstr ""
#. (itstool) path: example/code
-#: C/main-contexts.page:900
+#: C/main-contexts.page:904
#, no-wrap
msgid ""
"\n"
@@ -7967,10 +9341,10 @@ msgid ""
"When writing projects using GLib, the default approach should be to <em "
"style=\"strong\">never use threads</em>. Instead, make proper use of the "
"<link xref=\"main-contexts\">GLib main context</link> which, through the use "
-"of asynchronous operations, allows most blocking I/O operations to continue "
-"in the background while the main context continues to process other events. "
-"Analysis, review and debugging of threaded code becomes very hard, very "
-"quickly."
+"of <link xref=\"async-programming\">asynchronous operations</link>, allows "
+"most blocking I/O operations to continue in the background while the main "
+"context continues to process other events. Analysis, review and debugging of "
+"threaded code becomes very hard, very quickly."
msgstr ""
#. (itstool) path: section/p
@@ -8484,6 +9858,20 @@ msgstr ""
#. (itstool) path: section/p
#: C/tooling.page:121
+#, fuzzy
+#| msgid ""
+#| "<code>AX_COMPILER_FLAGS</code> enables a consistent set of compiler "
+#| "warnings, and also tests that the compiler supports each flag before "
+#| "enabling it. This accounts for differences in the set of flags supported "
+#| "by GCC and Clang. To use it, add <code>AX_COMPILER_FLAGS</code> to "
+#| "<file>configure.ac</file>. If you are using in-tree copies of autoconf-"
+#| "archive macros, copy <link href=\"http://git.savannah.gnu.org/gitweb/?"
+#| "p=autoconf-archive.git;a=blob_plain;f=m4/ax_compiler_flags.m4\"> "
+#| "<file>ax_compiler_flags.m4</file></link> to the <file>m4/</file> "
+#| "directory of your project. Note that it depends on the following autoconf-"
+#| "archive macros which are GPL-licenced so potentially cannot be copied in-"
+#| "tree. They may have to remain in autoconf-archive, with that as a build "
+#| "time dependency of the project:"
msgid ""
"<code>AX_COMPILER_FLAGS</code> enables a consistent set of compiler "
"warnings, and also tests that the compiler supports each flag before "
@@ -8494,7 +9882,7 @@ msgid ""
"p=autoconf-archive.git;a=blob_plain;f=m4/ax_compiler_flags.m4\"> "
"<file>ax_compiler_flags.m4</file></link> to the <file>m4/</file> directory "
"of your project. Note that it depends on the following autoconf-archive "
-"macros which are GPL-licenced so potentially cannot be copied in-tree. They "
+"macros which are GPL-licensed so potentially cannot be copied in-tree. They "
"may have to remain in autoconf-archive, with that as a build time dependency "
"of the project:"
msgstr ""
@@ -8661,24 +10049,33 @@ msgstr "Añada <code>AX_VALGRIND_CHECK</code> a <file>configure.ac</file>."
#. (itstool) path: item/p
#: C/tooling.page:233
+#, fuzzy
+#| msgid ""
+#| "Add <code>@VALGRIND_CHECK_RULES</code> to the top-level <file>Makefile."
+#| "am</file>."
msgid ""
-"Add <code>@VALGRIND_CHECK_RULES</code> to the top-level <file>Makefile.am</"
-"file>."
+"Add <code>@VALGRIND_CHECK_RULES@</code> to the <file>Makefile.am</file> in "
+"each directory which contains unit tests."
msgstr ""
"Añada <code>@VALGRIND_CHECK_RULES</code> al nivel superior de <file>Makefile."
"am</file>."
#. (itstool) path: section/p
#: C/tooling.page:239
+#, fuzzy
+#| msgid ""
+#| "When <cmd>make check-valgrind</cmd> is run, it will save its results in "
+#| "<file>test-suite-*.log</file>, one log file per tool."
msgid ""
"When <cmd>make check-valgrind</cmd> is run, it will save its results in "
-"<file>test-suite-*.log</file>, one log file per tool."
+"<file>test-suite-*.log</file>, one log file per tool. Note that you will "
+"need to run it from the directory containing the unit tests."
msgstr ""
"Cuando se ejecuta <cmd>make check-valgrind</cmd> guardad los resultados en "
"<file>test-suite-*.log</file>, un archivo de registro por herramienta."
#. (itstool) path: section/p
-#: C/tooling.page:250
+#: C/tooling.page:251
msgid ""
"Valgrind has a way to suppress false positives, by using <link href=\"http://"
"valgrind.org/docs/manual/manual-core.html#manual-core.suppress\"> "
@@ -8692,13 +10089,13 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:263
+#: C/tooling.page:264
msgid ""
"Suppression files are supported by the <code>AX_VALGRIND_CHECK</code> macro:"
msgstr ""
#. (itstool) path: section/code
-#: C/tooling.page:267
+#: C/tooling.page:268
#, no-wrap
msgid ""
"@VALGRIND_CHECK_RULES@\n"
@@ -8710,12 +10107,12 @@ msgstr ""
"EXTRA_DIST = $(VALGRIND_SUPPRESSIONS_FILES)"
#. (itstool) path: section/title
-#: C/tooling.page:272
+#: C/tooling.page:273
msgid "memcheck"
msgstr "memcheck"
#. (itstool) path: section/p
-#: C/tooling.page:274
+#: C/tooling.page:275
msgid ""
"memcheck is a memory usage and allocation analyzer. It detects problems with "
"memory accesses and modifications of the heap (allocations and frees). It is "
@@ -8728,12 +10125,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:285
+#: C/tooling.page:286
msgid "To run memcheck manually on an installed program, use:"
msgstr "Para ejecutar memcheck manualmente en un programa instalado, use:"
#. (itstool) path: section/p
-#: C/tooling.page:288
+#: C/tooling.page:289
msgid ""
"<cmd>valgrind --tool=memcheck --leak-check=full <var>my-program-name</var></"
"cmd>"
@@ -8742,14 +10139,14 @@ msgstr ""
"var></cmd>"
#. (itstool) path: section/p
-#: C/tooling.page:292
+#: C/tooling.page:293
msgid ""
"Or, if running your program from the source directory, use the following to "
"avoid running leak checking on the libtool helper scripts:"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:296
+#: C/tooling.page:297
msgid ""
"<cmd>libtool exec valgrind --tool=memcheck --leak-check=full <var>./my-"
"program-name</var></cmd>"
@@ -8758,7 +10155,7 @@ msgstr ""
"del-programa</var></cmd>"
#. (itstool) path: section/p
-#: C/tooling.page:300
+#: C/tooling.page:301
msgid ""
"Valgrind lists each memory problem it detects, along with a short backtrace "
"(if you’ve compiled your program with debug symbols), allowing the cause of "
@@ -8766,19 +10163,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:306
+#: C/tooling.page:307
msgid ""
"A full tutorial on using memcheck is <link href=\"http://valgrind.org/docs/"
"manual/mc-manual.html\">here</link>."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:313
+#: C/tooling.page:314
msgid "cachegrind and KCacheGrind"
msgstr "cachegrind y KCacheGrind"
#. (itstool) path: section/p
-#: C/tooling.page:315
+#: C/tooling.page:316
msgid ""
"cachegrind is a cache performance profiler which can also measure "
"instruction execution, and hence is very useful for profiling general "
@@ -8789,7 +10186,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:325
+#: C/tooling.page:326
msgid ""
"cachegrind works by simulating the processor’s memory hierarchy, so there "
"are situations where it is <link href=\"http://valgrind.org/docs/manual/cg-"
@@ -8799,19 +10196,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:334
+#: C/tooling.page:335
msgid ""
"A full tutorial on using cachegrind is <link href=\"http://valgrind.org/docs/"
"manual/cg-manual.html\">here</link>."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:341
+#: C/tooling.page:342
msgid "helgrind and drd"
msgstr "helgrind y drd"
#. (itstool) path: section/p
-#: C/tooling.page:343
+#: C/tooling.page:344
msgid ""
"helgrind and drd are threading error detectors, checking for race conditions "
"in memory accesses, and abuses of the <link href=\"http://pubs.opengroup.org/"
@@ -8821,7 +10218,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:351
+#: C/tooling.page:352
msgid ""
"The kinds of errors detected by helgrind and drd are: data accessed from "
"multiple threads without consistent locking, changes in lock acquisition "
@@ -8833,7 +10230,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:361
+#: C/tooling.page:362
msgid ""
"helgrind and drd can produce more false positives than memcheck or "
"cachegrind, so their output should be studied a little more carefully. "
@@ -8842,7 +10239,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:368
+#: C/tooling.page:369
msgid ""
"Full tutorials on using helgrind and drd are <link href=\"http://valgrind."
"org/docs/manual/hg-manual.html\">here</link> and <link href=\"http://"
@@ -8850,12 +10247,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:377
+#: C/tooling.page:378
msgid "sgcheck"
msgstr "sgcheck"
#. (itstool) path: section/p
-#: C/tooling.page:379
+#: C/tooling.page:380
msgid ""
"sgcheck is an array bounds checker, which detects accesses to arrays which "
"have overstepped the length of the array. However, it is a very young tool, "
@@ -8864,26 +10261,26 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:386
+#: C/tooling.page:387
msgid ""
"As it is experimental, sgcheck must be run by passing <cmd>--tool=exp-"
"sgcheck</cmd> to Valgrind, rather than <cmd>--tool=sgcheck</cmd>."
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:392
+#: C/tooling.page:393
msgid ""
"A full tutorial on using sgcheck is <link href=\"http://valgrind.org/docs/"
"manual/sg-manual.html\">here</link>."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:400
+#: C/tooling.page:401
msgid "gcov and lcov"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:402
+#: C/tooling.page:403
msgid ""
"<link href=\"https://gcc.gnu.org/onlinedocs/gcc/Gcov.html\">gcov</link> is a "
"profiling tool built into GCC, which instruments code by adding extra "
@@ -8895,7 +10292,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:412
+#: C/tooling.page:413
msgid ""
"A critical use for this code coverage data collection is when running the "
"unit tests: if the amount of code covered (for example, which particular "
@@ -8908,16 +10305,16 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:423
+#: C/tooling.page:424
msgid ""
-"lcov supports <link href=\"http://en.wikipedia.org/wiki/"
+"lcov supports <link href=\"https://en.wikipedia.org/wiki/"
"Code_coverage#Basic_coverage_criteria\"> branch coverage measurement</link>, "
"so is not suitable for demonstrating coverage of safety critical code. It is "
"perfectly suitable for non-safety critical code."
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:431
+#: C/tooling.page:432
msgid ""
"As code coverage has to be enabled at both compile time and run time, a "
"macro is provided to make things simpler. The <link href=\"http://www.gnu."
@@ -8928,12 +10325,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:441
+#: C/tooling.page:442
msgid "To add <code>AX_CODE_COVERAGE</code> support to a project:"
msgstr "Para añadir soporte de <code>AX_CODE_COVERAGE</code> a un proyecto:"
#. (itstool) path: item/p
-#: C/tooling.page:445
+#: C/tooling.page:446
msgid ""
"Copy <link href=\"http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;"
"a=blob_plain;f=m4/ax_code_coverage.m4\"> <file>ax_code_coverage.m4</file></"
@@ -8944,12 +10341,12 @@ msgstr ""
"file></link> al a carpeta <file>m4/</file> de su proyecto."
#. (itstool) path: item/p
-#: C/tooling.page:451
+#: C/tooling.page:452
msgid "Add <code>AX_CODE_COVERAGE</code> to <file>configure.ac</file>."
msgstr "Añada <code>AX_CODE_COVERAGE</code> a <file>configure.ac</file>."
#. (itstool) path: item/p
-#: C/tooling.page:454
+#: C/tooling.page:455
msgid ""
"Add <code>@CODE_COVERAGE_RULES</code> to the top-level <file>Makefile.am</"
"file>."
@@ -8958,7 +10355,7 @@ msgstr ""
"am</file>."
#. (itstool) path: item/p
-#: C/tooling.page:458
+#: C/tooling.page:459
msgid ""
"Add <code>$(CODE_COVERAGE_CFLAGS)</code> to the automake <code><var>*</"
"var>_CFLAGS</code> variable for each target you want coverage for, for "
@@ -8967,19 +10364,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:467
+#: C/tooling.page:468
msgid ""
"Documentation on using gcov and lcov is <link href=\"http://ltp.sourceforge."
"net/coverage/lcov.php\">here</link>."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:474
+#: C/tooling.page:475
msgid "Address, Thread and Undefined Behavior Sanitizers"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:476
+#: C/tooling.page:477
msgid ""
"GCC and Clang both support several sanitizers: sets of extra code and checks "
"which can be optionally compiled in to an application and used to flag "
@@ -8991,19 +10388,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:486
+#: C/tooling.page:487
msgid ""
"All sanitizers are available for both GCC and Clang, accepting the same set "
"of compiler options."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:499
+#: C/tooling.page:500
msgid "Address Sanitizer"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:501
+#: C/tooling.page:502
msgid ""
"The <link href=\"https://code.google.com/p/address-sanitizer/\">address "
"sanitizer</link> (‘asan’) detects use-after-free and buffer overflow bugs in "
@@ -9013,12 +10410,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:511
+#: C/tooling.page:512
msgid "Thread Sanitizer"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:513
+#: C/tooling.page:514
msgid ""
"The <link href=\"https://code.google.com/p/thread-sanitizer/\">thread "
"sanitizer</link> (‘tsan’) detects data races on memory locations, plus a "
@@ -9028,12 +10425,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:524
+#: C/tooling.page:525
msgid "Undefined Behavior Sanitizer"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:526
+#: C/tooling.page:527
msgid ""
"The undefined behavior sanitizer (‘ubsan’) is a collection of smaller "
"instrumentations which detect various potentially undefined behaviors in C "
@@ -9043,12 +10440,12 @@ msgid ""
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:537
+#: C/tooling.page:538
msgid "Coverity"
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:539
+#: C/tooling.page:540
msgid ""
"<link href=\"http://scan.coverity.com/\">Coverity</link> is one of the most "
"popular and biggest commercial static analyzer tools available. However, it "
@@ -9063,7 +10460,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:552
+#: C/tooling.page:553
msgid ""
"As Coverity cannot be run entirely locally, it cannot be integrated properly "
"into the build system. However, scripts do exist to automatically scan a "
@@ -9077,19 +10474,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:565
+#: C/tooling.page:566
msgid ""
"Coverity is good, but it is not perfect, and it does produce a number of "
"false positives. These should be marked as ignored in the online interface."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:573
+#: C/tooling.page:574
msgid "Clang Static Analyzer"
msgstr "Analizador estático Clang"
#. (itstool) path: section/p
-#: C/tooling.page:575
+#: C/tooling.page:576
msgid ""
"One tool which can be used to perform static analysis locally is the <link "
"href=\"http://clang-analyzer.llvm.org/\">Clang static analyzer</link>, which "
@@ -9100,7 +10497,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:584
+#: C/tooling.page:585
msgid ""
"Clang produces some false positives, and there is no easy way to ignore "
"them. The recommended thing to do is to <link href=\"http://clang-analyzer."
@@ -9109,19 +10506,19 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:592
+#: C/tooling.page:593
msgid ""
"A full tutorial on using Clang is <link href=\"http://clang-analyzer.llvm."
"org/scan-build.html\">here</link>."
msgstr ""
#. (itstool) path: section/title
-#: C/tooling.page:598
+#: C/tooling.page:599
msgid "Tartan"
msgstr "Tartan"
#. (itstool) path: section/p
-#: C/tooling.page:600
+#: C/tooling.page:601
msgid ""
"However, for all the power of the Clang static analyzer, it cannot detect "
"problems with specific libraries, such as GLib. This is a problem if a "
@@ -9133,7 +10530,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:611
+#: C/tooling.page:612
msgid ""
"Tartan is still young software, and will produce false positives and may "
"crash when run on some code. However, it can find legitimate bugs quite "
@@ -9144,7 +10541,7 @@ msgid ""
msgstr ""
#. (itstool) path: section/p
-#: C/tooling.page:620
+#: C/tooling.page:621
msgid ""
"A full tutorial on enabling Tartan for use with the Clang static analyzer is "
"<link href=\"http://people.collabora.com/~pwith/tartan/#usage-standalone\"> "
@@ -9428,7 +10825,7 @@ msgstr "Generación de pruebas"
#: C/unit-testing.page:195
msgid ""
"Certain types of code are quite repetitive, and require a lot of unit tests "
-"to gain good coverage; but are appropriate for <link href=\"http://en."
+"to gain good coverage; but are appropriate for <link href=\"https://en."
"wikipedia.org/wiki/Test_data_generation\">test data generation</link>, where "
"a tool is used to automatically generate test vectors for the code. This can "
"drastically reduce the time needed for writing unit tests, for code in these "
@@ -9542,15 +10939,25 @@ msgstr ""
#. (itstool) path: item/p
#: C/unit-testing.page:282
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://c2.com/cgi/wiki?SoftwareDesignForTesting\">Software "
+#| "design for testing</link>"
msgid ""
-"<link href=\"http://en.wikipedia.org/wiki/Software_testability\">Software "
+"<link href=\"https://en.wikipedia.org/wiki/Software_testability\">Software "
"testability</link>"
msgstr ""
+"<link href=\"http://c2.com/cgi/wiki?SoftwareDesignForTesting\">Diseño de "
+"software para pruebas</link>"
#. (itstool) path: item/p
#: C/unit-testing.page:286
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://en.wikipedia.org/wiki/Dependency_injection"
+#| "\">Dependency injection</link>"
msgid ""
-"<link href=\"http://en.wikipedia.org/wiki/Dependency_injection\">Dependency "
+"<link href=\"https://en.wikipedia.org/wiki/Dependency_injection\">Dependency "
"injection</link>"
msgstr ""
"<link href=\"http://en.wikipedia.org/wiki/Dependency_injection\">Inyección "
@@ -9601,7 +11008,7 @@ msgid ""
"reports or specifications. (<link xref=\"#guidelines-for-making-commits\"/>)"
msgstr ""
"Incluya un razonamiento completo en los mensajes de commit, así como enlaces "
-"a los informes de error o a la especificaciones. (Consulte la <link xref="
+"a los informes de error o a la especificaciones. (Consulte la sección <link xref="
"\"#guidelines-for-making-commits\"/>)"
#. (itstool) path: item/p
@@ -9611,7 +11018,7 @@ msgid ""
"\"#guidelines-for-making-commits\"/>)"
msgstr ""
"Haga los cambios grandes, como los renombrados, en commits separados. "
-"(Consulte la <link xref=\"#guidelines-for-making-commits\"/>)"
+"(Consulte la sección <link xref=\"#guidelines-for-making-commits\"/>)"
#. (itstool) path: item/p
#: C/version-control.page:47
@@ -9972,9 +11379,9 @@ msgid ""
msgstr ""
"Un buen resumen del versionado libtool, y las diferencias con el versionado "
"del paquete, se da en el <link href=\"https://autotools.io/libtool/version."
-"html\">cazador de mitos de Autotools</link>; otro está en el <link "
-"href=\"http://www.gnu.org/s/libtool/manual/html_node/Updating-version-info."
-"html\">manual de libtool</link>."
+"html\">cazador de mitos de Autotools</link>; otro está en el <link href="
+"\"http://www.gnu.org/s/libtool/manual/html_node/Updating-version-info.html"
+"\">manual de libtool</link>."
#. (itstool) path: section/p
#: C/versioning.page:121
@@ -10430,8 +11837,13 @@ msgstr ""
#. (itstool) path: item/p
#: C/writing-good-code.page:137
+#, fuzzy
+#| msgid ""
+#| "<link href=\"http://en.wikipedia.org/wiki/Design_Patterns\"> Design "
+#| "Patterns: Elements of Reusable Object-Oriented Software </link>, by Erich "
+#| "Gamma, Richard Helm, Ralph Johnson and John Vlissides."
msgid ""
-"<link href=\"http://en.wikipedia.org/wiki/Design_Patterns\"> Design "
+"<link href=\"https://en.wikipedia.org/wiki/Design_Patterns\"> Design "
"Patterns: Elements of Reusable Object-Oriented Software </link>, by Erich "
"Gamma, Richard Helm, Ralph Johnson and John Vlissides."
msgstr ""
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]