The following has evaluated to null or missing: ==> FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale ) [in template "252001#252047#252845" at line 128, column 37] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: dMTJsonObject = FrontendService.media... [in template "252001#252047#252845" at line 128, column 21] ----
1<#-- used @ Veranstaltung-Detailseite Intro
2 used @ Publikation-Detailseite Intro
3-->
4
5<#--
6Web content templates to display teaser on thema detail page
7
8Generic template for detail pages Intro / Teaser element
9-->
10<#--
11Display the current page title
12-->
13<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
14<#include "${fullTemplatesPath}/macros/debugging.ftl" />
15
16<#include "${fullTemplatesPath}/macros/page-modules/PMIntro.ftl" />
17<#include "${fullTemplatesPath}/macros/atomic-modules/AMPublicationCarousel.ftl" />
18<#include "${fullTemplatesPath}/macros/atomic-modules/AMMetadata.ftl" />
19<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
20
21
22<#--
23 renders the Intro for nearly all Pages
24 TODO: remove Share? (was in the designs, but not anymore?)
25 TODO: check if languageSelect/filter are working (js)
26
27 - portletId
28 - data = {
29 "media": string (src from image),
30 "category": string,
31 "title": string,
32 "author": string,
33 "subheadline": string,
34 "copy": string,
35 "filter": {
36 "id": string,
37 "name": string,
38 "entries": Array<Object> ({key:value}),
39 },
40 "languageSelect": {
41 "id": string,
42 "name": string,
43 "entries": Array<Object> ({key:value}),
44 },
45 "meta": {
46 "pos"; string (top/bottom)
47 "date": string,
48 "hash": string,
49 "info": string, (url)
50 },
51 "share" : {
52 "login": string,
53 "print": string,
54 "mail": string,
55 "multishare": string?? (tbd)
56 }
57 - AMMetadata: macro
58 - position: String ("top") -> defines wether the meta-data should be rendered above or below the intro-content
59 }
60-->
61
62<#assign
63 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
64
65 ServiceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
66 DLAPP = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
67
68 themeDisplay = ServiceContext.getThemeDisplay()
69 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
70
71 languageId = themeDisplay.getLocale()
72 groupId = themeDisplay.getScopeGroupId()
73 currentUrl = themeDisplay.getURLCurrent()
74
75 layout = themeDisplay.getLayout()
76 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
77/>
78
79<#setting locale="${languageId}">
80
81<#-- get article from url -->
82
83<#assign entry = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
84
85
86<#if entry?has_content>
87
88 <#if entry.resourcePrimKey??>
89 <#assign primaryKey = entry.resourcePrimKey?number >
90 <#elseif entry.classPK??>
91 <#assign primaryKey = entry.classPK?number >
92 </#if>
93
94 <#assign
95 jsonString = FrontendService.article.getWebcontent(primaryKey)
96 json = FrontendService.json.parseAsJson(jsonString)
97 availablelanguages = FrontendService.article.getAssetEntryToUrl(primaryKey).getAvailableLanguageIds()
98
99 title = entry.getTitle(languageId)
100 data = {
101 "title": title
102 }
103 />
104 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
105
106 <#if hasContent('untertitel', languageId, json)>
107 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
108 </#if>
109
110 <#if hasContent('beschreibung', languageId, json)>
111 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
112 </#if>
113
114 <#-- fill meta data -->
115 <#assign meta = {} />
116
117 <#-- PUBLIKATIONEN DETAIL -->
118 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
119
120 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
121 <#assign
122 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
123 />
124
125 <#if coverBildString?has_content>
126 <#assign
127 coverBild = FrontendService.json.parseAsJson(coverBildString)
128 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
129 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
130 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
131 />
132 <#if dMTJsonObject.altText?? >
133 <#assign data = data + {"alt" : dMTJsonObject.altText} />
134 </#if>
135 <#if dMTJsonObject.quelle??>
136 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
137 </#if>
138 </#if>
139 <#-- uncomment to display pdf cover as Intro Image
140 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
141 <#assign
142 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
143 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
144 <#if fileEntry?has_content>
145 <#assign
146 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
147 data = data + { "media": linkToThumbnail }
148 />
149 </#if>
150 -->
151 </#if>
152
153 <#assign
154 meta = meta + { "orderInfo": "true" }
155 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
156 />
157
158
159
160 <#if hasContent('erscheinungsdatum', languageId, json)>
161 <#assign
162 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
163 />
164 <#if erscheinungsdatum?has_content >
165 <#assign
166 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
167 meta = meta + { "date": erscheinungsdatumFormatted }
168 />
169 </#if>
170 </#if>
171
172 <#if verbundJournalArticle?has_content>
173 <#assign
174 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
175 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
176 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
177 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
178 />
179 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
180 <#assign meta = meta + { "laufendenummer": laufendenummer } >
181
182 <#if coverImg?has_content && coverImg.url?has_content >
183 <#assign meta = meta + { "coverImg": coverImg.url } >
184 </#if>
185 </#if>
186
187
188 <#if meta?has_content>
189 <#assign data = data + {"meta": meta } >
190 </#if>
191
192 </#if>
193 <#-- PUBLIKATIONEN DETAIL END -->
194
195
196 <#-- VERANSTALTUNGEN DETAIL -->
197 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
198 <#assign
199 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
200 links = []
201 />
202 <#if availablelanguages?has_content && friendlyUrl?has_content>
203 <#if (availablelanguages?size > 1) >
204 <#list availablelanguages as language>
205 <#assign
206 defaultLanguage = "de_DE"
207 defaultLocale = FrontendService.language.getLocaleByKey(defaultLanguage)
208 linkLocale = (FrontendService.language.getLocaleByKey(language))!defaultLocale
209 langFriendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, linkLocale, groupId)
210
211 link = {
212 "key": language!defaultLanguage,
213 "value": linkLocale.getDisplayLanguage(languageId),
214 "url": "/c/portal/update_language?p_l_id=" +
215 layout.plid + "&redirect=" + langFriendlyUrl +
216 "&languageId=" + language
217 }
218 />
219 <#if language == languageId>
220 <#assign link = link + { "selected": "true" } >
221 </#if>
222 <#assign links = links + [link]>
223 </#list>
224 <#assign
225 data = data + {
226 "languageSelect": {
227 "id": "languageSelectRedirect",
228 "name": "languageselectRedirect",
229 "entries": links,
230 "label": languageUtil.get(languageId, "diese.veranstaltung.ist.in.weiteren.sprachen.verfuegbar")
231 }
232 }
233 />
234 </#if>
235 </#if>
236 </#if>
237
238 <#if hasContent('erscheinungsdatum', languageId, json)>
239 <#assign
240 startdate = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
241 meta = meta + { "start": startdate?date.iso, "end": "" }
242 />
243 </#if>
244
245 <#if hasContent('startdatum', languageId, json)>
246 <#assign
247 startdate = getValueForLanguage('startdatum', languageId, json, "first")
248 meta = meta + { "start": startdate?date.iso, "end": "" }
249 />
250 </#if>
251
252 <#if hasValue('einfuehrungText', locale, json)>
253 <#assign data = data + { "einfuehrungText" : getValueForLanguage('einfuehrungText', locale, json, "first") } >
254 <#elseif hasValue(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first")>
255 <#assign data = data + { "einfuehrungText" : getValueForLanguage(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first") } >
256 </#if>
257
258 <#if hasContent('endedatum', languageId, json)>
259 <#assign
260 enddate = getValueForLanguage('endedatum', languageId, json, "first")
261 meta = meta + { "end": enddate?date.iso }
262 />
263 </#if>
264
265 <#if hasContent('startzeit', languageId, json)>
266 <#assign
267 startzeit = getValueForLanguage('startzeit', languageId, json, "first")
268 />
269 <#if startzeit?has_content >
270 <#assign meta = meta + { "startzeit": startzeit } />
271 </#if>
272 </#if>
273
274 <#if hasContent('endezeit', languageId, json)>
275 <#assign
276 endezeit = getValueForLanguage('endezeit', languageId, json, "first")
277 meta = meta + { "endezeit": endezeit }
278 />
279 </#if>
280
281 <#if hasContent('ortWCSKASDEORT', languageId, json)>
282 <#assign
283 ortWCSKASDEORT = FrontendService.json.parseAsJson(getValueForLanguage('ortWCSKASDEORT', languageId, json, "first"))
284 ortWCSKASDEORTPrimaryKey = ortWCSKASDEORT.classPK?number
285 ortWCSKASDEORTWebContent = FrontendService.article.getWebcontentByPk(ortWCSKASDEORTPrimaryKey)!""
286 />
287 <#if ortWCSKASDEORTWebContent?has_content >
288 <#assign
289 ortWCSKASDEORTTitle = ortWCSKASDEORTWebContent.getTitle(languageId)!""
290 />
291 <#if ortWCSKASDEORTTitle?has_content >
292 <#assign
293 meta = meta + { "ortWCSKASDEORT": ortWCSKASDEORTTitle }
294 />
295 </#if>
296 </#if>
297 </#if>
298
299
300 <#if hasContent('veranstaltungsnummer', languageId, json)>
301 <#assign
302 verauuid = getValueForLanguage('veranstaltungsnummer', languageId, json, "first")
303 meta = meta + { "verauuid": verauuid }
304 />
305 </#if>
306
307
308 <#if (data.meta)?has_content >
309 <#assign meta = data.meta />
310 </#if>
311
312 <#if !(data.media)?has_content && hasContent('mediumDMTKASDEMEDIUM', languageId, json)>
313 <#assign
314 medium = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, json, "first")
315 mediaData = getRelatedMediaObject(medium, themeDisplay, languageId, FrontendService, "hd-resolution")
316 />
317 <#assign data = data + { "media": mediaData.url , "meta" : mediaData.meta} >
318
319
320 <#if mediaData.meta?? && mediaData.meta.quelle??>
321 <#assign meta = meta + data.meta + { "quelle": mediaData.meta.quelle } />
322 </#if>
323 </#if>
324
325
326 <#if meta?has_content>
327 <#assign data = data + {"meta": meta } >
328 </#if>
329
330 <#-- END fill meta data -->
331
332 <#if hasContentForSequence('autorenWCSKASDEPERSON', languageId, json)>
333 <#assign
334 journalArticles = getValueForLanguageAnsprechpartner('autorenWCSKASDEPERSON', languageId, json)
335 authors = []
336 />
337 <#list journalArticles as articleString>
338 <#assign article = FrontendService.json.parseAsJson(articleString) />
339 <#if article?has_content && article?is_hash && article.classPK??>
340 <#assign articleDereferenced = FrontendService.person.resolveContactInstanceToPerson(article, languageId)!"" />
341 <#if articleDereferenced?has_content >
342 <#assign
343 author = ""
344 articlePrimaryKey = articleDereferenced.classPK?number
345 articleJsonString = FrontendService.article.getWebcontent(articlePrimaryKey)
346 articleJson = FrontendService.json.parseAsJson(articleJsonString)
347 />
348 <@debugJsonString articleJsonString "ADT_KASDE_DYNAMIC_INTRO-autorenWCSKASDEPERSON" />
349 <#if hasValue('anredetitel', languageId, articleJson)>
350 <#assign author = author + getValueForLanguage('anredetitel', languageId, articleJson, " ") + " ">
351 </#if>
352 <#if hasValue('vorname', languageId, articleJson)>
353 <#assign author = author + getValueForLanguage('vorname', languageId, articleJson, " ") + " ">
354 </#if>
355 <#if hasValue('nachname', languageId, articleJson)>
356 <#assign author = author + getValueForLanguage('nachname', languageId, articleJson, " ") + " ">
357 </#if>
358
359 <#attempt>
360 <#assign href = FrontendService.article.getFriendlyUrl(articlePrimaryKey, languageId, groupId)!"#" >
361 <#recover>
362 <#assign href = "#" >
363 </#attempt>
364 <#if href?has_content && href != "#" && href != "/_404">
365 <#assign author = '<a href="' + href + '">' + author?trim + '</a>'>
366 </#if>
367
368 <#assign authors = authors + [author?trim]>
369 </#if>
370 </#if>
371 </#list>
372 <#if authors?has_content>
373 <#assign data = data + { "author": authors?join(", ") } >
374 </#if>
375 </#if>
376
377 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL") >
378 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "VERANSTALTUNGSTYP")! >
379 <#if categories?has_content && categories[0]?has_content >
380 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
381 </#if>
382
383 <#if hasContent('ausgebucht', languageId, json)>
384 <#assign data = data + { "ausgebucht" : getValueForLanguage('ausgebucht', languageId, json, "first") }>
385 </#if>
386
387 <#if hasContent('storniert', languageId, json)>
388 <#assign data = data + { "storniert" : getValueForLanguage('storniert', languageId, json, "first") }>
389 </#if>
390
391 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL") >
392 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "PUBLIKATIONSREIHE")! >
393 <#if categories?has_content && categories[0]?has_content >
394 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
395 </#if>
396 <#else>
397 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "THEMA")! >
398 <#if categories?has_content && categories[0]?has_content >
399 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
400 </#if>
401 </#if>
402
403
404 <#assign
405 languages = []
406 />
407
408 <#attempt>
409 <#if json["document_pdfDMTBASICDOCUMENT"]?? >
410 <#if availablelanguages?has_content>
411 <#list availablelanguages as pdf_language>
412 <#assign
413 docRefJson = getValueForLanguage('document_pdfDMTBASICDOCUMENT', pdf_language, json, "first")
414 docRef = FrontendService.json.parseAsJson(docRefJson)
415 />
416 <#if docRef?is_hash && pdf_language != languageId >
417 <#assign
418 lang = FrontendService.language.getLocaleByKey(pdf_language)!""
419 docGroupId = docRef["groupId"]?number
420 docUuid = docRef["uuid"]
421 dMTJsonObject = FrontendService.media.getDMTJsonObject( docGroupId, docUuid, locale )
422 dMTLink = FrontendService.media.getLinkToDMT( dMTJsonObject )
423 />
424 <#if lang?has_content>
425 <#assign
426 languages = languages + [
427 {
428 "key": pdf_language,
429 "value": FrontendService.language.getLocaleByKey(pdf_language).getDisplayLanguage(),
430 "url": dMTLink
431 }]
432 />
433 </#if>
434 </#if>
435 </#list>
436 </#if>
437 </#if>
438 <#recover>
439 </#attempt>
440
441 <#if (languages?size > 0)>
442 <#attempt>
443 <#assign
444 data = data + { "languageSelect": {
445 "id": "languageSelect",
446 "name": "languageselect",
447 "entries": languages,
448 "documents": "",
449 "button": "true"
450 }}
451 />
452 <#recover>
453 </#attempt>
454 </#if>
455
456 <@PMIntro "ADT_KASDE_DYNAMIC_INTRO" data AMMetadata AMDatetime "bottom" />
457 ${FrontendService.article.getEditArticleHtml(primaryKey, themeDisplay)}
458
459 <#if data.meta?has_content>
460 <#if data.meta.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
461 <div>
462 <div id="publicationVerbundPagination">
463 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
464 </div>
465 </div>
466 </#if>
467 </#if>
468
469<#elseif (editmode?? && editmode)>
470 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
471</#if>
The US Vice President’s trip to Southeast Asia should be interpreted as a sign of resolve and a commitment to Washington’s long-term involvement in the region. What’s more, it intends to diplomatically reinforce the strategic focus of the Indo-Pacific as well as imbuing President Joe Biden’s mantra “America is back”, with concrete initiatives. Besides reassuring the partners of the US, the trip served at least to the same degree as a foreign policy signal to the geopolitical competitor in Beijing. The rapid political, economic, and military rise of the People’s Republic of China and its increasingly expansive presence does not make itself more acutely felt than in this region of the world.
The fact that Kamala Harris’ trip between 25 and 26 August 2021 now took her, along with Singapore, to Vietnam, which is ruled by the Communist Party, illustrates the strategic importance that Washington now affords to its one-time rival in Hanoi.
Leaving the Past Behind, Looking to the Future
Unlike the first destination in Singapore, dramatic events at Kabul airport, which evoked many a memory in the West, did not play a role in Hanoi. Reports from international media attempting to create historic parallels were also blocked by government censorship in Vietnam using firewalls. The pictures from Kabul neither evoked insecurity (nor even malicious joy). The US’ decision to withdraw from Afghanistan is interpreted by Vietnam as a conscious decision to enable a stronger focus and expansion of American involvement in the Indo-Pacific.
The reality that Vietnam and the United States were once wartime enemies during the Cold War was only of minor importance during Harris’ visit to Hanoi. Hence, the US Vice President visited a memorial at the location where the late US Senator and presidential candidate John McCain was shot down in his fighter aircraft in 1967. In addition to this, a pledge was made for financial resources and projects for detecting and removing explosive remnants of war (UXO) from the Vietnam war, as well as for supporting people with disabilities owing to unexploded bombs and environmental toxins.
Vietnam as an Important Partner of the US in a Geopolitically Signifcant Region
Present and future bilateral relations as well as deeper cooperation based on shared strategic interests were the focus of the visit, however.
From the US American perspective, Vietnam now represents an even more important strategic component of its Indo-Pacific strategy than its traditional allies of the Philippines and Thailand or populous Indonesia. The relationship with the one-party state is not a partnership of values, but rather a cooperation based on Realpolitik calculations and an alignment of interests. This close relationship between both states is primarily due to the rise of China.
Besides Singapore, Vietnam was the only country in Southeast Asia to be explicitly mentioned in the “Interim National Security Strategy Guidance” (INSSG); the first foreign policy strategy document of the Biden Administration and published in March 2021. Even though classic visiting diplomacy is used to gauge relations, especially during times of a global pandemic, the importance of Vietnam for the pursuit of Washington’s foreign policy interests in the Indo-Pacific region is becoming clear. Even under the Trump Administration, in October and November of last year the US Secretary of State Mike Pompeo and the National Security Advisor Robert O´Brien had paid visits to Hanoi, while in July 2021 the Secretary of Defence Llody Austin was the first cabinet minister of the Biden Administration to visit Vietnam. And finally, Kamala Harris as the first US Vice President to visit Vietnam.
Some political observers had expressed the assumption – or hope – that Harris’ visit could lead to an upgrade of the partnership between the US and Vietnam. These expectations were only partially fulfilled. Harris had arrived with the mission of further deepening the existing “comprehensive partnership” between Vietnam and the US; as well as renewing the offer of a semantic upgrade to a “strategic partnership”.
According to Substance Already a Strategic Relationship
Vietnam maintains “strategic partnerships” with more than a dozen states – including with Germany since October 2011. Hanoi has formally taken the partnership to the highest level with three of those states: In 2012, the “strategic partnership” that has existed with Moscow since 2001 was upgraded to a “comprehensive strategic partnership”; in 2016, the partnership existing with New Delhi since 2007 was also upgraded. However, Beijing remains primus inter pares; it is connected to Vietnam through a “comprehensive, strategic, cooperative partnership” (2009). There can be no doubt about the strong political, economic, military, and historical reasons underpinning these particularly close relations with the three aforementioned partners.
However, the United States, which is Vietnam’s most important export partner and the second most significant trading partner after China, is officially still only connected to Vietnam through a “comprehensive partnership”.
Hence, for more than a decade Washington has endeavoured to elevate relations with their former rival, also regarding language used, to a strategic level. This has succeeded according to substance, too. The painful past, ideological differences and criticism levelled against the domestic policy situation in Vietnam did not prove to be obstacles here.
As early as 2010, the former US Secretary of State Hillary Clinton had offered Vietnam a “strategic partnership”. And it was in 2013 that the “comprehensive partnership” was finally announced. From that point onwards, relations gained momentum: Twenty years after establishing diplomatic relations, Nguyễn Phú Trọng was received at the White House as the first General Secretary of the Communist Party of Vietnam (CPV). The following year witnessed a return visit by President Barack Obama to Hanoi, during which the lifting of the US arms embargo was agreed. In 2017, a patrol vessel (cutter) of the United States Coast Guard was presented to Vietnam for the first time, and the following year, the USS Carl Vinson was the first American aircraft carrier to enter harbour in Da Nang for a port call; it was at this port city where the first US marines landed in 1965.
Over the past few years, relations have continually and substantially developed in many other relevant areas, too. Therefore, the US has long since risen to become Vietnam’s second most important partner. When it comes to issues of maritime security and the South China Sea (in Vietnam: Biển Đông, translated: East Sea), Washington is in fact the most important partner, given that they feel increasingly challenged by their heavyweight neighbour to the North. A commitment to the rules-based international order is the key link connecting American-Vietnamese strategic relationships.
Semantic Consideration
A semantic upgrading of the “comprehensive partnership” to a “strategic partnership” also failed to come to fruition during the most recent visit of the US Vice President Kamala Harris. The state media in Vietnam deliberately avoided the adjective “strategic” as far as possible, however emphasis was placed on the meaning and importance of the relations. Thus, State President Nguyễn Xuân Phúc described the United States as “a leading and important partner in foreign policy” and the central organ of the CPV on the occasion of Harris’ visit. The propaganda newspaper “The People” (Nhân Dân), wrote the same on 25 August:
“Vietnam invariably considers the United States to be one of the leading important partners and would like to continue to promote relations between Vietnam and the US, so that these relations substantially and effectively develop into a deep, long-term stability, and contribute towards building and strengthening trust, thereby creating a foundation for active exchange between both sides, and to reinforce and improve the efficiency of cooperation in future.”
At the same time, bolder tones were stuck at the lower media level. For instance, on 24 August VietNamNet (a news site under the control of the Ministry for Information and Communication) and Vietnam Investment Review (edited by the Ministry for Planning and Investments) published an interview with the former Vietnamese Ambassador to Washington, Phạm Quang Vinh, in which the necessity of upgrading the relationship semantically was expressed. Ambassador Vinh pointed out that the partnership is already both “comprehensive and strategic”.
In a press conference on 26 August with selected journalists, a question was authorised from the party’s youth newspaper, Tuổi Trẻ, to Vice President Harris, which explicitly enquired about the prospect of a “strategic partnership”. Harris responded with diplomacy, aware of Vietnamese sensitivities, and spoke of “understanding” as the basis for relations and a “strategic strengthening” of bilateral ties.
The fact that Hanoi does not (yet) promote a formal upgrading of the partnership with the United States is due to a consideration for sensitivities of the heavyweight neighbour in the North. There is no desire to unnecessarily anger China under any circumstances, especially as relations, also in the South China Sea, do not seem very stable at present. Likewise, the discussion of a “strategic partnership” in secondary media illustrates that this option will definitely be on the table in future if relations were to deteriorate and Beijing crosses a red line. They are showing how Hanoi also has other irons in the fire. President Phúc – also on behalf of General Secretary Trọng – extended an invitation to US President Biden to Vietnam during Harris’ visit.
Cornerstones of Vietnam’s Foreign Policy
Already at the outset of Harris’ arrival, a spokesperson for the Vietnamese government had indicated the constants of Vietnamese foreign policy, and made it clear that a semantic upgrading of Vietnamese-US relations is not to be expected at this time:
“Vietnam pursues a consistent foreign policy of independence, autonomy, multilateralism and diversification; to facilitate the deepening, efficiency, and sustainability of relations with partner countries, especially key partners. Vietnam does not ally with one country against another.”
However, that there is certainly room for manoeuvre regarding the constants, is proven by Vietnam’s Defence White Paper which was published in late 2019. This paper corroborated the “four nos”: No military alliances at the expense of third parties; no foreign military bases in Vietnam; and no force or threat of force in international relations. While at the same time it explicitly indicated that defence policy relations should be reinforced in order to enhance capacities for defending sovereignty and for resolving joint security challenges. The recipients are also likely to have understood this reference.
A significant departure from the cornerstones of its foreign policy would be risky for Vietnam, however, especially since there has (so far) been too little pressure to adapt.
The diversification and balancing of its relationship have proven a good strategy to date. It is less due to a Taoist aspiration of harmony, than to the geostrategic situation (and vulnerability), which is why a diversification of foreign relations is pursued, while maintaining good and, above all, well-balanced partnerships with all regions and superpowers. Hanoi is not ready for a unilateral shift towards the US, particularly in geopolitical competition between authoritarianism and democracy, as US President Biden characterised as a conflict of systems. So far, they have wanted to avoid choosing sides.
Outcomes of Harris’ Visit
Even if the visit of the US Vice President Kamala Harris in Hanoi does not result in upgrading the “comprehensive” partnership in to a “strategic one”, the recent agreements contribute towards a further substantial deepening of strategic relations between the US and Vietnam.
According to the current needs and priorities of Vietnam, which was strongly impacted by the COVID-19 pandemic in the course of the spread of the Delta variant, Harris’ visit is connected with the American announcement to supply over one million vaccine doses of the German-American vaccine BioNTech-Pfizer, in addition to the five million Moderna vaccine doses already provided through the COVAX international vaccine alliance. Much publicity surrounded Harris’ receipt of a partial delivery of vaccines and its presentation to the Vietnamese partners during her stay. In doing so, the US are spearheading vaccination diplomacy in Vietnam. That did not go unnoticed in Beijing either and thus shortly before the arrival of Harris the Chinese Ambassador pledged the delivery of two million Chinese vaccine doses at a meeting with the Vietnamese head of government, Prime Minister Phạm Minh Chính.
Besides supplying vaccines, Harris also pledged to increase financial aid for combating the pandemic in Vietnam. The opening of the Southeast Asian regional office of the U.S. Centers for Disease Control and Prevention (CDC) in Hanoi, also reinforced a long-term commitment to Vietnam and the region. Likewise, it was the signing of a 99-year lease agreement for a US embassy building to be newly erected, as well as – following 17 years of tough negotiations – the establishment of the Peace Corps, that strengthened the symbolism of America’s stronger, sustainable commitment to Vietnam. Further agreements were entered into during her visit with the aim of combating global climate change and its ramifications, as well as on the resilience of supply chains.
However, the statements on cooperation in maritime security are likely to attract the greatest interest: They made a joint commitment to high-level security cooperation, agreed to further port visits by American warships – including aircraft carriers – and announced, subject to US Congress approval, the supply of a (third) patrol vessel (cutter) for the Vietnamese Coast Guard.
The fact that bilateral relations between the United States and the one-party state do not represent a partnership of values, but instead are based on Realpolitik and an alignment of interests, became clear with Harris’ meeting with civil society representatives of Vietnam. Unlike during the visit by Barack Obama, which also included a meeting with activists for freedom of the press and expression, they did not want to risk any resentment by subjecting the domestic policy situation to various appraisals. Thus, selected civil society interlocutors are involved with less sensitive areas such as LGBTQ or advocate for the needs of disabled persons.
The fact that the US has imposed a certain self-restraint on the topic of civil society in Vietnam, demonstrates how characterising geopolitical competition as a values-based conflict of systems in Vietnam (and Southeast Asia on the whole), is only partially applicable. The strategic relations between Hanoi and Washington will decisively shape the geopolitical dynamic in South-East Asia beyond semantic issues over the coming years.